本专题用于记录作为一个安全人员必备的一些知识点,内容包括linux/unix基本操作命令。路由交换配置等信息。
在平时的电信协议和业务的研究过程中,标准看的非常多。在查阅3GPP相关标准时会对其浩瀚的文档结构及编号产生恐惧感。本章将为您讲述如何去查找3GPP文档以及如何读懂其特有的文档编号。
3GPP的全称是3rd Generation Partnership Project,中文翻译为第三代合作伙伴计划。它是领先的3G技术规范机构,是由欧洲的ETSI,日本的ARIB和TTC,韩国的TTA以及美国的T1在1998年底发起成立的,旨在研究制定并推广基于演进的GSM核心网络的3G标准,即WCDMA,TD-SCDMA,EDGE等。中国无线通信标准组(CWTS)于1999年加入3GPP。3GPP的目标是实现由2G网络到3G网络的平滑过渡,保证未来技术的后向兼容性,支持轻松建网及系统间的漫游和兼容性。
3GPP最初的工作范围是为第三代移动系统制定全球适用技术规范和技术报告。第三代移动系统基于的是发展的GSM核心网络和他们所支持的无线接入技术。随后3GPP的工作范围得到了改进,包括为移动通信(GSM)技术规范和技术报告包括发展的无线接入技术(包括GPRS和EDGE)维护和制定全球系统。
3GPP由项目协调组(PCG)和技术规范组(TSGs)组成,如需要,各技术规范组可建立工作组。如下图示为3GPP的组织结构图:

关于3GPP组织更多的信息您可以访问http://www.3gpp.org/About/about.htm
我们在查阅3GPP文档时,在文档的最上方都会见到类似于3GPP TS 23.140 V6.15.0 (2008-03)这样的字符串,他们有什么特别的意思吗?
我们首先要理解,3GPP的文档分为TR和TS两种,分别对应Technical Reports(技术报告)和Technical Specification(技术规范)。
其次,3GPP的文档针对不同的领域分为了不同的系列(series),下表对这些系列对应的领域进行了划分:
Subject of specification series |
3G/GSM R99 and later |
GSM only (Rel-4 and later) |
GSM only (before Rel-4) |
| General information (long defunct) | 00 series | ||
| Requirements | 21 series | 41 series | 01 series |
| Service aspects ("stage 1") | 22 series | 42 series | 02 series |
| Technical realization ("stage 2") | 23 series | 43 series | 03 series |
| Signalling protocols ("stage 3") - user equipment to network | 24 series | 44 series | 04 series |
| Radio aspects | 25 series | 45 series | 05 series |
| CODECs | 26 series | 46 series | 06 series |
| Data | 27 series | 47 series (none exists) | 07 series |
| Signalling protocols ("stage 3") -(RSS-CN) | 28 series | 48 series | 08 series |
| Signalling protocols ("stage 3") - intra-fixed-network | 29 series | 49 series | 09 series |
| Programme management | 30 series | 50 series | 10 series |
| Subscriber Identity Module (SIM / USIM), IC Cards. Test specs. | 31 series | 51 series | 11 series |
| OAM&P and Charging | 32 series | 52 series | 12 series |
| Access requirements and test specifications | 13 series (1) | 13 series (1) | |
| Security aspects | 33 series | (2) | (2) |
| UE and (U)SIM test specifications | 34 series | (2) | 11 series |
| Security algorithms (3) | 35 series | 55 series | (4) |
| Evolved UTRA aspects | 36 series | - | - |
|
Note (1): The 13 series GSM specifications relate to European-Union-specific regulatory standards. On the closure of ETSI TC SMG, responsibility for these specifications was transferred to ETSI TC MSG, (Mobile Specification Group) and they do not appear on the 3GPP file server. Note (2): The specifications of these aspects are spread throughout several series. Note (3): Algorithms may be subject to export licensing conditions. See the relevant 3GPP page. See also the relevant ETSI pages. Note (4): The original GSM algorithms are not published and are controlled by the GSM Association. |
|||
可以看到,我们举例的23.140其实对应23系列,也就是针对3G/GSM R99以后的Technical realization ("stage 2")。从上表也可以看出,文档中有Stage 1,2,3之分。Stage 1规范了从服务使用者的角度阐述的一个服务;Stage 2规范描述了对需要解决的问题的逻辑分析;Stage 3就是技术实现。
在大的版本后面又有小编号,就是示例中的140,我们进入到http://www.3gpp.org/ftp/Specs/html-info/23-series.htm看到文中有一个大表格,纤细的列出了不同的小编号对应的功能描述。140对应的就是"Multimedia Messaging Service (MMS); Functional description; Stage 2”。
后面的V6.15.0表示修改的版本号。
在Delphi Complier中的Other Options标签页下的Use these packages when compling输入框中输入DesignIde
检查<USER_DIR>\AppData\Roaming\Borland\BDS\5.0\EnvOptions.proj文件中的路径表示,不能带有双引号。
在src目录中加入{Program Files}\CodeGear\RAD Studio\5.0\source\ToolsAPI;重新编译即可。
CB是个好东西,使用了这么久,其实也有很多知识需要沉淀先来的……
| 指令 | 描述 | 示例代码 | 参考 |
| file | 文件 | ||
| defgroup | 分组、模块 | ||
| addgroup | 加入组、模块。实际上与defgroup好像没有区别。 | ||
| ingroup | 指明上一级模块 | ||
| param | 参数 | ||
| return | 函数返回值 | ||
| retval | 函数返回值,与上一个区别在于可以指定多个值。 | ||
| mainpage | 自定义主页 | ||
| section | 章节 | ||
| code | 想在说明文字中加入代码说明的话,使用code和endcode包含可以在生成的页面中带有色彩标记。 |
@code |
1.如何让doxygen解析宏定义?
如下一种情况我们可能会遇到。我们制定的是一个DLL库文件,我们通过如下宏定义导出一个函数:
#if defined(NSPR_EXPORTS)
#define NS_DECLARE(type) __declspec(dllexport) type __stdcall
#endif
那么在定义函数时我们可能使用如下语句:
NS_DECLARE(void) func();
这时doxygen默认生成的页面将是一样的文字,这显然不是我们想要的,这时可以在"Expert"->"Preproccessor"标签下选中"MACRO_EXPANSION"即可。
必备工具,有许多技巧需要学习的,这里整理了一些供大家参考:
很多人立即想到使用crack版,可实际追究起来,那是违法的事情。实际上,Ultraedit并没有把路子完全堵死。我们可以使用一些小技巧来屏蔽掉这个问题。修改ultraedit的快捷方式,将命令行改为:E:uedit9UEDIT32.EXE p:,其中p:必须是你的机器上不存在的分驱,这样,就不会有试用时间结束的问题了。
这则技巧是在UltraEdit的帮助文件里提到.CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式";然后用查找 %*你的字符串*^p 替换成空内容即可.如,我当前有个文本文件,需要去掉所有包含 http://www.nosec.org 这个字符串的行,查找 %*http://www.nosec.org/*^p 替换成空即可.注意,^p 是 DOS 文件类型的换行符.如果是 Unix 类型文件,则用 ^n.
参考上面两个例子,查找 ^p$ 然后替换为空即可.
简单,CTRL+g,在弹出的对话框中输入行号即可。
Ctrl+h即可。
好吧,我不得不承认我对Web Service的理解也不多,至于为什么我非得把它做一个专题放在这里是因为它现在是所有电信运营商的基础架构,几乎所有的运营商一提到接口就整个Web Service堵住你。so, 我不得不屈服于这种鄙视,并且打心眼里就认同Web Service是一个很棒的东西。
我估计有很多朋友也跟我一样,很难清晰的描述出它的有点,大都由于客户或者公司规定要这样实现,毕竟它是大势所趋。 如果你很难说服自己接受这样一个模糊的概念的话,那么建议你可以先看看:http://www0.ccidnet.com/tech/guide/2001/11/01/58_3584.html
简而言之就是,它能让异构的产品统一接口化。再总之,咱们记住这样一个概念就好了:如果你还想混下去,那么你一定得知道Web Service。
让你接受这个概念很难, 然而学习Web Service却是一件非常简单的事情,我们根据如下的一些很简单的理解来学习一下:
| 一个典型的SOAP消息报文 |
POST /StockQuote HTTP/1.1 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> |
| 一个典型的WSDL文件内容 |
我们可以查看http://atom.research.microsoft.com/sensordatahub/service.asmx?WSDL |
在WSDL定义中,我们可以按照如下方式去记忆:
傻眼了吧,被黑了吧。如何解决呢?这里给大家列举了一些方法:
日志可是最最重要的一块内容。
| 登录事件 | 描述 | ||
|
528 |
用户已成功登录计算机。有关登录类型的相关信息,请参阅下面的登录类型表。 |
||
|
529 |
登录失败。尝试使用未知用户名或密码无效的已知用户名登录。 |
||
|
530 |
登录失败。用户帐户尝试在允许的登录时间之外登录。 |
||
|
531 |
登录失败。尝试使用禁用的帐户登录。 |
||
|
532 |
登录失败。尝试使用过期的帐户登录。 |
||
|
533 |
登录失败。尝试使用被禁止登录该计算机的用户帐户登录。 |
||
|
534 |
登录失败。用户尝试使用被禁止的登录类型登录。 |
||
|
535 |
登录失败。指定的帐户密码已过期。 |
||
|
536 |
登录失败。未激活网络登录服务。 |
||
|
537 |
登录失败。由于其他原因致使尝试登录失败。 注意
|
||
|
538 |
完成某个用户的注销过程。 |
||
|
539 |
登录失败。尝试登录时已锁定该帐户。 |
||
|
540 |
用户已成功登录到网络。 |
||
|
541 |
主模式 Internet 密钥交换 (IKE) 验证已在本地计算机和列出的对等客户端身份之间完成(建立安全联系),或者快速模式已建立一个数据信道。 |
||
|
542 |
已终止数据信道。 |
||
|
543 |
主模式已终止。 注意
|
||
|
544 |
主模式身份验证失败是由于对等客户端没有提供有效证书,或者是没有经过验证的签名。 |
||
|
545 |
主模式身份验证失败是由于 Kerberos 失败或密码无效。 |
||
|
546 |
由于对等客户端发送无效的建议,因此未能建立 IKE 安全关联。接收到的数据包含有无效数据。 |
||
|
547 |
IKE 握手期间出现故障。 |
||
|
548 |
登录失败。受信任域中的安全 ID (SID) 与客户端的帐户域 SID 不匹配。 |
||
|
549 |
登录失败。在林中进行身份验证期间,所有与不受信任的命名空间相对应的 SID 都被筛选掉。 |
||
|
550 |
指示可能发生的拒绝服务攻击的通知消息。 |
||
|
551 |
用户启动注销过程。 |
||
|
552 |
当用户已经以不同用户身份登录时,可使用显式凭据成功登录到计算机。 |
||
|
682 |
用户已经重新连接到一个断开的终端服务器会话。 |
||
|
683 |
用户在没有注销的情况下与某个终端服务器会话断开连接。 注意
|
记录 528 事件时,同时在事件日志中列出登录类型。下表描述了每种登录类型。
| 登录类型 | 登录标题 | 描述 |
|
2 |
交互 |
用户已登录到该计算机。 |
|
3 |
网络 |
用户或计算机从网络登录到该计算机。 |
|
4 |
批处理 |
批服务器使用批登录类型,对于这种登录类型,服务器代表用户执行登录过程,而无需用户直接参与。 |
|
5 |
服务 |
通过服务控制管理器启动服务。 |
|
7 |
解锁 |
该工作站已解锁。 |
|
8 |
网络明文 |
用户从网络登录到该计算机。用户密码以解哈希运算形式传递到身份验证包中。在通过网络发送包之前,内置的身份验证功能对所有哈希凭据进行打包。这些凭据不以纯文本(也叫明文)方式在网络中传输。 |
|
9 |
新凭据 |
呼叫方克隆当前令牌并指定出站连接的新凭据。新登录会话具有相同的本地标识,但对其他网络连接使用不同的凭据。 |
|
10 |
远程交互式登录 |
用户使用终端服务或远程桌面远程登录该计算机。 |
|
11 |
缓存交互式登录 |
用户使用存储在本地计算机上的网络凭据登录该计算机。无法连接域控制器验证凭据。 |
有关安全事件的详细信息,请参阅 Microsoft Windows 资源工具包网站上的安全事件
| • |
确定通过收集审核事件想要获得的信息类型:
|
||||
| • |
考虑可以用于收集和查看审核日志的资源。审核事件占用您计算机的空间,并且占用您的时间以及您组织中其他人的时间。不要审核您不感兴趣的事件。 |
| • |
如果发生入侵事件,请隔离并保存安全日志项。在调查入侵时这些项非常有用。 |
| • |
一个审核记录可以包含有关更改您的计算机或网络中其他的计算机的信息。如果入侵者获得管理员的权限或者管理员滥用权限,则他们可以清除安全日志,使您没有其操作的任何记录。如果您使用工具定期地收集并保存组织中的安全日志项,则即使入侵者或管理员清除了本地安全日志,您仍然很有可能跟踪入侵者或管理员的操作。“Microsoft 操作管理器”就是这样的一个工具。有关可用的最新工具,请参阅 Microsoft 网站 if(typeof(IsPrinterFriendly) != "undefined") { var l = "http://go.microsoft.com/fwlink/?LinkId=8179"; var nl; var c = l.charAt(0); var o = document.getElementById("EAB"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 上的“Search Microsoft.com”。 |
| • |
通过审核系统事件类别中的成功和失败事件,您可以注意到可能表示入侵者正在尝试获得您的计算机或网络访问权的不一般的活动。 |
| • |
当该设置启用时生成的审核数量会相对较少,而且从事件中获得的信息的质量相对较高。 有关系统事件类别的信息,请参阅审核系统事件 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/a8297bc2-d53a-4a2f-94c5-8e412ae4e3862052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EQB"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关如何在系统事件类别中启用审核的信息,请参阅定义或修改事件类别的审核策略设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d9fea7ea-61e5-43b1-98cd-b02a09f101562052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EXB"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
如果策略更改事件类别中记录了事件,则说明有人已经更改了本地安全机构 (LSA) 安全策略配置。 |
| • |
如果使用组策略编辑审核策略设置,则没有必要审核成员服务器上策略更改事件类别中的事件。 |
| • |
如果您决定审核策略更改事件类别中的失败事件,则可以查阅是否未授权用户或攻击者正在尝试更改策略设置(包括安全策略设置)。尽管这对于检测入侵有所帮助,但是要求增加的资源以及拒绝服务攻击的可能性往往超过其带来的好处。 有关策略更改事件类别的信息,请参阅审核策略更改 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/962f5863-15df-4271-9ae0-4b0412e297492052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EJC"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关如何在策略更改事件类别中启用审核的信息,请参阅定义或修改事件类别的审核策略设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d9fea7ea-61e5-43b1-98cd-b02a09f101562052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EQC"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
通过审核帐户管理事件类别中的成功事件,可以验证对于帐户属性和组属性进行的更改。 |
| • |
如果您决定审核帐户管理事件类别中的失败事件,您可以查阅是否未授权用户或攻击者正试图更改帐户属性或组属性。尽管这对于检测入侵有所帮助,但是要求增加的资源以及拒绝服务攻击的可能性往往超过其带来的好处。 有关帐户管理事件类别的信息,请参阅审核帐户管理 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/42c66475-3346-428f-8faf-47a6611655ee2052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EAD"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关如何在帐户管理事件类别中启用审核的信息,请参阅定义或修改事件类别的审核策略设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d9fea7ea-61e5-43b1-98cd-b02a09f101562052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EHD"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
通过审核登录事件类别中的成功事件,您可以记录每个用户何时登录了计算机或者何时从计算机注销。如果未授权者盗取了用户的密码并登录到计算机,则您可以确定发生违反安全的事件的时间。 |
| • |
如果您决定审核登录事件类别中的失败事件,则您可以查阅未授权用户或攻击者是否正在试图登录到计算机上。尽管这对于检测入侵有所帮助,但是随着对登录事件类别中的失败事件的审核,拒绝服务攻击的可能性也将增加。如果在这些事件类别中启用了失败审核,来自组织外部的用户可以通过使用错误的用户名和密码连续尝试登录到您的网络,以填满安全日志或导致事件被覆盖。如果您还启用了“审核:如果无法记录安全审核则立即关闭系统”策略设置,则在这些类别中记录失败事件的后果可能更严重 -- 如果安全日志被填满,用户可能会导致拒绝服务。 有关如何在登录事件类别中启用审核的信息,请参阅定义或修改事件类别的审核策略设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d9fea7ea-61e5-43b1-98cd-b02a09f101562052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EXD"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
通过审核帐户登录事件类别中的成功事件,您可以看到用户何时登录了域,或者何时从域中注销。 |
| • |
审核成员服务器上帐户登录事件类别中的事件是不必要的。 |
| • |
如果您决定审核帐户登录事件类别中失败事件,则您可以查阅未授权用户或攻击者是否正在试图登录到您的网络上。尽管这对于检测入侵有所帮助,但是随着对帐户登录事件类别中的失败事件的审核,拒绝服务攻击的可能性也将增加。如果在这些事件类别中启用了失败审核,来自组织外部的用户可以通过使用错误的用户名和密码连续尝试登录到您的网络,以填满安全日志或导致事件被覆盖。如果您还启用了“审核:如果无法记录安全审核则立即关闭系统”策略设置,则在这些类别中记录失败事件的后果可能更严重 -- 如果安全日志被填满,用户可能会导致拒绝服务。 有关帐户登录事件类别的信息,请参阅审核帐户登录事件 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d8fc798c-1e77-4043-b59c-971b4961d85a2052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EJE"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关如何在帐户登录事件类别中启用审核的信息,请参阅定义或修改事件类别的审核策略设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d9fea7ea-61e5-43b1-98cd-b02a09f101562052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EQE"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
要审核对象访问,您必须启用“审核对象访问”策略设置,然后编辑与该对象相关联的系统访问控制列表 (SACL)。详细信息,请参阅清单:设置对象访问权限审核 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/e035f443-9c94-48d1-8dda-3bd243ca5f1d2052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("E4E"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
要获得最佳的系统性能,请将对象的 SACL 中的项的数量降到最少。具有 1000 个用户的 SACL 的一个项目降低系统性能的程度比 1000 个独立项目降低系统性能的程度要小。 |
| • |
要降低所生成事件的大小并最大化每个事件的功效,请只审核您感兴趣的操作。例如,如果您对用户读文件感兴趣,请不要审核“完全控制”。 有关对象访问事件类别的信息,请参阅审核对象访问 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/50fdb7bc-7dae-4dcd-8591-382aeff2ea792052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EIF"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关基于操作的审核的信息,请参阅对文件或文件夹的基于操作的审核 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/b8664794-32e5-4f66-b3be-155f3f7379de2052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EPF"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关如何在对象访问事件类别中启用审核的信息,请参阅定义或修改事件类别的审核策略设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/d9fea7ea-61e5-43b1-98cd-b02a09f101562052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EWF"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
| • |
适当地配置安全日志的大小十分重要,这要基于您的审核策略设置生成的事件的数量。 有关管理事件日志的信息,请参阅事件查看器 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/ff176dba-52f7-47c2-a5dd-97f0d374593a2052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("EEG"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 有关事件日志设置的信息,请参阅事件日志的设置 if(typeof(IsPrinterFriendly) != "undefined") { var l = "/WindowsServer/zh-CHS/Library/bb9fa858-a5bb-4769-93f3-65f2fbc04e3c2052.mspx"; var nl; var c = l.charAt(0); var o = document.getElementById("ELG"); switch (c){ case "/": nl=(" [http://" + document.domain + l + "]"); break case "#": nl=(""); break default: nl=" [" + l + "]" } if(o != null) o.innerHTML = nl; } 。 |
如无特殊说明,默认为在Windows Vista + Microsoft Visual Studio 2005环境编译
| 按键 | 功能说明 | |
| a | 在光标后开始插入数据 | |
| A | 在本行后开始插入数据 | |
| i | 在光标前开始插入数据 | |
| I | 在本行起始处开始插入数据 | |
| o | 在本行后插入一行并从插入的行开始编辑数据 | |
| O | 在本行前插入一行并从插入的行开始编辑数据 | |
| x | 删除光标后一个字符 | |
| X | 删除光标前一个字符 | |
| dd | 删除当前光标所在的行 | |
| yy | 复制当前光标所在的行 | |
| p | 粘贴 | |
| cc | 清空整行内容重新编辑,相当于先输入dd,再输入i | |
| u | 撤销操作 | |
| U | 撤销本行所有操作 | |
| 0 | 移至行首,相当于HOME键 | |
| [[ | 光标移至上一个函数段,在编辑代码时特别有用 | |
| ]] | 光标移至下一个函数段 | |
| G | 光标移至文档末尾 | |
| { | 光标移至段首 | |
| } | 光标移至段尾 | |
| CTRL+f | 向下翻页 | |
| CTRL+b | 向前翻页 | |
| CTRL+e | 向下卷一行 | |
| CTRL+y | 向上卷一行 | |
| CTRL+d | 向下卷半页 | |
| CTRL+u | 向上卷半页 | |
| CTRL+g | 查看当前光标位置 | |