﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-nt05的记事本</title><link>http://www.cppblog.com/nt05/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:14:22 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:14:22 GMT</pubDate><ttl>60</ttl><item><title>windows删除用户后创建同名用户的用户文件夹命名规则</title><link>http://www.cppblog.com/nt05/archive/2008/11/24/67728.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Mon, 24 Nov 2008 05:37:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/11/24/67728.html</guid><description><![CDATA[第一次创建 username<br />第二次创建 username.machinename<br />第三次创建 username.machinename000<br />.........<br /><br />使用runas命令带env参数时 创建runas /user的当前用户环境<br />即在注册表hkey_users中插入user的注册表数据<br /><img src ="http://www.cppblog.com/nt05/aggbug/67728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-11-24 13:37 <a href="http://www.cppblog.com/nt05/archive/2008/11/24/67728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是SID</title><link>http://www.cppblog.com/nt05/archive/2008/11/23/67639.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 22 Nov 2008 20:08:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/11/23/67639.html</guid><description><![CDATA[
		<span style="font-size: 10pt;">前言<em></em><br />
SID也就是安全标识符（Security<em></em> Identifiers），是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时，将给网络上的每一个帐户发布一个唯一的<em></em> SID。Windows<em></em> 2000<em></em> 中的内部进程将引用帐户的<em></em> SID<em></em> 而不是帐户的用户或组名。如果创建帐户，再删除帐户，然后使用相同的用户名创建另一个帐户，则新帐户将不具有授权给前一个帐户的权力或权限，原因是该帐户具有不同的<em></em> SID<em></em> 号。安全标识符也被称为安全<em></em> ID<em></em> 或<em></em> SID。<em></em><br /><br />
SID的作用<em></em><br />
用户通过验证后，登陆进程会给用户一个访问令牌，该令牌相当于用户访问系统资源的票证，当用户试图访问系统资源时，将访问令牌提供给<em></em> Windows<em></em> NT，然后<em></em> Windows<em></em> NT<em></em> 检查用户试图访问对象上的访问控制列表。如果用户被允许访问该对象，Windows<em></em> NT将会分配给用户适当的访问权限。<em></em><br />
访问令牌是用户在通过验证的时候有登陆进程所提供的，所以改变用户的权限需要注销后重新登陆，重新获取访问令牌。<em></em><br /><br />
SID号码的组成<em></em><br />
如果存在两个同样SID的用户，这两个帐户将被鉴别为同一个帐户，原理上如果帐户无限制增加的时候，会产生同样的SID，在通常的情况下SID是唯一的，他由计算机名、当前时间、当前用户态线程的CPU耗费时间的总和三个参数决定以保证它的唯一性。<em></em><br /><br />
一个完整的SID包括：<em></em><br />
?<em></em> 用户和组的安全描述<em></em><br />
?<em></em> 48-bit的ID<em></em> authority<em></em><br />
?<em></em> 修订版本<em></em><br />
?<em></em> 可变的验证值Variable<em></em> sub-authority<em></em> values<em></em><br />
例：S-1-5-21-310440588-250036847-580389505-500<em></em><br />
我们来先分析这个重要的SID。第一项S表示该字符串是SID；第二项是SID的版本号，对于2000来说，这个就是1；然后是标志符的颁发机构（identifier<em></em> authority），对于2000内的帐户，颁发机构就是NT，值是5。然后表示一系列的子颁发机构，前面几项是标志域的，最后一个标志着域内的帐户和组。<em></em><br /><br />
SID的获得<em></em><br />
开始－运行－regedt32－HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin\Aliases\Members，找到本地的域的代码，展开后，得到的就是本地帐号的所有SID列表。<em></em><br />
其中很多值都是固定的，比如第一个000001F4（16进制），换算成十进制是500，说明是系统建立的内置管理员帐号administrator，000001F5换算成10进制是501，也就是GUEST帐号了，详细的参照后面的列表。<em></em><br />
这一项默认是system可以完全控制，这也就是为什么要获得这个需要一个System的Cmd的Shell的原因了，当然如果权限足够的话你可以把你要添加的帐号添加进去。<em></em><br />
或者使用Support<em></em> Tools的Reg工具：<em></em><br />
reg<em></em> query<em></em> "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows<em></em> NT\CurrentVersion\ProfileList<em></em><br /><br />
还有一种方法可以获得SID和用户名称的对应关系：<em></em><br />
1.<em></em> Regedt32:<em></em><br />
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows<em></em> NT\CurrentVersion<em></em> \ProfileList<em></em><br />
2.<em></em> 这个时候可以在左侧的窗口看到SID的值，可以在右侧的窗口中ProfileImagePath看到不同的SID关联的用户名，<em></em><br />
比如%SystemDrive%\Documents<em></em> and<em></em> Settings\Administrator.momo这个对应的就是本地机器的管理员SID<em></em><br />
%SystemDrive%\Documents<em></em> and<em></em> Settings\Administrator.domain这个就是对应域的管理员的帐户<em></em><br /><br />
另外微软的ResourceKit里面也提供了工具getsid，sysinternals的工具包里面也有Psgetsid，其实感觉原理都是读取注册表的值罢了，就是省了一些事情。<em></em><br /><br />
SID重复问题的产生<em></em><br />
安装NT／2000系统的时候，产生了一个唯一的SID，但是当你使用类似Ghost的软件克隆机器的时候，就会产生不同的机器使用一个SID的问题。产生了很严重的安全问题。<em></em><br />
同样，如果是重复的SID对于对等网来说也会产生很多安全方面的问题。在对等网中帐号的基础是SID加上一个相关的标识符（RID），如果所有的工作站都拥有一样的SID，每个工作站上产生的第一个帐号都是一样的，这样就对用户本身的文件夹和文件的安全产生了隐患。<em></em><br />
这个时候某个人在自己的NTFS分区建立了共享，并且设置了自己可以访问，但是实际上另外一台机器的SID号码和这个一样的用户此时也是可以访问这个共享的。<em></em><br /><br />
SID重复问题的解决<em></em><br />
下面的几个试验带有高危险性，慎用，我已经付出了惨痛的代价！<em></em><br />
微软在ResourceKit里面提供了一个工具，叫做SYSPREP,这个可以用在克隆一台工作站以前产生一个新的SID号码。<em></em> 下图是他的参数<em></em><br /><br />
这个工具在DC上是不能运行这个命令的，否则会提示<em></em><br /><br /><strong><span style="color: rgb(255, 0, 0);">但是这个工具并不是把所有的帐户完全的产生新的SID，而是针对两个主要的帐户Administrator和Guest，其他的帐号仍然使用原有的SID</span></strong>。<em></em><br /><br />
下面做一个试验，先获得目前帐号的SID：<em></em><br />
S-1-5-21-2000478354-688789844-839522115<em></em><br />
然后运行Sysprep，出现提示窗口：<em></em><br /><br />
确定以后需要重启，然后安装程序需要重新设置计算机名称、管理员口令等，但是登陆的时候还是需要输入原帐号的口令。<em></em><br />
进入2000以后，再次查询SID，得到：<em></em><br />
S-1-5-21-759461550-145307086-515799519，发现SID号已经得到了改变，查询注册表，发现注册表已经全部修改了，当然全部修改了?。<em></em><br /><br />
另外sysinternals公司也提供了类似的工具NTSID，这个到后来才发现是针对NT4的产品，界面如下：<em></em><br /><br />
他可不会提示什么再DC上不能用，接受了就开始，结果导致我的一台DC崩溃，重启后提示“安全账号管理器初始化失败，提供给识别代号颁发机构的值为无效
值，错误状态0XC0000084，请按确定，重启到目录服务还原模式...”，即使切换到目录服务还原模式也再也进不去了！<em></em><br />
想想自己胆子也够大的啊，好在是一台额外DC，但是自己用的机器，导致重装系统半天，重装软件N天?，所以再次提醒大家，做以上试验的时候一定要慎重，最
好在一台无关紧要的机器上试验，否则出现问题我不负责哦?。另外在Ghost的新版企业版本中的控制台已经加入了修改SID的功能，自己还没有尝试，有兴
趣的朋友可以自己试验一下，不过从原理上应该都是一样的。<em></em><br />
文章发表之前，又发现了微软自己提供的一个工具“Riprep”，这个工具主要用做在远程安装的过程中，想要同时安装上应用程序。管理员安装了一个标准的
公司桌面操作系统，并配置好应用软件和一些桌面设置之后，可以使用Riprep从这个标准的公司桌面系统制作一个Image文件。这个Image文件既包
括了客户化的应用软件，又把每个桌面系统必须独占的安全ID、计算机账号等删除了。管理员可以它放到远程安装服务器上，供客户端远程启动进行安装时选用。
但是要注意的是这个工具只能在单硬盘、单分区而且是Professional的机器上面用。<em></em><br /><br /><br />
下面是SID末尾RID值的列表，括号内为16进制：<em></em><br /><br />
Built-In<em></em> Users<em></em><br />
DOMAINNAME\ADMINISTRATOR<em></em><br />
S-1-5-21-917267712-1342860078-1792151419-500<em></em> (=0x1F4)<em></em><br /><br />
DOMAINNAME\GUEST<em></em><br />
S-1-5-21-917267712-1342860078-1792151419-501<em></em> (=0x1F5)<em></em><br />
Built-In<em></em> Global<em></em> Groups<em></em><br />
DOMAINNAME\DOMAIN<em></em> ADMINS<em></em><br />
S-1-5-21-917267712-1342860078-1792151419-512<em></em> (=0x200)<em></em><br /><br />
DOMAINNAME\DOMAIN<em></em> USERS<em></em><br />
S-1-5-21-917267712-1342860078-1792151419-513<em></em> (=0x201)<em></em><br /><br />
DOMAINNAME\DOMAIN<em></em> GUESTS<em></em><br />
S-1-5-21-917267712-1342860078-1792151419-514<em></em> (=0x202)<em></em><br />
Built-In<em></em> Local<em></em> Groups<em></em><br />
BUILTIN\ADMINISTRATORS<em></em> S-1-5-32-544<em></em> (=0x220)<em></em><br />
BUILTIN\USERS<em></em> S-1-5-32-545<em></em> (=0x221)<em></em><br />
BUILTIN\GUESTS<em></em> S-1-5-32-546<em></em> (=0x222)<em></em><br />
BUILTIN\ACCOUNT<em></em> OPERATORS<em></em> S-1-5-32-548<em></em> (=0x224)<em></em><br />
BUILTIN\SERVER<em></em> OPERATORS<em></em> S-1-5-32-549<em></em> (=0x225)<em></em><br />
BUILTIN\PRINT<em></em> OPERATORS<em></em> S-1-5-32-550<em></em> (=0x226)<em></em><br />
BUILTIN\BACKUP<em></em> OPERATORS<em></em> S-1-5-32-551<em></em> (=0x227)<em></em><br />
BUILTIN\REPLICATOR<em></em> S-1-5-32-552<em></em> (=0x228)<em></em><br />
Special<em></em> Groups<em></em><br />
\CREATOR<em></em> OWNER<em></em> S-1-3-0<em></em><br />
\EVERYONE<em></em> S-1-1-0<em></em><br />
NT<em></em> AUTHORITY\NETWORK<em></em> S-1-5-2<em></em><br />
NT<em></em> AUTHORITY\INTERACTIVE<em></em> S-1-5-4<em></em><br />
NT<em></em> AUTHORITY\SYSTEM<em></em> S-1-5-18<em></em><br />
NT<em></em> AUTHORITY\authenticated<em></em> users<em></em> S-1-5-11<em></em> *.(over)</span>
<img src ="http://www.cppblog.com/nt05/aggbug/67639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-11-23 04:08 <a href="http://www.cppblog.com/nt05/archive/2008/11/23/67639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>runas命令详解</title><link>http://www.cppblog.com/nt05/archive/2008/11/23/67638.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 22 Nov 2008 20:08:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/11/23/67638.html</guid><description><![CDATA[RUNAS 用法:<br /><br />RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]<br />        /user:&lt;UserName&gt; program<br /><br />RUNAS [ [/noprofile | /profile] [/env] [/savecred] ]<br />        /smartcard [/user:&lt;UserName&gt;] program<br /><br />RUNAS /trustlevel:&lt;TrustLevel&gt; program<br /><br />   /noprofile        指定不应该加载用户的配置文件。<br />                     这会加速应用程序加载，但<br />                     可能会造成一些应用程序运行不正常。<br />   /profile          指定应该加载用户的配置文件。<br />                     这是默认值。<br />   /env              要使用当前环境，而不是用户的环境。<br />   /netonly          只在指定的凭据限于远程访问的情况下才使用。<br />   /savecred         用用户以前保存的凭据。<br />                     Windows Vista Home 或 Windows Vista Starter 版本上没有这个选项。<br />                     该选项会被忽略。<br />   /smartcard        如果凭据是智能卡提供的，则使用这个选项。<br />   /user             &lt;UserName&gt; 应使用 USER@DOMAIN 或 DOMAIN\USER 形式<br />   /showtrustlevels  显示可以用作 /trustlevel 的参数的<br />                     信任级别。<br />   /trustlevel       &lt;Level&gt; 应该是在 /showtrustlevels 中枚举<br />                     的一个级别。<br />   program           EXE 的命令行。请参阅下面的例子<br /><br />例如:<br />&gt; runas /noprofile /user:mymachine\administrator cmd<br />&gt; runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"<br />&gt; runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""<br /><br />注意:  只在得到提示时才输入用户的密码。<br />注意:  /profile 跟 /netonly 不兼容。<br />注意:  /savecred 跟 /smartcard 不兼容。<br /><br />其中 /trustlevel 在nt6以后分两种权限 0x10000(受限的) 0x20000(基本用户)<br />HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\safer\codeidentifiers下以dword值levels标注 默认的trustlevel权限有一个标准帐户权限(0x20000 被省略)<br />另一种是低于最低权限标准帐户user权限的受限权限(0x10000) 后一种权限基本就是限制运行<br /><img src ="http://www.cppblog.com/nt05/aggbug/67638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-11-23 04:08 <a href="http://www.cppblog.com/nt05/archive/2008/11/23/67638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为应用程序池 'DefaultAppPool' 提供服务的进程意外终止。解决办法</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64396.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64396.html</guid><description><![CDATA[为应用程序池 'DefaultAppPool' 提供服务的进程意外终止。解决办法<br /><div class="cnt"><p>错误日志为：</p><p>为应用程序池 'DefaultAppPool' 提供服务的进程意外终止。进程 ID 是 '3056'。进程退出代码是 '0xffffffff'。</p><p></p><p>有关更多信息，请参阅在 <a href="http://go.microsoft.com/fwlink/events.asp">http://go.microsoft.com/fwlink/events.asp</a> 的帮助和支持中心。<br />
            -----------------------------------</p><p>解决方法，给NETWORK SERVICE 加上访问iis服务的权限，具体方法如下：</p><p>-----------------------------------</p><p>点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项， <br />
            选择其下的“IIS ADMIN SERVICE”，右健选择“属性”，找到“安全”，在“启动和激活权限”中编辑“自定义”，添加帐号“NETWORK SERVICE ”， <br />
            给该帐号赋予“本地启动”和“本地激活”的权限，重新启动IIS（点“开始”-“运行”-“CMD”，点确定，然后运行IISRESET）， <br />
            之后再访问同一站点，则一切正常。</p></div><br /><img src ="http://www.cppblog.com/nt05/aggbug/64396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:59 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>隐藏windows帐户</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64395.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64395.html</guid><description><![CDATA[打开注册表编辑器（开始-&gt;运行-&gt;regedit）  <br />
找到如下项：HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList  <br /><p>在该项中创建一个新的DWORD值，名称即是你想要隐藏的用户名，比如Administrator，而键值（十进制格式）设为0或者1，0即代表在欢迎屏幕上隐藏该用户，1当然就是显示了。  <br />
基本工作就算完成了，但一定注意千万不要搞错，否则你可能再也进不去系统了  <br />
另外一个重要的问题是你应该如何使用隐藏用户登录系统：</p><p>如果你使用Windows XP Professional，那么只需要按CTRL-ALT-DEL两次即可显示标准的登录界面（像Windows 2000那样），但请注意，如果此时系统中已经存在另外一个登录用户，那么该方法不会生效  <br />
如果你使用Windows XP home，则需要启动到安全模式才可以使用隐藏帐号 </p><img src ="http://www.cppblog.com/nt05/aggbug/64395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:55 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是COM COM+</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64394.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64394.html</guid><description><![CDATA[
		<span style="color: rgb(0, 128, 128);">
				<span class="tpc_content">
						<font size="2">什么是COM？ <br />
所谓COM（Componet Object
Model，组件对象模型），是一种说明如何建立可动态互变组件的规范，此规范提供了为保证能够互操作，客户和组件应遵循的一些二进制和网络标准。通过这
种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。 <br />
            COM的优点？ <br />
首先：用户一般希望能够定制所用的应用程序，而组件技术从本质上讲就是可被定制的，因而用户可以用更能满足他们需要的某个组件来替换原来的那个。其次，由
于组件是相对应用程序独立的部件，我们可以在不同的程序中使用同一个组件而不会产生任何问题，软件的可重用性将大大的得到增强。第三，随着网络带宽及其重
要性的提高，分布式网络应用程序毫无疑问的成为软件市场上越来越重要的买点。组件价构可以使得开发这类应用程序的过程得以简化。 <br /><br /><br />
            什么是COM+？ <br />
COM+并不是COM的简单升级，COM+的底层结构仍然以COM为基础，它几乎包容了COM的所有内容，COM+综合了COM、DCOM和MTS这些技
术要素，它把COM组件软件提升到应用层而不再是底层的软件结构，它通过操作系统的各种支持，使组件对象模型建立在应用层上，把所有组件的底层细节留给操
作系统，因此，COM+与操作系统的结合更加紧密。 <br />
COM+不再局限于COM的组件技术，它更加注重于分布式网络应用的设计和实现。COM+继承了COM几乎全部的优势，同时又避免了COM实现方面的一些
不足，把COM、DCOM和MTS的编程模型结合起来，继承了它们的绝大多数特性，在原有的特性上增加了新的功能。 <br /><br /><br />
            COM+的新的优点? <br />
            以下列出COM+的几个主要特性： <br /><br />
            COM+不仅继承了COM所有的优点，而且还增加了一些服务，比如队列服务、负载平衡、内存数据库、事件服务等。 <br /><br />
队列服务对于分布式应用非常有意义，特别是在现在网络速度很慢的情况下，这种机制可以保证应用系统能够可靠地运行。在应用系统包含大量节点但服务器又繁忙
的情况下，客户应用程序可以把它们的请求放到队列中，当服务器负载比较轻的时候再处理这些请求； <br /><br />
又如COM+提供了负载平衡服务，它可以实现动态负载平衡，而且COM+应用程序的负载平衡特性并不需要编写代码来支持，客户程序和组件程序都可以按通常
的方式实现。获得负载平衡特性并不是用程序设计的方式来实现的，而是通过配置实现分布式应用程序的负载平衡，如上所讲的队列服务，其实也反映了一种负载平
衡。 <br /><br />
            (1) 真正的异步通讯。COM+底层提供了队列组件服务，这使客户和组件有可能在不同的时间点上协同工作，COM+应用无须增加代码就可以获得这样的特性。 <br /><br />
            (2) 事件服务。新的事件机制使事件源和事件接收方实现事件功能更加灵活，利用系统服务简化了事件模型，避免了COM可连接对象机制的琐碎细节。 <br /><br />
            (3) 可伸缩性。COM+的可伸缩性来源于多个方面，动态负载平衡以及内存数据库、对象池等系统服务都为COM+的可伸缩性提供了技术基础，COM+的可伸缩性原理上与多层结构的可伸缩特性一致。 <br /><br />
            (4) 可管理和可配置性。管理和配置是应用系统开发完成后的行为，在软件维护成本不断增加的今天，COM+应用将有助于软件厂商和用户减少这方面的投入。 <br /><br />
            (5) 易于开发。COM+应用开发的复杂性和难易程度将决定COM+的成功与否，虽然COM+开发模型比以前的COM组件开发更为简化，但真正提高开发效率仍需要借助于一些优秀的开发工具。 <br /><br />
COM+标志着Microsoft的组件技术达到了一个新的高度，它不再局限于一台机器上的桌面系统，它把目标指向了更为广阔的企业内部网，甚至
Internet国际互连网络。COM+与多层结构模型以及Windows操作系统为企业应用或Web应用提供了一套完整的解决方案。</font>
				</span>
		</span>
<img src ="http://www.cppblog.com/nt05/aggbug/64394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:55 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win2003远程 客户端无法连接到远程计算机。</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64393.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64393.html</guid><description><![CDATA[Windows Server 2003(简称Windows 2003)的远程桌面功能为网管维护系统提供了方便。通常情况下，需要在Windows
2003服务器上才能开启远程桌面功能，这种方法相当麻烦。其实你也可以使用远程修改注册表的方法，在客户端远程开启Windows
2003服务器的远程桌面。 <br />
第一步:远程修改Windows 2003注册表 <br /><br />
在客户机系统中，点击“开始→运行”，在“运行”对话框中输入“regedit”命令，进入注册表编辑器。接着在主菜单栏中点击“文件→连接网络注册表”，弹出“选择计算机”对话框，在“输入要选 <br /><br />
择的对象名称”栏中填入要开启远程桌面功能的Windows 2003服务器的机器名(如SERVER1)最后点击“确定”按钮，打开Windows 2003服务器注册表。 <br /><br />
在注册表编辑器左栏中依次展开“server1\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
\Control\Terminal
Server”项目，然后在右栏中找到“fDenyTSConnections”键(如图)，双击打开后将该键值修改为“0”，点击“确定”按钮，最后关
闭注册表编辑器。 <br /><br />
第二步:远程重启Windows 2003服务器 <br /><br />
我们虽然通过远程修改注册表开启了Windows 2003远程桌面，但这时修改还没有生效，需要重新启动Windows 2003服务器。 <br /><br />
在客户机中，点击“开始→运行”，在“运行”对话框中输入“CMD”命令，进入命令提示符窗口。键入“shutdown -m \\SERVER1 r”命令，重新启动Windows 2003服务器(SERVER1为Windows 2003服务器的机器名)。 <br /><br />
完成了以上两个步骤的设置，就开启了Windows 2003服务器的远程桌面，网络管理员就可以在客户端使用“远程桌面连接”维护Windows 2003服务器了。 <br /><br />
提示:在客户端使用的域用户账号具有远程修改注册表和远程重启Windows 2003服务器的权限，一般域用户无此权限。<img src ="http://www.cppblog.com/nt05/aggbug/64393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:54 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册表开启3389端口方法</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64392.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64392.html</guid><description><![CDATA[echo Windows Registry Editor Version 5.00&gt;&gt;c:\RECYCLER\3389.reg <br />
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]&gt;&gt;c:\RECYCLER3389.reg <br />
echo "fDenyTSConnections"=dword:00000000&gt;&gt;c:\RECYCLER\3389.reg <br />
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]&gt;&gt;c:\RECYCLER\3389.reg <br />
echo "PortNumber"=dword:00000d3d&gt;&gt;c:\RECYCLER\3389.reg <br />
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]&gt;&gt;c:\RECYCLER\3389.reg <br />
echo "PortNumber"=dword:00000d3d&gt;&gt;c:\RECYCLER\3389.reg <br />
regedit /s c:\RECYCLER\3389.reg<img src ="http://www.cppblog.com/nt05/aggbug/64392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:53 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看IWAM_和IUSR_用户的密码 </title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64391.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64391.html</guid><description><![CDATA[位于C:\Inetpub\AdminScripts下有一个Adsutil.vbs脚本<br /><br />打开CMD，进入C:\Inetpub\AdminScripts目录 执行下面的语法：<br /><br />下表列出 Adsutil.vbs 实用工具各种功能的语法：<br /><br />功能语法<br /><br />获取 IUSR 帐户密码<br />cscript.exe adsutil.vbs get w3svc/anonymoususerpass <br /><br />获取 IWAM 帐户密码<br />cscript.exe adsutil.vbs get w3svc/wamuserpass <br /><br />设置 IUSR 帐户密码<br />cscript.exe adsutil.vbs set w3svc/anonymoususerpass "password" <br /><br />设置 IWAM 帐户密码<br />cscript.exe adsutil.vbs set w3svc/wamuserpass "password" <br /><br />　　备注：如果密码不是明文密码，必须修改 Adsutil.vbs，使它显示明码。为此，请按照下列步骤操作： <br />1.         在记事本中打开 Adsutil.vbs。 <br />2.         在"编辑"菜单上，单击查找，键入 IsSecureProperty = True，然后单击查找下一个。<br />3.         将"IsSecureProperty = True"更改为"IsSecureProperty = False"。 <br />4.         保存对 Adsutil.vbs 所做的更改，然后关闭记事本。<img src ="http://www.cppblog.com/nt05/aggbug/64391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:52 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ipv6地址结构</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64390.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64390.html</guid><description><![CDATA[IPv6 地址结构最早在 RFC 1884 [i] 中发表，目前 RFC 1884 已经被 RFC 2373 [ii] 取代，并对 RFC 1884 的内容作了很多澄清、更正和修改。 
                  <p>一、 IPv6 地址的表示形式 </p><p>用文本方式表示的 IPv6 地址有三种规范的形式： <br />
        1 ）优先选用的形式是 X:X:X:X:X:X:X:X ，其中 X 是 8 个 16 位地址段的十六进制值。例如： <br />
        FEDC:BA98:7654:4210:FEDC:BA98:7654:3210 <br />
        2001:0:0:0:0:8:800:201C:417A <br />
        每一组数值前面的 0 可以省略。如 0008 写成 8 。 <br />
2 ）在分配某种形式的 IPv6 地址时，会发生包含长串 0 位的地址。为了简化包含 0 位地址的书写，可以使用 “::” 符号简化多个 0
位的 16 位组。 “::” 符号在一个地址中只能出现一次。该符号也可以用来压缩地址中前部和尾部的 0 。举例如下： <br />
        FF01:0:0:0:0:0:0:101 多点传送地址 <br />
        0:0:0:0:0:0:0:1 回送地址 <br />
        0:0:0:0:0:0:0:0 未指定地址 <br />
        可用下面的压缩形式表示： <br />
        1080::8:800:200C:417A 单点传送地址 <br />
        FF01::101 多点传送地址 <br />
        ::1 回送地址 <br />
        :: 未指定地址 <br />
3 ）在涉及 IPv4 和 IPv6 节点混合的这样一个节点环境的时候，有时需要采用另一种表达方式，即 X:X:X:X:X:X:D.D.D.D
，其中 X 是地址中 6 个高阶 16 位段的十六进制值， D 是地址中 4 个低阶 8 位字段的十进制值（按照 IPv4
标准表示）。例如：下面两种嵌入 IPv4 地址的 IPv6 地址（见本节后面）。 <br />
        0:0:0:0:0:0:202.201.32.29 嵌入 IPv4 地址的 IPv6 地址 0:0:0:0:0:FFFF:202.201.32.30 嵌入 IPv4 地址的 IPv6 地址 <br />
        写成压缩形式为： <br />
        ::202.201.32.29 <br />
        ::FFFF.202.201.32.30 <br />
        上面的表达形式，在实际中经常用到，尤其是压缩简化的形式。 </p><p>二、地址空间 </p><p>IPv4
与 IPv6 地址最大的差别在于长度： IPv4 地址长度是 32 位，而 IPv6 的地址长度是 128 位。这样 IPv6 就可以有
2128 个地址，大约的数目是 1018 个，准确的数字是
[i]340,282,366,920,938,463,374,607,431,768,211,456
。这样的地址长度，即使考虑到以后向其他星球移民也够用了。 <br />
        一个典型的 IPv6 地址由地址中的起始的多位表明，由这些起始报头位组成的可变长度域被称为格式前缀（ Format Prefix ， FP ）。根据这些格式前缀所做的地址分配如图 <br />
        一个典型的 IPv6 地址由地址中的起始的多位表明，由这些起始报头位组成的可变长度域被称为格式前缀（ Format Prefix ， FP ）。根据这些格式前缀所做的地址分配如图 分 配 前缀（二进制） 占地址空间的比例 <br />
保留 未分配 为 NSAP 分配保留 为 IPX 分配保留 未分配 未分配 未分配 可聚集全球单点传送（单播）地址 未分配 未分配 未分配
未分配 未分配 未分配 未分配 未分配 未分配 未分配 链路本地单点传送（单播）地址 站点本地单点传送（单播）地址 组播（多点传送）地址
0000 0000 0000 0001 0000 001 0000 010 0000 0011 0000 1 0001 001 010 011
100 101 110 1110 1111 0 1111 10 1111 110 1111 1110 0 1111 1110 10 1111
1110 11 1111 1111 1/256 1/256 1/128 1/128 1/128 1/32 1/16 1/8 1/8 1/8
1/8 1/8 1/8 1/16 1/32 1/64 1/128 1/512 1/1024 1/1024 1/256 <br />
我们可以看到， IPv6 最初只使用了大约 15
％的地址空间，其余的地址空间留做将来使用。值得注意的是保留地址和未分配地址是不一样的，保留地址占地址空间的 1/256 （ FP ＝ 0000
0000 ），是用做非指定地址、回送地址、和嵌入 IPv4 地址的 IPv6 地址。这几种地址的详情见本节后面以及本文的实验数据部分。 <br />
        其它的保留地址是 NSAP 地址（ FP ＝ 0000 001 ），可以从 ISO/OSI 网络服务访问点 [i] （ Network Service Access Point ， NSAP ）中获得。 <br />
        同样， IPX 地址也保留下来（ FP ＝ 0000 010 ），这些地址可以从 Novell IPX [ii] （见参考文献 19 的 4.6.10 节）地址获得。 <br />
        除了多点传送地址（ FP ＝ 1111 1111 ），格式前缀从 001 到 111 都需要 EUI64 [iii] 格式中具有 64 位的接口标识符。 </p><p>三、地址类型 </p><p>IPv6
中地址有三种类型：单点传送（ Unicast ）、多点传送（ Multicast ）、任意点传送（ Anycast
）。也有文献称之为单播、组播、泛播地址。 IPv6 中不再有象 IPv4 中那样的广播（ broadcast
）地址，它的功能由多点传送地址来实现。 <br />
        l 单点传送地址：一个单接口标识符，送往单点传送地址的包将被传送到该地址所标识的接口上。 <br />
        2 任意点传送地址：一组接口（一般不属于不同节点）的标识符。送往一个任意点传送地址的包将被传送到该地址所标识的接口之一（根据路由协议中的距离的计算方法而确定的 “ 最近 ” 的一个）。 <br />
        3 多点传送地址：一组接口（一般不属于不同节点）的标识符。送往一个多点传送地址的包将被传送到该地址标识的所有接口上。 </p><img src ="http://www.cppblog.com/nt05/aggbug/64390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:50 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nat和路由的区别与联系</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64389.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64389.html</guid><description><![CDATA[  路由和nat都属于计算机网络中的两种技术，他们有一个表面上相同的功能，就是可以实现数据包的不同的网络（两个网络）之间传递。区别我认为是：
<p>     一、本质区别</p><p>         数据包通过路由可以从一个网络到另一个网络，他是通过数据包的目的IP和源IP实现的，当一个数据包进入路由器是，路由器会根据她的目标ip和源ip在路由表中查找，并将数据包原封不动的传向路由器的某个端口。</p><p>         数据包通过nat，nat将会根据规则将数据包中的源ip和目标IP改变，并在NAT机器上做改变记录。</p><p>         简而言之，路由不改变数据包包头信息，NAT则改变；</p><p>     二、表面区别</p><p>         路由打通的两个网段地位是公平的，既都是公网或都是私网，理解起来比较简单，因为路由不改变包头信息，所以如果用路由连接公网和私网的话，目的地址为私网（192.168.1.2）的数据包在公网上找不到归宿。其实路由表里面也没有相关的路由信息。l</p><p>       NAT打通的可以是两个公平的网络，也可以是一个内网和一个外网。。</p><img src ="http://www.cppblog.com/nt05/aggbug/64389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:49 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取消普通用户加入域的权限</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64386.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:33:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64386.html</guid><description><![CDATA[
		<div id="blog_text" class="cnt">
				<p>一般域内建立的用户默认都是Domain Users组里的。发现该组的用户居然可以有加入一台计算机到域内的权限？   那下面的情况如何解决： 一个用户用家里的笔记本接入单位网络，用别人的账户加入到域中，拷贝走域内的一些资料。  <br />
有没有什么方法让所有用户账户不具备让计算机加入域的权限（前提是该账户登录后不影响其本身正常工作，必要的基本的权限还必须具有）。<br />
总结一下：只希望我指定的某几个帐号有加入计算机的权限（比如管理员），其他全部拒绝。</p>
				<p>在DC上面安装Support Tools工具，开始--运行，输入“adsiedit.msc”，在弹出窗口中展开“Domain
[xxxxxx]”，定位到“DC=
xxxxx”，右键选择“属性”，在弹出的属性窗口中找到“ms-DS-MachineAccountQuota”，双击编辑将默认值“10”更改为
“0”（默认情况所有用户都可以将10台计算机加入域），更改之后默认用户就没有权限进行将计算机加入域的操作，不影响域管理员将计算机加入域的操作。<br /><br /><span style="display: none; left: 208px; position: absolute; top: 1562px;"><img src="http://bbs.winos.cn/images/winos1/attachimg.gif" border="0" /></span><img style="cursor: pointer;" src="http://bbs.winos.cn/attachments/month_0802/20080228_bc8b742386e4e967e822k84IBlxxgTYz.jpg" resized="true" border="0" width="537" /></p>
		</div>
<img src ="http://www.cppblog.com/nt05/aggbug/64386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:33 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php get变量</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64385.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64385.html</guid><description><![CDATA[自PHP4.1.0以后将HTTP_GET_VARS使用GET变量来保存，GET的变量主要来自以下的方法

对服务器以获取资料信息为请求方法的例如，URL，使用FORM的METHOD为GET方式。这样所有的请求变量将通过

URL传递给服务器，服务器根据配置调用相关的解释器来处理这些GET出来的变量。

 

  本文针对URL 的GET方式传值进行讨论

  我们都知道URL传值为URL？变量名=变量值

   这个方式进行递交请求例如

  http://www.bbs.bbc.com?page=1

  这样的方法为我们现在所通用

  如果变量多了可以使用'&amp;'符号连接变量

  例如： http://www.bbs.bbc.com?page=1&amp;title=Welcome%20Sports98

  以上方法为浏览器直接将变量转变到相对应的数组中，我们并不需要去过多的了解。下面为我所要讨论的话题


  例如：

    http://www.bbs.bbc.com?page=1,Welcome%20Sports98,Sports98,300


    这个例子说明的是，我们使用','这个符号为变量分隔符号，这里我们可以用两种方法来实现，
一、修改PHP.INI

——
; List of separator(s) used by PHP to parse input URLs into variables.
; Default is "&amp;". 
; NOTE: Every character in this directive is considered as separator!
arg_separator.input = ";，"
————

二、自己编写解释语法

    list($key,$value)=$_GET;  //将GET变量分解出来
    $tmp=explode(",",$value);  //将数据分出

  这个用法的优点在于，别人无法知道您传递的值是被谁使用，您自己需要明白各个值的使用

  ++++++++++++++++++++++++++++++++++++++


  最后针对
    http://www.bbs.bbc.com/index.php?123,123433,234524,34563456,5463,78685,abc,Welcome%20Sports98

  这一类的GET方法的传值，其实方法与方法二相同，需要的是将KEY转换成VALUE进行分解，我觉得这个方法比上一个方法要好

  而且更加方便.
    $value=key($_GET);
    $tmp=explode(",",$value);

  你应该都已经获得到这些数据了。


  以上方法为本人浏览其他站点所看到现象所想到的方法，不知是否正确。对于PHP的默认安装用户都喜欢使用默认的GET传值方式
              <img src ="http://www.cppblog.com/nt05/aggbug/64385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:31 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决ADSL丢包</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64384.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64384.html</guid><description><![CDATA[“HKEY_LOCAL_MACHINE＼System＼CurrenControlSet＼Services＼Tcpip＼Parameters”子
键，在右边键值区中，找到或新建一个名为“GlobalmaxTcp WindowSize”的DWORD键值项，将其数据值数据设为
“256960”(十进制) <br />
原理：通常情况下，TCP/IP默认的数据传输单元接受缓冲区的大小为576字节，要是将这个缓冲区的大小设置得比较大的话，一旦某个TCP/IP分组数
据发生错误时，那么整个数据缓冲区中的所有分组内容，都将被丢失并且进行重新传送；显然不断地重新进行传输，会大大影响ADSL传输数据的效率。为此，设
置合适缓冲区大小，确保ADSL传输数据的效率始终很高，将会对ADSL传输速度有着直接的影响<img src ="http://www.cppblog.com/nt05/aggbug/64384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:24 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动为网络接口设置MTU大小</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64383.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64383.html</guid><description><![CDATA[
		<br />如果手动为某个网络接口设置 MTU 大小，则该设置会覆盖此网络接口的默认 MTU。MTU 大小是可以在底层网络上传输的最大数据包大小（以字节为单位）。 <br /><br />此方法影响发送到所有目标的数据包，并且可能会对性能造成显著影响，这取决于设置的 MTU 大小。 <br /><br />要为网络接口设置 MTU 大小，请按照下列步骤操作：<table class="list ol"><tbody><tr><td class="number">1.</td><td class="text">单击“开始”，单击“运行”，键入 <span class="userInput">regedit</span>，然后单击“确定”。</td></tr><tr><td class="number">2.</td><td class="text">在注册表中找到下面的项： <div class="indent">HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersInterfaces&lt;ID for network interface&gt;</div></td></tr><tr><td class="number">3.</td><td class="text">在“编辑”菜单上，指向“新建”，然后单击“DWORD 值”。</td></tr><tr><td class="number">4.</td><td class="text">键入 <span class="userInput">MTU</span>，然后按 Enter。</td></tr><tr><td class="number">5.</td><td class="text">在“编辑”菜单上，单击“修改”。</td></tr><tr><td class="number">6.</td><td class="text">在“数值数据”框中，键入 MTU 大小的值，然后单击“确定”。</td></tr><tr><td class="number">7.</td><td class="text">退出注册表编辑器，然后重新启动计算机。</td></tr></tbody></table><br /><img src ="http://www.cppblog.com/nt05/aggbug/64383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 10:23 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WIN库函数使用手册</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64379.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:52:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64379.html</guid><description><![CDATA[http://www.ggv.com.cn/forum/clib/clib.html<img src ="http://www.cppblog.com/nt05/aggbug/64379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:52 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 "四行"代码算1000!</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64378.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64378.html</guid><description><![CDATA[
		<font face="宋体">#include&lt;stdio.h&gt;<br />#define N 1000    //要计算的N<br />long s[N]={1,1},n=N,t=2,a=1,b=0;<br />int main()//雨中飞燕之作<br />{<br />    for(;a&lt;=*s||(++t&lt;=n?(b=0,a=1):0);(*s==a++&amp;&amp;b)?(*s)++:0)<br />        s[a]=(b+=s[a]*t)%10000,b/=10000;<br />    for(printf("%d",s[*s]);--*s&gt;0;)printf("%04d",s[*s]);<br />    return 0;<br />}<br />在VC6,DevC,Code::Block上测试，算1000!用时毫秒级<br /><br />附1000!的精确值：<br />40238726007709377354370243392300398571937486421071463254379991042993851239862902<br />05920442084869694048004799886101971960586316668729948085589013238296699445909974<br />24504087073759918823627727188732519779505950995276120874975462497043601418278094<br />64649629105639388743788648733711918104582578364784997701247663288983595573543251<br />31853239584630755574091142624174743493475534286465766116677973966688202912073791<br />43853719588249808126867838374559731746136085379534524221586593201928090878297308<br />43139284440328123155861103697680135730421616874760967587134831202547858932076716<br />91324484262361314125087802080002616831510273418279777047846358681701643650241536<br />91398281264810213092761244896359928705114964975419909342221566832572080821333186<br />11681155361583654698404670897560290095053761647584772842188967964624494516076535<br />34081989013854424879849599533191017233555566021394503997362807501378376153071277<br />61926849034352625200015888535147331611702103968175921510907788019393178114194545<br />25722386554146106289218796022383897147608850627686296714667469756291123408243920<br />81601537808898939645182632436716167621791689097799119037540312746222899880051954<br />44414282012187361745992642956581746628302955570299024324153181617210465832036786<br />90611726015878352075151628422554026517048330422614397428693306169089796848259012<br />54583271682264580665267699586526822728070757813918581788896522081643483448259932<br />66043367660176999612831860788386150279465955131156552036093988180612138558600301<br />43569452722420634463179746059468257310379008402443243846565724501440282188525247<br />09351906209290231364932734975655139587205596542287497740114133469627154228458623<br />77387538230483865688976461927383814900140767310446640259899490222221765904339901<br />88601856652648506179970235619389701786004081188972991831102117122984590164192106<br />88843871218556461249607987229085192968193723886426148396573822911231250241866493<br />53143970137428531926649875337218940694281434118520158014123344828015051399694290<br />15348307764456909907315243327828826986460278986432113908350621709500259738986355<br />42771967428222487575867657523442202075736305694988250879689281627538488633969099<br />59826280956121450994871701244516461260379029309120889086942028510640182154399457<br />15680594187274899809425474217358240106367740459574178516082923013535808184009699<br />63725242305608559037006242712434169090041536901059339838357779394109700277534720<br />00000000000000000000000000000000000000000000000000000000000000000000000000000000<br />00000000000000000000000000000000000000000000000000000000000000000000000000000000<br />00000000000000000000000000000000000000000000000000000000000000000000000000000000<br />00000000</font>
<img src ="http://www.cppblog.com/nt05/aggbug/64378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:51 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>++a a++优先级</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64377.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:49:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64377.html</guid><description><![CDATA[a=i++ 和 a=++i 
<br />a=i++是先把 i 的值给 a 后 i 再自加；相当于a=i;i=i+1 
<br />a=++i是先把 i自 加;再把值给 a ；相当于i=i+1;a=i



    <img src ="http://www.cppblog.com/nt05/aggbug/64377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:49 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>define的另类用法</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64376.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:47:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64376.html</guid><description><![CDATA[最近看com相关的资料，看到CCmdTarget实现com接口的时候，去读了一些宏的定义，在afxdisp.h头文件中<br /><br />#define BEGIN_INTERFACE_PART(localClass, baseClass) \<br /> class X##localClass : public baseClass \<br /><br />本来这个宏定义很容易理解的，但是这里多出个X##，我真没见过这种用法，不晓得它是什么用意。<br />后来问了几个朋友也都不知道。<br /><br />你知道么？<br /><br />也许你也不知道～呵呵，最后我还是找到了相关的资料，解读了这个define，还顺便认识了另外两个不常用的define<br /><br />#define Conn(x,y) x##y<br />#define ToChar(x) <a href="mailto:#@x">#@x</a><br />#define ToString(x) #x<br /><br />x##y表示什么？表示x连接y，举例说：<br />int  n = Conn(123,456);  结果就是n=123456;<br />char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";<br />怎么样，很神奇吧<br /><br />再来看<a href="mailto:#@x">#@x</a>，其实就是给x加上单引号，结果返回是一个const char。举例说：<br />char a = ToChar(1);结果就是a='1';<br />做个越界试验char a = ToChar(123);结果是a='3';<br />但是如果你的参数超过四个字符，编译器就给给你报错了！error C2015: too many characters in constant   ：P<br /><br />最后看看#x,估计你也明白了，他是给x加双引号<br />char* str = ToString(123132);就成了str="123132";<br /><br />最后留几个小试验给大家去测测：<br />#define Dec(x,y) (x-y)<br />int n = Dec( A(123,1), 1230);<br />n = Conn(123, Conn(123,332) );<br />char* str = A("12", ToString( Dec(3,1));<br /><img src ="http://www.cppblog.com/nt05/aggbug/64376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:47 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将msil编译为本地cpu代码</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64374.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64374.html</guid><description><![CDATA[
		<div id="blog_text" class="cnt">
				<div class="introduction">
						<p>运行 Microsoft 中间语言 (MSIL) 之前，必须先根据公共语言运行库将其编译为适合目标计算机体系结构的本机代码。.NET Framework 提供了两种方式来执行此类转换：</p>
						<ul>
								<li>
										<p>.NET Framework 实时 (JIT) 编译器。</p>
								</li>
								<li>
										<p>.NET Framework <a href="http://msdn.microsoft.com/zh-cn/library/6t9t5wcf.aspx">本机映像生成器 (Ngen.exe)</a>。</p>
								</li>
						</ul>
				</div>
				<div class="MTPS_CollapsibleRegion">
						<div class="CollapseRegionLink">
								<img style="border-width: 0px; vertical-align: middle;" src="http://i.msdn.microsoft.com/Platform/Controls/CollapsibleArea/resources/minus.gif" /> 使用实时编译器进行编译</div>
						<div class="MTPS_CollapsibleSection" style="overflow: visible; display: block; width: auto; height: auto;">
								<div class="MTPS_CollapsibleSection" style="border: medium none ; display: block;">
										<a name="sectionToggle0">
										</a>
										<p>在应用程序运行时，JIT 编译可以在加载和执行程序集内容的过程中根据需要将 MSIL 转换为本机代码。由于公共语言运行库为所支持的每种
CPU 体系结构都提供了一个 JIT 编译器，因此开发人员可以生成一组可在具有不同的计算机体系结构的不同计算机进行 JIT 编译和运行的
MSIL 程序集。但是，如果托管代码调用特定于平台的本机 API 或特定于平台的类库，则将只能在特定的操作系统上运行。</p>
										<p>JIT 编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是耗费时间和内存将可移植可执行 (PE) 文件中的所有 MSIL
都转换为本机代码，而是在执行期间根据需要转换 MSIL
并将生成的本机代码存储在内存中，以供该进程上下文中的后续调用访问。在加载并初始化类型时，加载程序将创建存根 (stub)
并将其附加到该类型的每个方法中。当首次调用某个方法时，存根 (stub) 会将控制权交给 JIT 编译器，后者会将该方法的 MSIL
转换为本机代码，并修改存根 (stub) 以使其直接指向生成的本机代码。这样，对 JIT 编译的方法的后续调用将直接转到该本机代码。</p>
								</div>
						</div>
				</div>
				<div class="MTPS_CollapsibleRegion">
						<div class="CollapseRegionLink">
								<img style="border-width: 0px; vertical-align: middle;" src="http://i.msdn.microsoft.com/Platform/Controls/CollapsibleArea/resources/minus.gif" /> 使用 NGen.exe 的安装时代码生成</div>
						<div class="MTPS_CollapsibleSection" style="overflow: visible; display: block; width: auto; height: auto;">
								<div class="MTPS_CollapsibleSection" style="border: medium none ; display: block;">
										<a name="sectionToggle1">
										</a>
										<p>由于 JIT 编译器会在调用程序集中定义的单个方法时将该程序集的 MSIL
转换为本机代码，因而必定会对运行时的性能造成影响。在大多数情况下，这种性能影响是可以接受的。更为重要的是，由 JIT
编译器生成的代码会绑定到触发编译的进程上。它无法在多个进程之间进行共享。为了能在多个应用程序调用或共享一组程序集的多个进程之间共享生成的代码，公
共语言运行库支持一种提前编译模式。此提前编译模式使用<a href="http://msdn.microsoft.com/zh-cn/library/6t9t5wcf.aspx">本机映像生成器 (Ngen.exe)</a> 将 MSIL 程序集转换为本机代码，其作用与 JIT 编译器极为相似。但是，Ngen.exe 的操作与 JIT 编译器的操作有三点不同：</p>
										<ul>
												<li>
														<p>它在应用程序运行之前而不是运行过程中执行从 MSIL 到本机代码的转换。</p>
												</li>
												<li>
														<p>它一次编译一个整个的程序集，而不是一次编译一个方法。</p>
												</li>
												<li>
														<p>它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。</p>
												</li>
										</ul>
								</div>
						</div>
				</div>
				<div class="MTPS_CollapsibleRegion">
						<div class="CollapseRegionLink">
								<img style="border-width: 0px; vertical-align: middle;" src="http://i.msdn.microsoft.com/Platform/Controls/CollapsibleArea/resources/minus.gif" /> 代码验证</div>
						<div class="MTPS_CollapsibleSection" style="overflow: visible; display: block; width: auto; height: auto;">
								<div class="MTPS_CollapsibleSection" style="border: medium none ; display: block;">
										<a name="sectionToggle2">
										</a>
										<p>在将 MSIL 编译为本机代码的过程中，MSIL 代码必须通过验证过程，除非管理员已经建立了允许代码跳过验证的安全策略。验证过程检查
MSIL
和元数据以确定代码是否是类型安全的，这意味着它仅访问它已被授权访问的内存位置。类型安全帮助将对象彼此隔离，因而可以保护它们免遭无意或恶意的破坏。
它还提供了对代码可以可靠地强制安全限制的保证。</p>
										<p>运行库使用下列条件来验证代码是否为类型安全：</p>
										<ul>
												<li>
														<p>对类型的引用与被引用的类型严格兼容。</p>
												</li>
												<li>
														<p>在对象上只调用正确定义的操作。</p>
												</li>
												<li>
														<p>标识与声称的要求一致。</p>
												</li>
										</ul>
										<p>验证过程中检查 MSIL
代码，尝试确认该代码只能通过正确定义的类型访问内存位置和调用方法。例如，代码不允许以超出内存范围的方式来访问对象。另外，验证过程检查代码以确定
MSIL 是否已正确生成，这是因为不正确的 MSIL
会导致违反类型安全规则。验证过程通过正确定义的类型安全代码集，并且它只通过类型安全的代码。然而，由于验证过程存在一些限制，某些类型安全代码可能无
法通过验证，而某些语言在设计上并不产生可验证的类型安全代码。如果安全策略要求提供类型安全代码，而该代码不能通过验证，则在运行该代码时将引发异常。</p>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/nt05/aggbug/64374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:35 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net 2.0启动aspnet_regiis命令依赖server服务</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64372.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:07:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64372.html</guid><description><![CDATA[.net 2.0启动aspnet_regiis命令依赖server服务<img src ="http://www.cppblog.com/nt05/aggbug/64372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:07 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改mysql密码方法</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64371.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64371.html</guid><description><![CDATA[use mysql <br />update user set Password=password('newpassword') where User='root'; <br />flush privileges; <br /><br />1.通过修改MYSQL数据库中MYSQL库的USER表<br />        就用普通的UPDATE、INSERT语句就可以<br /><br />2.在命令行中使用如下命令<br />       MYSQLADMIN -u root -p PASSWORD mypasswd <br /><br />3.可以修改MYSQL文件夹中的MY.INI文件<br /><br />4.使用SET PASSWORD语句， <br />mysql&gt; SET PASSWORD FOR myuser@localhost = PASSWORD('mypasswd'); <br /><br />5.使用GRANT ... IDENTIFIED BY语句 <br />mysql&gt; GRANT USAGE ON *.* TO myuser@localhost IDENTIFIED BY 'mypassword'; <img src ="http://www.cppblog.com/nt05/aggbug/64371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 09:05 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>集线器和路由器区别</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64370.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 19 Oct 2008 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64370.html</guid><description><![CDATA[集线器-------集线器也叫Hub，工作在物理层（最底层），没有相匹配的软件系统，是纯硬件设备。集线器主要用来连接计算机等网络终端。 
<br /><br />集线器为共享式带宽，连接在集线器上的任何一个设备发送数据时，其他所有设备必须等待，此设备享有全部带宽，通讯完毕，再由其他设备使用带宽。正因此，集线器连接了一个冲突域的网络。所有设备相互交替使用，就好象大家一起过一根独木桥一样。 
<br /><br />集线器不能判断数据包的目的地和类型，所以如果是广播数据包也依然转发，而且所有设备发出数据以广播方式发送到每个接口，这样集线器也连接了一个广播域的网络。 
<br /><br />交换机-------交换机Switch，工作在数据链路层（第二层），稍微高端一点的交换机都有一个操作系统来支持。和集线器一样主要用于连接计算机等网络终端设备。 
<br /><br />交换机比集线器更加先进，允许连接在交换机上的设备并行通讯，好比高速公路上的汽车并行行使一般，设备间通讯不会再发生冲突，因此交换机打破了冲突域，交换机每个接口是一个冲突域，不会与其他接口发生通讯冲突。 
<br /><br />并且有系统的交换机可以记录MAC地址表，发送的数据不会再以广播方式发送到每个接口，而是直接到达目的接口，节省了接口带宽。但是交换机和集线器一样不能判断广播数据包，会把广播发送到全部接口，所以交换机和集线器一样连接了一个广播域网络。 
<br /><br />高端一点的交换机不仅可以记录MAC地址表，还可以划分VLAN（虚拟局域网）来隔离广播，但是VLAN间也同样不能通讯。要使VLAN间能够通讯，必须有三层设备介入。 
<br /><br />路由器-------路由器Router，工作在网络层（第三层），所有的路由器都有自己的操作系统来维持，并且需要人员调试，否则不能工作。路由器没有那么多接口，主要用来进行网络与网络的连接。 
<br /><br />简单的说路由器把数据从一个网络发送到另一个网络，这个过程就叫路由。路由器不仅能像交换机一样隔离冲突域，而且还能检测广播数据包，并丢弃广播包来隔离广播域，有效的扩大了网络的规模。 
<br /><br />在路由器中记录着路由表，路由器以此来转发数据，以实现网络间的通讯。路由器的介入可以使交换机划分的VLAN实现互相通讯。 
<br /><br />总结： 
<br /><br />集线器：纯硬件、用于连接网络终端、不能打破冲突域和广播域。 
<br /><br />交换机：拥有软件系统、用于连接网络终端、能够打破冲突域，但是不能分割广播域。 
<br /><br />路由器：拥有软件系统、用于连接网络、可以打破冲突域也可以分割广播域，是连接大型网络的比备设备<img src ="http://www.cppblog.com/nt05/aggbug/64370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 08:42 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统对Image File Execution Options的检测流程小探</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64369.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 23:40:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64369.html</guid><description><![CDATA[
		<div id="blog_text" class="cnt">
				<p>Image File Execution
Options，说熟悉又陌生，一年来大家谈起的映像劫持，都是它的Debugger键值的问题。实现IFEO劫持，只是在注册表写一个键而已，轻松到没
技术含量。然而，系统到底是怎么识别的呢，或者说，系统的这个功能，是怎么使它自己走入圈套的呢？</p>
				<p>早前给电脑报写了一篇简单谈IFEO的文章，当时托大家找了些资料，TK翻到MSDN里的相关描述，明确指出“当父进程不是作用子进程的调试器
时，CreateProcess在其用户态部分检测Image File Execution
Options项”。当时就想在文章最后说一下这点，以及为什么那些系统关键进程是不会被IFEO影响的。但是一来自己当时太菜，根本不懂得去看
CreateProcess的代码来调试，所以也自己确认不了。同时那篇文章也是给一般用户看的，无谓说些让他们坠入迷雾的东西，所以就作罢了。</p>
				<p>而最近这两三天里，由于前一篇blog里提到的看shellcode的xor加密代码的激励，突然对汇编逆向调试感兴趣了，于是整天盯着OD看反汇
编代码。今天又遇到一个求助者，他不慎将D盘在资源管理器下隐藏了，于是教他从组策略里改回来。最后随口说了一句“系统应该是在
FindFirstFile和FindNextFile的用户态部分检查这个键值，以隐藏驱动器吧，不至于到调用NATIVE
API甚至进ring0时才检测，就像CreateProcess在用户态检测IFEO一样”。</p>
				<p>于是突然有想法，何不确认一下？</p>
				<p>自己写个小程序，button的onclick里就简单地CreateProcess。<br />
打开注册表编辑器，将SREngPS.exe给IFEO劫持到cmd.exe。</p>
				<p>OD载入运行，忽略所有异常，开工。<br />
先看了CreateProcessA、WinExec、ShellExecuteA这几个函数，果然全都是内部调用了
CreateProcessInternalA来完成，而后者又调用了其UNICODE版本，即CreateProcessInternalW，来完成实
际的工作。<br />
在CreateProcessInternalW出口处下断，断到了，一路跟下去。这次的重点在于找出“系统判断父进程是否为子进程的调试器，是则检测IFEO项”的相应代码。<br />
也就是说，要找到系统对dwCreationFlags进行检测并决定是否进入IFEO检测的代码。</p>
				<p>父进程成为子进程的调试器的dwCreationFlags参数有两个：<br />
DEBUG_PROCESS = 1;<br />
DEBUG_ONLY_THIS_PROCESS = 2;<br /><br />
找了半天，这函数要做的步骤还真不是一般的多，调用NATIVE API创建进程对象的顺序就不仔细看了，留待以后吧，现在重点不是这些。最后终于柳暗花明：</p>
				<div forimg="1">
						<p>
								<img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/9cea7e60d7217e48ebf8f88a.jpg" border="0" />
						</p>
						<p>用断点的红色标示的这两句，其中byte ptr [ebp+20]正是传入的dwCreationFlags，与3进行test，如dwCreationFlags中包含1或2，则结果非零（ZF=0），这时就跳走，绕过下面的检测。<br />
这里我们用了0参数，所以当F8到jnz的时候，会发现提示窗口写着“跳转未实现”。<br />
而下面这个检测，就是跳到ntdll.dll导出的LdrQueryImageFileExecutionOptions函数中了，看看它是怎么检测的：</p>
						<div forimg="1">
								<p>
										<img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/113a1fd1d5cf0bdf572c8496.jpg" border="0" />
								</p>
								<p>进入那个call中，又是冗长的一大堆，看得头痛，拣其中一些：<br /><img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/ed18327f3738fe0428388a97.jpg" border="0" /><br />
IFEO项的地址，IFEO的路径所为字符串常量保存在ntdll.dll中。<br /><br /><img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/f88bc388b5277e98a4c27297.jpg" border="0" /><br />
进行完这两个mov，esi中是指向SREngPS.exe的全路径的地址，注意这时已经是UNC标准的UNICODE（前面有\??\）</p>
								<div forimg="1">
										<p>
												<img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/c90269d9810af8e539012f91.jpg" border="0" />
												<br />
循环，eax初始值指向全路径地址末尾，每次向前推进，直到找到"\"，再跳出循环到最后这一行。<br />
跳出循环到最后这一行时，eax保存的便是指向相对路径（"SREngPS.exe“）开头的地址，而[ebp-2d4]里的则是前面的文件夹路径的长度。<br />
。。。。</p>
										<div forimg="1">
												<img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/1cc75e36a4b3d7d1a3cc2b93.jpg" border="0" />
												<br />
调用ZwOpenKey去访问键值了。<br />
回到LdrQueryImageFileExecutionOptions中test得到的eax值（已传到esi），然后就<br />
7C93D36D    /0F8D CD900100    jge      7C956440                    ; 存在则读其键值</div>
										<div forimg="1">
												<p>看下这个7C956440：<br />
7C956440     FF75 1C          push     dword ptr [ebp+1C]<br />
7C956443     FF75 18          push     dword ptr [ebp+18]<br />
7C956446     FF75 14          push     dword ptr [ebp+14]<br />
7C956449     FF75 10          push     dword ptr [ebp+10]<br />
7C95644C     FF75 0C          push     dword ptr [ebp+C]<br />
7C95644F     FF75 08          push     dword ptr [ebp+8]<br />
7C956452     E8 14000000      call     7C95646B<br />
7C956457     FF75 08          push     dword ptr [ebp+8]<br />
7C95645A     8BF0             mov      esi, eax<br />
7C95645C     E8 2571FDFF      call     ZwClose<br />
7C956461 ^ E9 0D6FFEFF      jmp      7C93D373</p>
												<p>又push了一阵参数，call了7C95646B，之后就ZwClose关闭句柄，并跳回LdrQueryImageFileExecutionOptions中下一行代码了。<br />
7C95646B，终于“偷梁换柱”：<br /><img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/7af646430eec4b1d9313c69e.jpg" border="0" /><br />
call ZwQueryValueKey时的堆栈：</p>
												<div forimg="1">
														<p>
																<img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/a900d6fda2236b49d6887d9f.jpg" border="0" />
																<br />
0012E5E4开始写入内容，0012E5F0开始保存UNICODE字符串C:\WINDOWS\system32\cmd.exe，此地址前面四字节则是字符串长度。<br />
之后申请内存、memmove的就从略了，最后ZwClose后回到LdrQueryImageFileExecutionOptions，然后就回到kernel32.dll的领空了，又跟了一段之后：<br /><img class="blogimg" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/cec15efb7ec95268034f569b.jpg" border="0" /><br />
“偷梁换柱”在这里初步完成。下面就是按新的路径完成剩下的工作了。<br /><br />
从以上内容的不厌其烦的分析中，我们可以找到一些“关键点”：<br /><br />
1. CreateProcessInternalW里的检测dwCreationFlags（看第一个图）：<br />
7C8190C0     F645 20 03       test     byte ptr [ebp+20], 3           ; dwCreationFlags<br />
7C8190C4     0F85 059A0200    jnz      7C842ACF<br />
在第二行代码前下断，断下来后，在OD的寄存器窗口，将ZF寄存器的值置0，则此时的“跳转未实现”的箭头变红了，跳转可实现，F9，SREng的窗口出来了，IFEO检测没有进行。<br /><br />
2. LdrQueryImageFileExecutionOptions中call完了ZwOpenKey后回来的最后：<br />
7C93D364     E8 25FEFFFF      call     7C93D18E                       ; 是否存在相应IFEO项的Debugger键<br />
7C93D369     8BF0             mov      esi, eax<br />
7C93D36B     85F6             test     esi, esi<br />
7C93D36D     0F8D CD900100    jge      7C956440                       ; 存在则读其键值<br />
7C93D373     8BC6             mov      eax, esi<br />
7C93D375     5E               pop      esi<br />
7C93D376     5D               pop      ebp<br />
7C93D377     C2 1800          retn     18<br /><br />
这里 <br />
jge      7C956440<br />
是一个跳去调用ZwQueryKey去查找键值的地方，如果我们让它不跳，则在此下断，jge满足的条件是(SF xor
OF)==0，现在把寄存器窗口中的SF或OF改一下，跳转的箭头又变成了未实现的灰色。这时把这个断点先禁用，F9，呵呵，SREng的窗口又出来了。</p>
														<p>结论：<br /><br />
1.
MSDN并没有骗人，CreateProcess的确是在其用户态部分，准确地说是在CreateProcessInternalW中检测
dwCreationFlag，当dwCreationFlag中包括DEBUG_PROCESS
或DEBUG_ONLY_THIS_PROCESS时，系统将直接跳过对Image File Execution Options的检测。<br /><br />
2.
CreateProcessInternalW调用了ntdll.dll导出的LdrQueryImageFileExecutionOptions函数
来检测Image File Execution
Options项目，而LdrQueryImageFileExecutionOptions调用了ZwOpenKey和（如果ZwOpenKey证实项
目存在）ZwQueryKey去检测并获得（如果存在）Debugger键值，之后回到kernel32.dll，把Debugger键值和原程序路径
Append，并在堆栈中替换掉原程序路径的地址。</p>
														<p>3. 以上过程是循环的，即如果此时Debugger键值中的程序又被IFEO了，将再来……直到不再有。但是如果造成了死循环，最后命令行长度越来越长，似乎要等于长度超过系统的限制，才跳出循环并提示“找不到文件”（当然这个提示是Windows在自欺欺人）。</p>
														<p>4. 根据1及2，我们在程序中要创建进程，如果想不受IFEO的限制，除了干脆加上DEBUG_PROCESS
或DEBUG_ONLY_THIS_PROCESS参数，把自己作为新进程的调试器外，还可以弄些较“猥琐”的方法，比如从前面提到的几个关键跳转处作文
章，或者或干脆SSDT
HOOK等方法搞掉自身进程空间中的或整个系统级上的ZwOpenKey等（HOOK这些的话，由于一般情况下应用程序CreateProcess都要
IFEO检测，HOOK了这个还可以反过来“虚拟”一个Debugger键出来，作为隐蔽的启动自身组件的方法）。<br /><br />
5. IFEO的Debugger键结果，并不只是启动另一个程序，而且还把原程序的地址当成参数传递了，这一点是我们这些菜鸟提到这一键的作用时经常忽略的。<br />
所以，如果一个病毒利用IFEO劫持的目的，不包括把安全软件禁用掉，而只是为了在原程序被触发时，作为启动病毒自身的方式，那么，就很容易利用这一点，
只需要病毒程序自身启动后，GetCommandLine，得到原先要启动的程序地址，再利用上面说的方法，启动原先的正常程序即可。这样做可以让多个程
序的IFEO劫持Debugger键指向同一个病毒程序，而每次却都能够正常启动原程序。这样一般用户在触发这一项时，根本不会有感觉，毕竟如果不是用
Process Explorer等工具，而是光看任务管理器的话，用户将难以看出自己运行的正常程序，却是建立在一个可疑的有危险的病毒父进程之下的。</p>
														<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
														<p>后记：在调试完之后，写这篇文章的过程中，搜了网上关于Image File Execution Options的文章，发现一篇比较不错的“详解WINDOWS映像劫持技术”，显然作者也是“同道中人”，而且文笔不错。其中提到：<br /><br />
这个招数被广大使用“映像劫持”技术的恶意软件所青睐，随着OSO这款超级U盘病毒与AV终结者（随机数病毒、8位字母病毒）这两个灭杀了大部分流行安全工具和杀毒软件的恶意程序肆虐网络以后，一时之间全国上下人心惶惶……</p>
														<p>呵呵，还有人记得OSO.exe啊，那的确是我印象中最早大规模使用IFEO劫持的U盘病毒，当时我抢先分析了一下，虽然分析得很菜，被MJ狂贬，但是却印象颇深。当时用OD，只会看字符串，跟现在这篇文章的调试比起来，真是差太远了。<br /><br />
对于IFEO的检测，该文提到：<br /><br />
一个程序启动时是否会调用到IFEO规则取决于它是否“从命令行调用”的……为了与用户操作区分开来，系统自身加载的程序、调试器里启动的程序，它们就不属于“从命令行调用”的范围，从而绕开了IFEO，避免了这个加载过程无休止的循环下去。<br />
从编程角度来说明“命令行调用”，那就是取决于启动程序时CreateProcess是使用lpCommandLine（命令行）还是
lpApplicationName（程序文件名）来执行，默认情况下大部分程序员编写的调用习惯是lpCommandLine——命令行调用</p>
														<p>经过这次调试，我个人觉得这种说法不是很妥当。调试器启动程序仍然是用lpCommandLine启动，区别只不过是
dwCreationFlags的值的设置。而就算用lpApplicationName，到了CreateProcessInternalW里面那个判
断，以及接下来的步骤，都是一样的，应该是在此之前就已经把整个命令行连起来处理了。所以结果是，仍然受到IFEO限制，没什么不同。上面这几句话，容易
让人以为调试器调试程序不是用用lpCommandLine启动的，或是用lpApplicationName就不受IFEO限制，这是误解。</p>
												</div>
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/nt05/aggbug/64369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 07:40 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Takeown--夺取文件or文件夹所有权</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64360.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:52:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64360.html</guid><description><![CDATA[
		<span class="spnMessageText" id="msg">
				<font size="2">
						<font color="#191970" face="Verdana">强制将当前目录下的所有文件及文件夹、子文件夹下的所有者更改为管理员组(administrators)命令：<br /></font>
						<font color="#ff0000">
								<font face="Courier New">takeown /f * /a /r /d y</font>
								<br />
								<br />
								<font size="2">
										<font color="#191970" face="Verdana">将所有d:\documents目录下的文件、子文件夹的NTFS权限修改为仅管理员组(administrators)完全控制(删除原有所有NTFS权限设置)：<br /></font>
										<font color="#ff0000">
												<font face="Courier New">cacls d:\documents\*.* /T /G administrators:F</font>
												<br />
												<br />
												<font size="2">
														<font color="#191970" face="Verdana">在原有d:\documents目录下的文件、子文件夹的NTFS权限上添加管理员组(administrators)完全控制权限(并不删除原有所有NTFS权限设置)：<br /></font>
														<font color="#ff0000">
																<font face="Courier New">cacls d:\documents\*.* /T /E /G administrators:F</font>
																<br />
																<br />
																<font color="#191970" size="2" face="Verdana">取消管理员组(administrators)完全控制权限(并不删除原有所有NTFS权限设置)：<br /></font>
																<font color="#191970">
																		<font size="2">
																				<font face="Courier New">cacls \\Server\Documents\%username%\我的文档 /t /e /r "mddq\domain admins"<br />cacls \\Server\Documents\%username%\桌面 /t /e /r "mddq\domain admins"</font>
																				<br />
																				<br />
																				<br />
																		</font>
																</font>
																<font size="3">
																		<font color="#008080">
																				<font face="Verdana">通过这二个命令可以实现批量夺取文件夹、文件所有者权限和添加管理员组完全控制权限。</font>
																		</font>
																		<br />
																</font>
														</font>
												</font>
										</font>
								</font>
						</font>
				</font>
		</span>
<img src ="http://www.cppblog.com/nt05/aggbug/64360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:52 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关 Windows Vista 中的 Windows 更新独立安装程序 (Wusa.exe) 以及 .msu 文件的说明</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64359.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:51:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64359.html</guid><description><![CDATA[.msu 文件中包含以下内容： 
		  <table class="list ul"><tbody><tr><td class="bullet">•</td><td class="text">Windows Update 元数据<br />此元数据描述了 .msu 文件包含的每个更新包。</td></tr><tr><td class="bullet">•</td><td class="text"> 一个或多个 .cab 文件<br />每个 .cab 文件代表一个更新。</td></tr><tr><td class="bullet">•</td><td class="text">一个 .xml 文件<br />此 .xml 文件对 .msu 更新包进行描述。当使用程序包管理器工具
				(Pkgmgr.exe) 执行无人参与的更新安装时，Wusa.exe 将 会使用此 .xml 文件。<br /><br />例如，您下载了修补程序
				934307。Windows6.0-KB934307-x86.msu 文件将出现在 C:\934307 文件夹中。在命令提示符处键入下列命令，以便将 .msu
				文件展开到一个临时文件夹中：<div class="indent"><span class="userInput">expand -f:* "C:\934307\Windows6.0-KB934307-x86.msu" %TEMP%</span></div>然后，在命令提示符处键入下面的命令：<div class="indent"><span class="userInput">pkgmgr.exe /n:%TEMP%\Windows6.0-KB934307-x86.xml</span></div></td></tr><tr><td class="bullet">•</td><td class="text">一个属性文件<br />此文件包含 Wusa.exe 使用的字符串属性。例如，此文件包含 Microsoft
				知识库中相关文章的名称。</td></tr></tbody></table>如果使用 Wusa.exe 安装更新包，Wusa.exe 则会将 .msu 文件的内容展开到一个临时文件夹中。然后，
		  Wusa.exe 会执行以下步骤： 
		  <table class="list ol"><tbody><tr><td class="number">1.</td><td class="text">Wusa.exe 使用 .msu 文件中的 Windows Update
				元数据搜索可应用的更新。</td></tr><tr><td class="number">2.</td><td class="text">Wusa.exe 将可应用更新的内容复制到 Windows Update 沙盒中。Windows Update 沙盒
				是一个受保护的文件夹。</td></tr><tr><td class="number">3.</td><td class="text">Wusa.exe 根据 Wusa.exe 的启动模式调用 Windows Update 代理 API 中
				的相应函数。</td></tr><tr><td class="number">4.</td><td class="text">当 Windows Update 向导完成安装时，Windows Update 代理 API
				会返回一个状态。然后，Wusa.exe 与 Windows Update 代理 API 同步进行工作。</td></tr></tbody></table><b>注意</b>：.msu 更新包中的每个更新都在单独会话中进行安装。在使用 Wusa.exe 时，只有一个 Wusa.exe
		  实例在运行。Wusa.exe 不会修改 .msu 文件中的更新的内容。Windows Update
		  基础结构根据更新的内容执行所需操作。<br /><br />在以交互模式启动 Wusa.exe
		  时，会出现一个欢迎屏幕显示有关更新的高层次信息。如果继续安装更新，Wusa.exe 会调用 Windows Update 代理 API 中的相应函数以启动
		  Windows Update 向导。Windows Update 向导将显示与更新包相关的 Microsoft 软件许可条款。Wusa.exe 调用
		  Windows Update 代理 API 以继续执行安装过程。然后，Wusa.exe 进入等待状态，直到 Windows Update 向导完成
		  安装。<br /><br />若要安装 .msu 更新包，请运行 Wusa.exe 并使用该文件的完整路径。例如，如果
		  Windows6.0-KB934307-x86.msu 文件位于 D:\934307 文件夹中，请在命令提示符处键入以下命令以安装更新包：<div class="indent"><span class="userInput">wusa.exe d:\934307\Windows6.0-KB934307-x86.msu</span></div>此外，还可以通过双击 .msu 文件来安装更新包。<br /><br /><b>注意</b>：在 Windows Vista 中不能使用 Wusa.exe 来卸载更新。可以使用 Windows Defender
		  软件资源管理器手动卸载更新。有关软件资源管理器的更多信息，请访问下面的 Microsoft 网站：<div class="indent"><span class="ll"><a href="http://www.microsoft.com/china/athome/security/spyware/software/support/howto/softwareexplorer.mspx">http://www.microsoft.com/china/athome/security/spyware/software/support/howto/softwareexplorer.mspx</a></span><span class="pLink"> (http://www.microsoft.com/china/athome/security/spyware/software/support/howto/softwareexplorer.mspx)</span></div><br /><br />可以将以下开关与 Wusa.exe 一起使用： 
		  <table class="list ul"><tbody><tr><td class="bullet">•</td><td class="text"><b>/?</b>, <b>/h</b>, <b>/help</b><br />查看帮助。</td></tr><tr><td class="bullet">•</td><td class="text"><b>/quiet</b><br />以安静模式运行
				Wusa.exe，无需用户交互。当工具以安静模式运行时，不需要用户与之进行交互。计算机在需要时会重新启动。<br /><br />例如，如果
				Windows6.0-KB934307-x86.msu 文件位于 D:\934307
				文件夹中，可在命令提示符处键入以下命令，从而在无需用户交互的情况下安装更新包： <div class="indent"><span class="userInput">wusa.exe d:\934307\Windows6.0-KB934307-x86.msu /quiet</span></div><b>注意</b>：在使用此开关时，不会显示 Microsoft 软件许可条款。</td></tr><tr><td class="bullet">•</td><td class="text"><b>/norestart</b><br />禁止 Wusa.exe 重新启动计算机。如果未使用 <b>/quiet</b> 开关，则忽略 <b>/norestart</b> 开关。如果在运行 Wusa.exe 时使用这两个开关，则在完成安装 后，必须手动重新启动操作系统（如果安装过程
				要求您重新启动计算机）。<br /><br />例如，如果 Windows6.0-KB934307-x86.msu 文件位于 D:\934307
				文件夹中，可在命令提示符处键入以下命令以安装更新包：<div class="indent"><span class="userInput">wusa.exe D:\934307\Windows6.0-KB934307-x86.msu /quiet /norestart</span></div></td></tr></tbody></table>若要查看 Windows 更新独立安装程序的事件日志，请执行以下步骤： 
		  <table class="list ol"><tbody><tr><td class="number">1.</td><td class="text">单击“开始”<img class="graphic" src="http://support.microsoft.com/library/images/support/kbgraphics/Public/EN-US/VistaStartButton.jpg" alt="“开始”按钮" title="“开始”按钮" />，在“开始搜索”框中键入“事件查看器”<span class="userInput"></span>，然后单击“程序”列表中的“事件查看器”。<br /><br /><img class="graphic" src="http://support.microsoft.com/library/images/support/kbgraphics/Public/EN-US/SecurityShield.jpg" alt="安全防火墙" title="安全防火墙" />
				如果系统提示您输入管理员密码或进行确认，请键入密码或单击“继续”。</td></tr><tr><td class="number">2.</td><td class="text">在事件查看器中，展开“Windows
				日志”，然后单击“安装程序”。<br /><br />安装程序事件将出现在中间窗格中。</td></tr><tr><td class="number">3.</td><td class="text">在“操作”窗格中，单击“筛选当前日志”。</td></tr><tr><td class="number">4.</td><td class="text">在“事件源”列表中，单击以选中“WUSA”复选框，然后单击“确定”。</td></tr></tbody></table><img src ="http://www.cppblog.com/nt05/aggbug/64359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:51 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决拒绝本地登录</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64358.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:48:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64358.html</guid><description><![CDATA[在Windows 2000环境下，被组策略拒绝本地登录一直是件比较令人头疼的事情。本文将介绍一种所有用户都被拒绝本地登录后的解决方法。<br />　
　在Windows2000中，如果某个用户被取消了本地登录权限，当这个用户本地登录计算机时，系统就会提示“此系统的本地策略不允许您采用交互式登录
”，导致登录失败。遇到这种情况，通常请管理员在组策略中重新设置一下，将该用户从“拒绝本地登录”列表中删除或添加到“在本地登录”列表中即可。但如果
因为操作失误或其它方面的原因，我们将所有用户的本地登录权限都禁止了(通常是禁止了users组（非域环境下）或domain
users组（域环境下）)，那就有点麻烦了。这种情形看起来像一个解不开的“死结”：要解除禁止本地登录的组策略设置，必须以管理员身份本地登录；要以
管理员身份本地登录，就必须先解除禁止本地登录的组策略设置。但实际上，事情并没有我们想象的那么糟。经过查询相关资料和测试，我发现借助网络的帮助,这
个“死结”还是可以解开的。因为域安全策略与本地安全策略的数据保存机制不同，下面分两种情况分别进行说明。 <br /><br /><p><strong>被域策略拒绝本地登录时的解决办法</strong></p><br /><p>　　域策略的安全设置部分都保存在一个名为“GptTmpl.inf”的安全模板中，这是一个文本文件，存放在DC（域控制器）的SYSVOL（物
理目录指向DC的“c:\winnt\sysvol\sysvol”）共享中。要解除对所有用户本地登录限制，在不能本地登录的情况下，最快捷的办法可能
就是直接编辑这个文本文件。<br />　　具体操作如下：</p><br /><p>　　1..
在另一台计算机（Win9X/2000/XP均可）上，使用域管理员账号连接到DC的SYSVOL共享，在“\\\sysvol\\Policies
\GUID&gt;\MACHINE\Microsoft\Windows
NT\SecEdit”下找到该文本文件“GptTmpl.inf”。(路径中的“DC name”是你放置该组策略的域控制器的名字，“Domain
name”是你的域的名字，“Policy
GUID”是你要编辑的组策略的GUID，类似于“{31B2F340-016D-11D2-945F-05C04FB98439}”)。<br />　　
2..
使用记事本打开“GptTmpl.inf”文件，找到文件中“PrivilegeRights”小节下的
“SeDenyInteractiveLogonRight”关键字，它的值就是被拒绝本地登录的用户或组的SID，将这些SID删除，使
“SeDenyInteractiveLogonRight”关键字的值为空。修改完毕将文件保存回原位置。<br />　　3..
使用记事本打开位于“\\\sysvol\name&gt;\Policies\”下的“GPT.INI”文件，提高“General”小节下的
“Version”关键字的值，通常是加1000。这是我们修改的这个组策略的版本号，版本号提高后可以保证我们的更改被复制到其它DC上。修改完毕将文
件保存回原位置。<br />　　4.. 域策略刷新后，问题即告解决。<br />　　5.. 本地登录DC重新设置域策略中的相关项目 。</p><br /><p><br /><strong>被本地安全策略拒绝本地登录时的解决办法</strong></p><br /><p>　　解决被本地安全策略拒绝本地登录的最正统的方法，应该是使用另一台Windows2000计算机，使用组策略MMC管理单元通过网络连接到故障
计算机的本地安全策略，然后进行修改。但我测试后发现，使用这种方法成功的机率非常小（具体的原因也不十分的明了），不是连接不上故障计算机，就是打不开
故障计算机上本地安全策略的安全设置。因此我们还需要一个更稳妥些的解决方法。<br />　　本地安全策略的安全设置通常存放在一个二进制的安全数据库secedit.sdb中，这个安全数据库的结构我们无从知道，因此象第一部分那样直接编辑secedit.sdb文件的办法是无能为力了，我们需要采用迂回进攻的策略，“曲线救国”。</p><br /><p>　　具体操作如下：</p><br /><p>　　1.. 假设故障计算机的IP地址是"192.168.0.111"。在另一台计算机(Windows9X/2000/XP均可)上，使用“Telnet 192.168.0.111”命令使用管理员账号连<br />接到故障计算机。（如果故障计算机的“telnet”服务没有启动，可以通过网络启动，具体方法不在详述）<br />　　2.. 通过telnet在故障计算机上执行“net share tmp$=d:\tmp”命令，将故障计算机上的“d:\tmp”隐藏共享为“tmp$”，共享权限缺省是everyone完全控制（此时要特别注意网络安全）。当然你也可以共享其它的目录。<br />　　3.. 通过telnet在故障计算机上执行“secedit /export /CFG<br />d:\tmp\sec.inf”命令，将故障计算机的本地安全策略配置导入“d:\tmp\sec.inf”安全模板文件中，这是一个文本文件。<br />　
　4.. 连接到故障计算机上的tmp$共享，用记事本打开共享文件夹中的“sec.inf”文件。找到文件中“Privilege
Rights”小节下的“SeDenyInteractiveLogonRight”关键字，它的值就是被拒绝本地登录的用户或组的SID，将这些SID
删除，使“SeDenyInteractiveLogonRight”关键字的值为空或者是随便另设置一个无关的值。文件修改完毕保存回原位置。<br />　　5.. 通过telnet在故障计算机上执行“secedit /configure /db<br />c:\secedit.sdb /CFG d:\tmp\sec.inf”命令，使用新的安全模板和安全数据库重新配置故障计算机的本地安全策略。<br />　　6.. 通过telnet在故障计算机上执行“secedit /refreshpolicy<br />machine_policy /enforce”命令，强制在故障计算机上刷新策略设置，问题即告解决。<br />　　7. 本地登录故障计算机后，删除我们建立的Tmp$共享，重新设置本地安全策略中的相关项目。</p><br /><p><br />　　secedit简介</p><br /><p>　　Secedit.exe，Windows2000自带的自动化安全配置任务命令行工具，功能强大。我们可以用它来分析系统的安全性、配置系统安全性、刷新安全性设置、导出安全性设置和验证安全配置文件。它的具体用法请使用“secedit /?”查看其帮助文件。</p><br /><p><br />　　补充说明</p><br /><p>　　上面所说的两种方法，都是以有权限用户（如管理员）没有被禁止从网络登录为前提的，如果你的策略把从网络登录也禁止了，让故障计算机成了真正的
“孤家寡人”，那问题解决起来要麻烦的多，但同样不是一个解不开的“死结”。具体的解决办法，我会另具文说明，在此不再细说。 </p><img src ="http://www.cppblog.com/nt05/aggbug/64358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:48 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置路由表实现双线上网</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64357.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:46:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64357.html</guid><description><![CDATA[
		<div class="cnt">
				<span>家里有两条单独的宽带线，一条是中国电信的，另一条是中国网通的，自己的计算机有两块网卡，还有两个</span>
				<span>Modem</span>
				<span>。想把两条宽带线路都利用起来，这样就可以保证访问网通和电信线路的地址速度都比较快。</span>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>想把两条线路合并到一起，并且可以实现访问电信网络通过电信</span>
						<span>ADSL</span>
						<span>，而访问网通网络则通过网通</span>
						<span>ADSL</span>
						<span>。这种需求和应用在实际使用中比较常见。</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>如果简单的通过一些网卡合并软件将两块网卡绑定到一起是无法满足这种智能选择路由的目的。实际上这位读者需要解决的和我们之前曾经介绍过的利用策略路由让网络数据包智能传输有类似之处，但是由于该读者只有一台计算机，而且通过</span>
						<span>ADSL</span>
						<span>拨号上网，所有以前介绍过的通过策略路由选择不同线路的方法就不行了。</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>在单机网络环境下是否也有诸如策略路由这样的解决技术和方案呢？答案是肯定的，我们可以通过计算机自身的路由表功能实现。对于每个连接到网络的计算机来说自身都有一个路由表，它类似于路由器的路由表，帮助计算机发送网络请求到指定的</span>
						<span>IP</span>
						<span>地址。可以通过“开始。运行”进人命令行窗口，然后执行</span>
						<span>"route print"</span>
						<span>来查看本机的路由表信息。</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>计算机中的路由表和路由器上的一样，也可以由我们根据需要添加或删除。这样解决读者问题的关键就放到了如何更合理的规划路由信息，让电信网络访问走电信网卡，让网通网络访问走网通网卡。</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>第一步：</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>计算机中连接网通的网卡，</span>
						<span>IP</span>
						<span>设置为</span>
						<span>192:168.1.111</span>
						<span>，网关设置为</span>
						<span>192.168.1</span>
						<span>．</span>
						<span>1</span>
						<span>；连接电信的网卡，</span>
						<span>IP</span>
						<span>设置为</span>
						<span>192:168.0:111</span>
						<span>，网关设置为</span>
						<span>192.168.0.1</span>
						<span>。</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>第二步：</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>通过</span>
						<span>"route print"</span>
						<span>命令查询当前计算机的默认网关（显示在</span>
						<span>Default Gateway</span>
						<span>后面的就是默认网关地址）。如果显示为</span>
						<span>192.168.1.1</span>
						<span>则说明默认以网通线路为出口，如果是</span>
						<span>192.168.0.1</span>
						<span>则说明默认以电信线路为出口。</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>第三步：</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>这里假设默认网关是电信出口．网通</span>
						<span>IP</span>
						<span>段为</span>
						<span>61.156.0.0</span>
						<span>，那么我们需要手工添加网通线路的地址段路由信息。进入到命令行模式输人</span>
						<span>route add -p 61.156.0.0 mask255.255.0.0 192.168.1.1</span>
						<span>，这句指令将规定凡是传输到</span>
						<span>61.156.0.0</span>
						<span>这个地址段的数据都发送到</span>
						<span>192.168.1.1</span>
						<span>这个网通出口网卡。</span>
				</p>
				<p>
						<span>
								<span style="">  </span>
						</span>
						<span>第四步：</span>
				</p>
				<p>
						<span>
								<span style="">     </span>
						</span>
						<span>依次添加所有网通地址段到本机路由表，设置完毕后我们访问网通线路和电信线路的速度都将有所保障。</span>
				</p>
		</div>
<img src ="http://www.cppblog.com/nt05/aggbug/64357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:46 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windos2003路由器配置</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64356.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:40:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64356.html</guid><description><![CDATA[Microsoft Windows Server 2003 的“路由和远程访问”服务是一个全功能的软件<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>，也是用于路由和互连网络工作的开放平台。它为局域网 (LAN) 和广域网 (WAN) 环境中的商务活动，或使用安全虚拟专用网 (VPN) 连接的 Internet 上的商务活动提供路由选择服务。<br />
　　<br />
　　“路由和远程访问”服务的优点之一是与 Microsoft Windows Server 2003
家族集成。“路由和远程访问”服务提供了很多经济功能，并且和多种硬件平台和数以百计的网卡一起工作。“路由和远程访问”服务可以通过应用程序编程接口
(API) 进行扩展，开发人员可以使用 API 创建客户网络连接方案，新供应商可以使用 API 参与到不断增长的开放互联网络商务中。<br />
　　<br />
　　运行“路由和远程访问”的服务器是专门为已经熟悉路由协议和路由服务的系统管理员而设计的。通过“路由和远程访问”服务，管理员可以查看和管理他们网络上的<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>和远程访问服务器。<br />
　　<br />
　　Windows 2003 server“路由和远程访问”服务提供多协议路由服务，包括 LAN 到 LAN、LAN 到 WAN、虚拟专用网
(VPN) 以及网络地址转换 (NAT)。“路由和远程访问”主要供已经熟悉路由协议和服务以及可路由协议（例如 TCP/IP 和
AppleTalk）的系统管理员使用。本文只讨论做软件<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>。 
<p class="Bnp944">bbs.bitsCN.com国内最早的网管论坛</p><br />
　　下面是使用Windows 2003 server作为软件<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>的具体操作步骤：<br />
　　<br />
　　1、单击“开始→所有程序→管理工具→路由和远程访问”，如图1所示，打开“路由和远程访问”管理窗口，如图2所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202038_08_410.jpg" /></center><br />
　　 <center>图一</center><br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202038_09_223.jpg" /></center><br />
　　 <center>图二</center><br />
　　<br />
　　2、选择左边树目录下的“路由和远程访问”根目录，然后单击鼠标右键，在弹出的对话框中选择“增加服务器”选项，如上图所示。<br />
　　<br />
　　3、在“增加服务器”对话框中，选中本地计算机作为路由和远程访问服务器，单击“确认”按钮即可，如图3所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202038_010_786.jpg" /></center><br />
　　 <center>图三</center><br />
　　<br />
　　4、添加好服务器后，接下来我们必须要配置并启用它。选择添加的服务器，然后单击鼠标右键，在弹出的对话框中选择“配置并启用路由和远程访问”选项，如下图4所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202038_011_185.jpg" /></center><font color="#ffffff">bitsCN全力打造网管学习平台</font><br />
　　 <center>图四</center><br />
　　<br />
　　5、在“路由和远程访问安装向导”的欢迎界面上单击“下一步”按钮继续，如下图5所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202039_012_543.jpg" /></center><br />
　　 <center>图五</center><br />
　　<br />
　　6、在“公共设置”对话框中勾选“两个专用网络之间的安全连接”（在windows 2000 server中是“网络<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>”）单选框，然后单击“下一步”按钮继续，如图6所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202039_013_374.jpg" /></center><br />
　　 <center>图六</center><br />
　　<br />
　　7、在“请求拨号连接”对话框中选择“否”单选框，然后单击“下一步”按钮继续，如图7所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202039_014_446.jpg" /></center><br />
　　 <center>图七</center><br />
　　<br />
　　8、接着向导弹出一个对话框，提示用户安装完成，单击“完成”按钮，如图8所示；出现一个正在完成初始化对话框，几秒钟后，“路由和远程访问”服务器安装才全部完成，如图9所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202040_015_108.jpg" /></center><span class="Bnp944">so.bitsCN.com网管资料库任你搜</span><br />
　　 <center>图八</center><br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202040_016_159.jpg" /></center><br />
　　 <center>图九</center><br />
　　<br />
　　这时，我们在“路由和远程访问”管理窗口可以看到添加的服务器已启动，如下图10所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202040_017_534.jpg" /></center><br />
　　 <center>图十</center><br />
　　Windows 2003 软件<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>的使用实例<br />
　　<br />
　　某单位机房的计算机IP地址设置在不同的网段上，一个为192.168.1.0，另一个为192.168.2.0。在没有<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>的情况下，在同一个IP子网内的主机才能通信；主机不在同一网段内，即使通过同一个交换机或集线器连接（如在交换机划分不同的VLAN）也无法相互通信。<br />
　　<br />
　　我们可以在一台Windows 2003 Server服务器上绑定两个IP地址：192.168.1.1和192.168.2.1，然后在Win 2003 Server 上启动路由服务，将Windows 2003 Server作为<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>，实现两个网段的互连互通。其网络连接示意图如下图11所示： <font color="#ffffff">bitsCN.com中国网管联盟</font><br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202041_018_255.jpg" /></center><br />
　　 <center>图11</center><br />
　　<br />
　　<strong>具体设置步骤如下：</strong><br />
　　<br />
　　<strong>服务器的设置</strong><br />
　　<br />
　　按照上面所说的方法启动Windows 2003 Server上的<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>。<br />
　　<br />
　　为Windows 2003 Server绑定两个IP地址：192.168.1.1和192.168.2.1。其绑定方法如下：<br />
　　打开“本地连接”的“属性”对话框，选择“Internet协议（TCP/IP属性）”，单击“属性”按钮，为服务器绑定第一个IP地
址：192.168.1.1，子网掩码设为：255.255.255.0，如图12所示；然后单击“高级”按钮，在高级TCP/IP设置的IP地址，单击
“添加”按钮，为服务器绑定第2个IP地址：192.168.2.1，子网掩码设为：255.255.255.0，如图13所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202041_019_970.jpg" /></center><br />
　　 <center>图12</center><br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202042_020_692.jpg" /></center><br />
　　 <center>图13</center><br />
　　<br />
　　设置完成后，单击“确定”按钮退出，如图14所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202043_021_698.jpg" /></center><font color="#ffffff">需要什么来搜一搜吧so.bitsCN.com</font><br />
　　 <center>图14</center><br />
　　<strong>客户机的设置</strong><br />
　　<br />
　　客户端设置比较简单，在win
2000/xp的环境下，在网卡的“Internet协议（TCP/IP属性）”中，IP地址为1网段的如192.168.1.67的这台机器上，默认的
网关输入服务器IP地址192.168.1.1，如图15所示；IP地址为2网段的如192.168.2.35的这台机器上，默认的网关输入服务器IP地
址192.168.2.1，如图16所示。<br />
　　<br />
　　 <center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202043_022_730.jpg" /></center><br />
　　 <center>图15</center><br />
　　 <center><img src="http://www.bitscn.com/upimg/2006-04-12/202044_023_695.jpg" />　</center><center>图16</center><center>　
如果客户端是windows 98系统，则在网卡的“
ICP/IP属性”中首先指定IP地址如192.168.1.67（1网段）的机器上（图17），在“网关”选项卡中，在“新网关”下面的IP地址栏输入
服务器IP地址192.168.1.1，然后再单击“添加”按钮即可，如图18所示。<br />
　　<br />
　　 </center><center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202036_03_469.jpg" /></center><center><br />
　　 </center><center>图17</center><center><br />
　　 </center><center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202036_04_629.jpg" /></center><center><br />
　　 </center><center>图18</center><center><br />
　　同样地如IP地址为192.168.2.35（2网段）机器上是windows 98系统（图19），在“网关”选项卡中，在“新网关”下面的IP地址栏输入服务器IP地址192.168.2.1，然后再单击“添加”按钮即可，如图20所示。<br />
　　<br />
　　 </center><center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202036_05_190.jpg" /></center><center><br />
　　 </center><center>图19</center><center><br />
　　 </center><center>　<img src="http://www.bitscn.com/upimg/2006-04-12/202037_06_871.jpg" /></center><center><br />
　　 </center><center>图20</center><center><br />
　　<br />
　　如果两个子网各自使用不同的交换机或集线器，那只要将做<a href="http://www.bitscn.com/netpro/router/"><u>路由器</u></a>的Windows 2003 Server服务器的机器安装两个网卡，分别连接到两个子网，再将两个网卡的IP地址设置成各自相连接的子网的网关IP地址就可以了，这里对于这种情况就不在单独说明，实际上实现的原理还是一样的，其网络连接示意图如下图21所示。 <font color="#ffffff">需要什么来搜一搜吧so.bitsCN.com</font><br />
　　<br />
　　 </center><center><img src="http://www.bitscn.com/upimg/2006-04-12/202037_07_489.jpg" /></center><img src ="http://www.cppblog.com/nt05/aggbug/64356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:40 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>缓存PHP页面的代码，可以减轻CPU和MYSQL负担</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64355.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:39:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64355.html</guid><description><![CDATA[
		<span class="bold">缓存PHP页面的代码，可以减轻CPU和MYSQL负担</span>
		<br />
		<br />
使用前，先在根目录创建“cache”文件夹，然后运行1.php，第一次运行和第二次运行速度差异很大。<br />
欢迎熟悉PHP的朋友使用和提意见。<br /><br />
使用方法：（请保存为1.php）<br /><div class="msgbody"><div class="msgborder"><br />
&lt;?<br />
include('arrcache.php');<br />
$cache = new ArrCache('cache',5,'txt');<br /><br />
for ($i=0;$i&lt;5;$i++)<br />
{<br />
   echo $i;<br />
   sleep(1);<br />
}<br /><br /><br />
$cache-&gt;endCache();<br />
?&gt;</div></div><br />
源代码：（请保存为'arrcache.php'）<br /><br /><div class="msgbody"><div class="msgborder">&lt;?<br />
/*<br />
* 名称: 极光缓存<br />
*<br />
* 作者: DCD<br />
* mail: haodan-_-b@163.com<br />
*<br />
* web开发群: 3574636<br />
* http://www.525ok.com<br />
*<br />
* 完成日期: 2006-2-27<br />
*<br />
* 版本：V1.00<br />
*<br />
* 说明：<br />
*<br />
*        缓存网页内容，减轻服务器CPU负荷，使用简便、灵活。<br />
*        本程序主要对MYSQL的select操作进行优化，还有部分小偷类程序。<br />
*        比如在百度搜索一个不常见的关键字，第一次搜索速度非常慢，“找到相关网页181篇，用时0.426秒”<br />
*        那么再搜索一次，就会变成“找到相关网页181篇，用时0.001秒”。<br />
*        本程序就是使用了类似的方法缓存数据到服务器硬盘，减轻CPU和数据库负荷。<br />
*        请根据您页面日访问量来设定缓存时间。<br />
*        使用前，一定先创建好缓存目录。<br />
*<br />
* 注意：<br />
*<br />
*        不是所有页面都需要使用本程序。<br />
*        缓存文件会占用一定硬盘空间。<br />
*        例如需要对数据库进行inster、delete、update操作的页面不要使用，select可以。<br />
*        mail()、fwrite()等函数，将不产生任何作用。<br />
*        请不要将缓存时间设置得太小（小于5秒），那样不会减轻负荷<br />
*        如果你的页面访问量不太高，也不要使用本代码。<br />
*<br />
* 使用方法：<br />
*<br />
*        include('arrcache.php');//必须在文件最开始处包含本页<br />
*        $cache = new ArrCache('cache');//设置缓存文件夹<br />
*        ……<br />
*        ……<br />
*        ……//代码<br />
*        $cache-&gt;endCache();//在文件最后写入<br />
*<br />
* 说明:<br />
*<br />
*      class ArrCache(string path,[int time],[string type]);<br />
*        path：       cache文件保存目录，从根目录算起，首尾不需要“/”<br />
*        time：               缓存时间，默认120秒<br />
*        type：               缓存文件后缀，默认“txt”<br />
*<br />
*      void endCache();<br />
*        在页面最后写上，否则这行后边的数据不会被缓存。<br />
*<br />
*/<br />
ob_start();<br />
class ArrCache<br />
{<br /><br />
//构造函数<br />
function ArrCache($path,$time = 120,$type = 'txt')<br />
{<br />
   $this-&gt;path      = $path;<br />
   $this-&gt;time      = $time;<br />
   $this-&gt;fileType = $type;<br />
   $this-&gt;fileName =
$_SERVER['DOCUMENT_ROOT'].'\\'.$this-&gt;path.'\\'.md5($_SERVER['URL'].'?'.$_SERVER['QUERY_STRING']).'.'.$this-&gt;fileType;<br />
   if (file_exists($this-&gt;fileName) &amp;&amp; ((filemtime($this-&gt;fileName)+$this-&gt;time) &gt; time()))<br />
   {<br />
     $fp = fopen($this-&gt;fileName,"r");<br />
     echo fread($fp,filesize($this-&gt;fileName));<br />
     fclose($fp);<br />
     ob_end_flush();<br />
     exit;<br />
   }<br />
}<br /><br />
//在文件最后加入这行，输出所有缓存内容，并且写入缓存文件。<br />
function endCache()<br />
{<br />
   $fp       = fopen($this-&gt;fileName,"w");<br />
   fwrite($fp,ob_get_contents());<br />
   fclose($fp);<br />
   ob_end_flush();<br />
}<br /><br />
}//end class<br />
?&gt;</div></div><img src ="http://www.cppblog.com/nt05/aggbug/64355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:39 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows文件共享设置</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64354.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:37:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64354.html</guid><description><![CDATA[请确定你的B机器是以管理员的身份登录。 <br />
在A机器上开启GUEST帐户。 <br />
打开组策略编辑器，依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利指派”，删除“拒绝从网络访问这台计算机”策略中的“GUEST”账号。 <br />
打开组策略编辑器，依次选择“计算机配置→Windows设置→安全设置→本地策略→安全选项”，双击“网络访问：本地账号的共享和安全模式”策略，将 “仅来宾—本地用户以来宾身份验证”改为“经典：本地用户以自己的<img src ="http://www.cppblog.com/nt05/aggbug/64354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:37 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>适用于 php-5.2 的 php.ini 中文版</title><link>http://www.cppblog.com/nt05/archive/2008/10/19/64353.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sat, 18 Oct 2008 20:23:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/19/64353.html</guid><description><![CDATA[
		<pre>[PHP-Core-OutputControl]<br />; 输出控制函数很有用，特别是在已经输出了信息之后再发送HTTP头的情况下。<br />; 输出控制函数不会作用于header()或setcookie()等函数发送的HTTP头，<br />; 而只会影响类似于echo()函数输出的信息和嵌入在PHP代码之间的信息。<br /><br />implicit_flush = Off<br />; 是否要求PHP输出层在每个输出块之后自动刷新数据。<br />; 这等效于在每个 print()、echo()、HTML块 之后自动调用flush()函数。<br />; 打开这个选项对程序执行的性能有严重的影响，通常只推荐在调试时使用。<br />; 在CLI SAPI的执行模式下，该指令默认为 On 。<br /><br />output_buffering = 0<br />; 输出缓冲区大小(字节)。建议值为4096~8192。<br />; 输出缓冲允许你甚至在输出正文内容之后再发送HTTP头(包括cookies)。<br />; 其代价是输出层减慢一点点速度。<br />; 设置输出缓冲可以减少写入，有时还能减少网络数据包的发送。<br />; 这个参数的实际收益很大程度上取决于你使用的是什么Web服务器以及什么样的脚本。<br /><br />output_handler =<br />; 将所有脚本的输出重定向到一个输出处理函数。<br />; 比如，重定向到mb_output_handler()函数时，字符编码将被透明地转换为指定的编码。<br />; 一旦你在这里指定了输出处理程序，输出缓冲将被自动打开(output_buffering=4096)。<br />; 注意0: 此处仅能使用PHP内置的函数，自定义函数应在脚本中使用ob_start()指定。<br />; 注意1: 可移植脚本不能依赖该指令，而应使用ob_start()函数明确指定输出处理函数。<br />;        使用这个指令可能会导致某些你不熟悉的脚本出错。<br />; 注意2: 你不能同时使用"mb_output_handler"和"ob_iconv_handler"两个输出处理函数。<br />;        你也不能同时使用"ob_gzhandler"输出处理函数和zlib.output_compression指令。<br />; 注意3: 如果使用zlib.output_handler指令开启zlib输出压缩，该指令必须为空。<br /><br /><br />[PHP-Core-Directory]<br /><br />include_path = ".:/path/to/php/pear"<br />; 指定一组目录用于require(), include(), fopen_with_path()函数寻找文件。<br />; 格式和系统的PATH环境变量类似(UNIX下用冒号分隔，Windows下用分号分隔)：<br />; UNIX: "/path1:/path2"<br />; Windows: "\path1;\path2"<br />; 在包含路径中使用'.'可以允许相对路径，它代表当前目录。<br /><br />user_dir =<br />; 告诉php在使用 /~username 打开脚本时到哪个目录下去找，仅在非空时有效。<br />; 也就是在用户目录之下使用PHP文件的基本目录名，例如："public_html"<br /><br />extension_dir = "/path/to/php"<br />; 存放扩展库(模块)的目录，也就是PHP用来寻找动态扩展模块的目录。<br />; Windows下默认为"C:/php5"<br /><br /><br />[PHP-Core-HTTP]<br /><br />default_mimetype = "text/html"<br />default_charset =  ;"gb2312"<br />; PHP默认会自动输出"Content-Type: text/html" HTTP头。<br />; 如果将default_charset指令设为"gb2312"，<br />; 那么将会自动输出"Content-Type: text/html; charset=gb2312"。<br />; PHP6反对使用default_charset指令，而推荐使用unicode.output_encoding指令。<br /><br /><br />[PHP-Core-Unicode]<br />; PHP6基于ICU(International Components for Unicode)库提供了全面的Unicode支持。<br />; 编译时需要使用--with-icu-dir=&lt;dir&gt;指定ICU头文件和库的安装位置。<br />; 除detect_unicode外，其他都是PHP6新增的指令。<br />; <br />; PHP6的信息目前还很缺乏，所以此部分内容可能不完整甚至有错误。<br /><br />detect_unicode = On<br />; 指示Zend引擎是否通过检查脚本的BOM(字节顺序标记)来检测脚本是否包含多字节字符。<br />; 建议关闭。PHP6已经取消了此指令而用unicode.script_encoding指令来代替其功能。<br /><br />unicode.semantics = Off<br />; 是否启用Unicode支持。<br />; 如果打开此指令，那么PHP将变成一个完全的Unicode环境，比如：<br />; 所有字符串和从HTTP接受的变量都将变成Unicode，所有PHP标识符也都可以使用Unicode字符。<br />; 而且，PHP内部将使用Unicode字符串并负责对外围非Unicode字符进行自动转换，<br />; 比如：HTTP输入输出、流、文件系统操作等等，甚至连php.ini自身都将按照UTF-8编码来解析。<br />; 开启这个指令后，你必须明确指定二进制字符串。PHP将不对二进制字符串的内容做任何假定，<br />; 因此你的程序必须保证能够恰当的处理二进制字符串。<br />; 如果关闭这个指令，PHP的行为将和以前的行为完全相同：<br />; 字符串不会变成Unicode，文件和二进制字符串也将向后兼容，php.ini也将按照"as-is"风格解析。<br />; 不管是否打开此指令，所有的函数和操作符都透明的支持Unicode字符串。<br /><br />unicode.fallback_encoding = UTF-8<br />; 为其他所有unicode.*_encoding指令设置默认值。<br />; 也就是说如果某个unicode.*_encoding指令未明确设置的话，将使用此处设置的值。<br /><br />unicode.runtime_encoding =<br />; 运行时编码指定了PHP引擎内部转换二进制字符串时使用的编码。<br />; 此处的设置对于I/O相关操作(比如：写入标准输出/读取文件系统/解码HTTP输入变量)没有影响。<br />; PHP也允许你明确的对字符串进行转换：<br />; (binary)$str  -- 转化为二进制字符串<br />; (unicode)$str -- 转化为Unicode字符串<br />; (string)$str  -- 如果unicode.semantics为On则转化为Unicode字符串，否则转化为二进制字符串<br />; 例如，如果该指令的值为iso-8859-1并且$uni是一个Unicode字符串，那么<br />; $str = (binary)$uni<br />; 将等到一个使用iso-8859-1编码的二进制字符串。<br />; 在连接、比较、传递参数等操作之前PHP会将相关字符串隐含转换为Unicode，然后再进行操作。<br />; 比如在将二进制字符串与Unicode进行连接的时候，<br />; PHP将会使用这里的设置将二进制字符串转换为Unicode字符串，然后再进行操作。<br /><br />unicode.output_encoding =<br />; PHP输出非二进制字符串使用的编码。<br />; 自动将'print'和'echo'之类的输出内容转换为此处设定的编码(并不对二进制字符串进行转换)。<br />; 当向文件之类的外部资源写入数据的时候，<br />; 你必须依赖于流编码特性或者使用Unicode扩展的函数手动的对数据进行编码。<br />; 在PHP6中反对使用先前的default_charset指令，而推荐使用该指令。<br />; 先前的default_charset指令只是指定了Content-Type头中的字符集，而并不对实际的输出做任何转换。<br />; 而在PHP6中，default_charset指令仅在unicode.semantics为off的时候才有效。<br />; 设置了该指令后将在Content-Type输出头的'charset'部分填上该指令的值，<br />; 而不管default_charset指令如何设置。<br /><br />unicode.http_input_encoding =<br />; 通过HTTP获取的变量(比如$_GET和_$POST)内容的编码。<br />; 直到2007年4月此功能尚在开发中....<br /><br />unicode.filesystem_encoding =<br />; 文件系统的目录名和文件名的编码。<br />; 文件系统相关的函数(比如opendir())将使用这个编码接受和返回文件名和目录名。<br />; 此处的设置必须与文件系统实际使用的编码完全一致。<br /><br />unicode.script_encoding =<br />; PHP脚本自身的默认编码。<br />; 你可以使用任何ICU支持的编码来写PHP脚本。<br />; 如果你想针对单独的脚本文件设定其编码，可以在该脚本的开头使用<br />;   &lt;?php declare(encoding = 'Shift-JIS'); ?&gt;<br />; 来指定。注意：必须是第一行开头，全面不要有任何字符(包括空白)。<br />; 该方法只能影响其所在的脚本，不会影响任何被包含的其他脚本。<br /><br />unicode.stream_encoding = UTF-8<br />unicode.from_error_mode = 2<br />unicode.from_error_subst_char = 3f<br />; 尚无文档<br /><br /><br />[PHP-Core-Misc]<br /><br />auto_detect_line_endings = Off<br />; 是否让PHP自动侦测行结束符(EOL)。<br />; 如果的你脚本必须处理Macintosh文件，<br />; 或者你运行在Macintosh上，同时又要处理unix或win32文件，<br />; 打开这个指令可以让PHP自动侦测EOL，以便fgets()和file()函数可以正常工作。<br />; 但同时也会导致在Unix系统下使用回车符(CR)作为项目分隔符的人遭遇不兼容行为。<br />; 另外，在检测第一行的EOL习惯时会有很小的性能损失。<br /><br />browscap =  ;"c:/windows/system32/inetsrv/browscap.ini"<br />;SYS<br />; 只有PWS和IIS需要这个设置<br />; 你可以从http://www.garykeith.com/browsers/downloads.asp <br />; 得到一个browscap.ini文件。<br /><br />ignore_user_abort = Off<br />; 是否即使在用户中止请求后也坚持完成整个请求。<br />; 在执行一个长请求的时候应当考虑打开该它，<br />; 因为长请求可能会导致用户中途中止或浏览器超时。<br /><br />user_agent =  ;"PHP"<br />; 定义"User-Agent"字符串<br /><br />;url_rewriter.tags = "a=href,area=href,frame=src,form=,fieldset="<br />; 虽然此指令属于PHP核心部分，但是却用于Session模块的配置<br /><br />;extension = <br />; 在PHP启动时加载动态扩展。例如：extension=mysqli.so<br />; "="之后只能使用模块文件的名字，而不能含有路径信息。<br />; 路径信息应当只由extension_dir指令提供。<br />; 主意，在windows上，下列扩展已经内置：<br />; bcmath ; calendar ; com_dotnet ; ctype ; session ; filter ; ftp ; hash<br />; iconv ; json ; odbc ; pcre ; Reflection ; date ; libxml ; standard<br />; tokenizer ; zlib ; SimpleXML ; dom ; SPL ; wddx ; xml ; xmlreader ; xmlwriter<br /><br /><br />[PHP-Core-CGI]<br />; 这些指令只有在将PHP运行在CGI模式下的时候才有效<br /><br />doc_root =<br />; PHP的"CGI根目录"。仅在非空时有效。<br />; 在web服务器的主文档目录(比如"htdocs")中放置可执行程序/脚本被认为是不安全的，<br />; 比如因为配置错误而将脚本作为普通的html显示。<br />; 因此很多系统管理员都会在主文档目录之外专门设置一个只能通过CGI来访问的目录，<br />; 该目录中的内容只会被解析而不会原样显示出来。<br />; 如果设置了该项，那么PHP就只会解释doc_root目录下的文件，<br />; 并确保目录外的脚本都不会被PHP解释器执行(user_dir除外)。<br />; 如果编译PHP时没有指定FORCE_REDIRECT，并且在非IIS服务器上以CGI方式运行，<br />; 则必须设置此指令(参见手册中的安全部分)。<br />; 替代方案是使用的cgi.force_redirect指令。<br /><br />cgi.discard_path = Off<br />; 尚无文档(PHP6新增指令)<br /><br />cgi.fix_pathinfo = On<br />; 是否为CGI提供真正的 PATH_INFO/PATH_TRANSLATED 支持(遵守cgi规范)。<br />; 先前的行为是将PATH_TRANSLATED设为SCRIPT_FILENAME，而不管PATH_INFO是什么。<br />; 打开此选项将使PHP修正其路径以遵守CGI规范，否则仍将使用旧式的不合规范的行为。<br />; 鼓励你打开此指令，并修正脚本以使用 SCRIPT_FILENAME 代替 PATH_TRANSLATED 。<br />; 有关PATH_INFO的更多信息请参见cgi规范。<br /><br />cgi.force_redirect = On<br />; 是否打开cgi强制重定向。强烈建议打开它以为CGI方式运行的php提供安全保护。<br />; 你若自己关闭了它，请自己负责后果。<br />; 注意：在IIS/OmniHTTPD/Xitami上则必须关闭它！<br /><br />cgi.redirect_status_env =<br />; 如果cgi.force_redirect=On，并且在Apache与Netscape之外的服务器下运行PHP，<br />; 可能需要设定一个cgi重定向环境变量名，PHP将去寻找它来知道是否可以继续执行下去。<br />; 设置这个变量会导致安全漏洞，请务必在设置前搞清楚自己在做什么。<br /><br />cgi.rfc2616_headers = 0<br />; 指定PHP在发送HTTP响应代码时使用何种报头。<br />; 0 表示发送一个"Status: "报头，Apache和其它web服务器都支持。<br />; 若设为1，则PHP使用RFC2616标准的头。<br />; 除非你知道自己在做什么，否则保持其默认值 0<br /><br />cgi.nph = Off<br />; 在CGI模式下是否强制对所有请求都发送"Status: 200"状态码。<br /><br />cgi.check_shebang_line =On<br />; CGI PHP是否检查脚本顶部以 #! 开始的行。<br />; 如果脚本想要既能够单独运行又能够在PHP CGI模式下运行，那么这个起始行就是必须的。<br />; 如果打开该指令，那么CGI模式的PHP将跳过这一行。<br /><br />fastcgi.impersonate = Off<br />; IIS中的FastCGI支持模仿客户端安全令牌的能力。<br />; 这使得IIS能够定义运行时所基于的请求的安全上下文。<br />; Apache中的mod_fastcgi不支持此特性(03/17/2002)<br />; 如果在IIS中运行则设为On，默认为Off。<br /><br />fastcgi.logging = On<br />; 是否记录通过FastCGI进行的连接。<br /><br /><br />[PHP-Core-Weirdy]<br />; 这些选项仅存在于文档中，却不存在于phpinfo()函数的输出中<br /><br />async_send = Off<br />; 是否异步发送。<br /><br />from =  ;"john@doe.com"<br />; 定义匿名ftp的密码(一个email地址)<br /><br /><br />;;;;;;;;;;;;;;;;;;<br />;;  近核心模块  ;;<br />;;;;;;;;;;;;;;;;;;<br /><br />[Pcre]<br />;Perl兼容正则表达式模块<br /><br />pcre.backtrack_limit = 100000<br />; PCRE的最大回溯(backtracking)步数。<br /><br />pcre.recursion_limit = 100000<br />; PCRE的最大递归(recursion)深度。<br />; 如果你将该值设的非常高，将可能耗尽进程的栈空间，导致PHP崩溃。<br /><br /><br />[Session]<br />; 除非使用session_register()或$_SESSION注册了一个变量。<br />; 否则不管是否使用了session_start()，都不会自动添加任何session记录。<br />; 包括resource变量或有循环引用的对象包含指向自身的引用的对象，不能保存在会话中。<br />; register_globals指令会影响到会话变量的存储和恢复。<br /><br />session.save_handler = "files"<br />; 存储和检索与会话关联的数据的处理器名字。默认为文件("files")。<br />; 如果想要使用自定义的处理器(如基于数据库的处理器)，可用"user"。<br />; 有一个使用PostgreSQL的处理器：http://sourceforge.net/projects/phpform-ext/<br /><br />session.save_path = "/tmp"<br />; 传递给存储处理器的参数。对于files处理器，此值是创建会话数据文件的路径。<br />; Windows下默认为临时文件夹路径。<br />; 你可以使用"N;[MODE;]/path"这样模式定义该路径(N是一个整数)。<br />; N表示使用N层深度的子目录，而不是将所有数据文件都保存在一个目录下。<br />; [MODE;]可选，必须使用8进制数，默认"600"，表示文件的访问权限。<br />; 这是一个提高大量会话性能的好主意。<br />; 注意0: "N;[MODE;]/path"两边的双引号不能省略。<br />; 注意1: [MODE;]并不会改写进程的umask。<br />; 注意2: php不会自动创建这些文件夹结构。请使用ext/session目录下的mod_files.sh脚本创建。<br />; 注意3: 如果该文件夹可以被不安全的用户访问(比如默认的"/tmp")，那么将会带来安全漏洞。<br />; 注意4: 当N&gt;0时自动垃圾回收将会失效，具体参见下面有关垃圾搜集的部分。<br /><br />session.name = "PHPSESSID"<br />;用在cookie里的会话ID标识名，只能包含字母和数字。<br /><br />session.auto_start = Off<br />; 在客户访问任何页面时都自动初始化会话，默认禁止。<br />; 因为类定义必须在会话启动之前被载入，所以若打开这个选项，你就不能在会话中存放对象。<br /><br />session.serialize_handler = "php"<br />; 用来序列化/解序列化数据的处理器，php是标准序列化/解序列化处理器。<br />; 另外还可以使用"php_binary"。当启用了WDDX支持以后，将只能使用"wddx"。<br /><br />session.gc_probability = 1<br />session.gc_divisor = 100<br />; 定义在每次初始化会话时，启动垃圾回收程序的概率。<br />; 这个收集概率计算公式如下：session.gc_probability/session.gc_divisor<br />; 对会话页面访问越频繁，概率就应当越小。建议值为1/1000~5000。<br /><br />session.gc_maxlifetime = 1440<br />; 超过此参数所指的秒数后，保存的数据将被视为'垃圾'并由垃圾回收程序清理。<br />; 判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。<br />; 如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同，<br />; 那么将以所有session.gc_maxlifetime指令中的最小值为准。<br />; 如果使用多层子目录来存储数据文件，垃圾回收程序不会自动启动。<br />; 你必须使用一个你自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。<br />; 比如，下面的脚本相当于设置了"session.gc_maxlifetime=1440" (24分钟)：<br />; cd /path/to/sessions; find -cmin +24 | xargs rm<br /><br />session.referer_check =<br />; 如果请求头中的"Referer"字段不包含此处指定的字符串则会话ID将被视为无效。<br />; 注意：如果请求头中根本不存在"Referer"字段的话，会话ID将仍将被视为有效。<br />; 默认为空，即不做检查(全部视为有效)。<br /><br />session.entropy_file =  ;"/dev/urandom"<br />; 附加的用于创建会话ID的外部高熵值资源(文件)，<br />; 例如UNIX系统上的"/dev/random"或"/dev/urandom"<br /><br />session.entropy_length = 0<br />; 从高熵值资源中读取的字节数(建议值：16)。<br /><br />session.use_cookies = On<br />; 是否使用cookie在客户端保存会话ID<br /><br />session.use_only_cookies = Off<br />; 是否仅仅使用cookie在客户端保存会话ID。PHP6的默认值为On。<br />; 打开这个选项可以避免使用URL传递会话带来的安全问题。<br />; 但是禁用Cookie的客户端将使会话无法工作。<br /><br />session.cookie_lifetime = 0<br />; 传递会话ID的Cookie有效期(秒)，0 表示仅在浏览器打开期间有效。<br />; [提示]如果你不能保证服务器时间和客户端时间严格一致请不要改变此默认值！<br /><br />session.cookie_path = "/"<br />; 传递会话ID的Cookie作用路径。<br /><br />session.cookie_domain =<br />; 传递会话ID的Cookie作用域。<br />; 默认为空表示表示根据cookie规范生成的主机名。<br /><br />session.cookie_secure = Off<br />; 是否仅仅通过安全连接(https)发送cookie。<br /><br />session.cookie_httponly = Off<br />; 是否在cookie中添加httpOnly标志(仅允许HTTP协议访问)，<br />; 这将导致客户端脚本(JavaScript等)无法访问该cookie。<br />; 打开该指令可以有效预防通过XSS攻击劫持会话ID。<br /><br />session.cache_limiter = "nocache"<br />; 设为{nocache|private|public}以指定会话页面的缓存控制模式，<br />; 或者设为空以阻止在http应答头中发送禁用缓存的命令。<br /><br />session.cache_expire = 180<br />; 指定会话页面在客户端cache中的有效期限(分钟)<br />; session.cache_limiter=nocache时，此处设置无效。<br /><br />session.use_trans_sid = Off<br />; 是否使用明码在URL中显示SID(会话ID)。<br />; 默认是禁止的，因为它会给你的用户带来安全危险：<br />; 1- 用户可能将包含有效sid的URL通过email/irc/QQ/MSN...途径告诉给其他人。<br />; 2- 包含有效sid的URL可能会被保存在公用电脑上。<br />; 3- 用户可能保存带有固定不变sid的URL在他们的收藏夹或者浏览历史纪录里面。<br />; 基于URL的会话管理总是比基于Cookie的会话管理有更多的风险，所以应当禁用。<br /><br />session.bug_compat_42 = On<br />session.bug_compat_warn = On<br />; PHP4.2之前的版本有一个未注明的"BUG"：<br />; 即使在register_globals=Off的情况下也允许初始化全局session变量，<br />; 如果你在PHP4.3之后的版本中使用这个特性，会显示一条警告。<br />; 建议关闭该"BUG"并显示警告。PHP6删除了这两个指令，相当于全部设为Off。<br /><br />session.hash_function = 0<br />; 生成SID的散列算法。SHA-1的安全性更高一些<br />; 0: MD5   (128 bits)<br />; 1: SHA-1 (160 bits)<br />; 建议使用SHA-1。<br /><br />session.hash_bits_per_character = 4<br />; 指定在SID字符串中的每个字符内保存多少bit，<br />; 这些二进制数是hash函数的运算结果。<br />; 4: 0-9, a-f<br />; 5: 0-9, a-v<br />; 6: 0-9, a-z, A-Z, "-", ","<br />; 建议值为 5<br /><br />url_rewriter.tags = "a=href,area=href,frame=src,form=,fieldset="<br />; 此指令属于PHP核心部分，并不属于Session模块。<br />; 指定重写哪些HTML标签来包含SID(仅当session.use_trans_sid=On时有效)<br />; form和fieldset比较特殊：<br />; 如果你包含他们，URL重写器将添加一个隐藏的"&lt;input&gt;"，它包含了本应当额外追加到URL上的信息。<br />; 如果要符合XHTML标准，请去掉form项并在表单字段前后加上&lt;fieldset&gt;标记。<br />; 注意：所有合法的项都需要一个等号(即使后面没有值)。<br />; 推荐值为"a=href,area=href,frame=src,input=src,form=fakeentry"。<br /><br />session.encode_sources = "globals"<br />; PHP6中有争议的指令，尚未决定是否采用该指令。也尚无相关文档。<br /><br /><br />;;;;;;;;;;;;;;;;<br />;;  其他模块  ;;<br />;;;;;;;;;;;;;;;;<br /><br />[APC]<br />; Alternative PHP Cache 用于缓存和优化PHP中间代码<br /><br />apc.enabled = On<br />; 是否启用APC，如果APC被静态编译进PHP又想禁用它，这是唯一的办法。<br /><br />apc.enable_cli = Off<br />; 是否为CLI版本启用APC功能，仅用于测试和调试目的才打开此指令。<br /><br />apc.cache_by_default = On<br />; 是否默认对所有文件启用缓冲。<br />; 若设为Off并与以加号开头的apc.filters指令一起用，则文件仅在匹配过滤器时才被缓存。<br /><br />apc.file_update_protection = 2<br />; 当你在一个运行中的服务器上修改文件时，你应当执行原子操作。<br />; 也就是先写进一个临时文件，然后将该文件重命名(mv)到最终的名字。<br />; 文本编辑器以及 cp, tar 等程序却并不是这样操作的，从而导致有可能缓冲了残缺的文件。<br />; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。<br />; 那个不幸的访问者可能得到残缺的内容，但是这种坏影响却不会通过缓存扩大化。<br />; 如果你能确保所有的更新操作都是原子操作，那么可以用 0 关闭此特性。<br />; 如果你的系统由于大量的IO操作导致更新缓慢，你就需要增大此值。<br /><br />apc.filters =<br />; 一个以逗号分隔的POSIX扩展正则表达式列表。<br />; 如果源文件名与任意一个模式匹配，则该文件不被缓存。<br />; 注意，用来匹配的文件名是传递给include/require的文件名，而不是绝对路径。<br />; 如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存，<br />; 如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值，可以省略掉。<br /><br />apc.ttl = 0<br />; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~86400。<br />; 设为 0 意味着缓冲区有可能被旧的缓存条目填满，从而导致无法缓存新条目。<br /><br />apc.user_ttl = 0<br />; 类似于apc.ttl，只是针对每个用户而言，建议值为7200~86400。<br />; 设为 0 意味着缓冲区有可能被旧的缓存条目填满，从而导致无法缓存新条目。<br /><br />apc.gc_ttl = 3600<br />; 缓存条目在垃圾回收表中能够存在的秒数。<br />; 此值提供了一个安全措施，即使一个服务器进程在执行缓存的源文件时崩溃，<br />; 而且该源文件已经被修改，为旧版本分配的内存也不会被回收，直到达到此TTL值为止。<br />; 设为零将禁用此特性。<br /><br />apc.include_once_override = Off<br />; 优化include_once()和require_once()函数以避免执行额外的系统调用。<br /><br />apc.max_file_size = 1M<br />; 禁止大于此尺寸的文件被缓存。<br /><br />apc.mmap_file_mask =<br />; 如果使用--enable-mmap(默认启用)为APC编译了MMAP支持，<br />; 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为"/tmp/apc.XXXXXX")。<br />; 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。<br />; 对于直接的file-backed内存映射，要设置成"/tmp/apc.XXXXXX"的样子(恰好6个X)。<br />; 要使用POSIX风格的shm_open/mmap就需要设置成"/apc.shm.XXXXXX"的样子。<br />; 你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。<br />; 不定义此指令则表示强制使用匿名映射。<br /><br />apc.num_files_hint = 1000<br />; Web服务器上可能被包含或被请求的不同脚本源代码文件的大致数量(建议值为1024~4096)。<br />; 如果你不能确定，则设为 0 ；此设定主要用于拥有数千个源文件的站点。<br /><br />apc.optimization = 0<br />; 优化级别(建议值为 0 ) 。反对使用该指令。将来可能会被删除。<br />; 正整数值表示启用优化器，值越高则使用越激进的优化。<br />; 更高的值可能有非常有限的速度提升，但目前尚在试验中。<br /><br />apc.report_autofilter = Off<br />; 是否记录所有由于early/late binding原因而自动未被缓存的脚本。<br /><br />apc.shm_segments = 1<br />; 为编译器缓冲区分配的共享内存块数量(建议值为1)。<br />; 如果APC耗尽了共享内存，并且已将apc.shm_size指令设为系统允许的最大值，可以尝试增大此值。<br />; 在mmap模式下设置为 1 之外的其它值是无效的，因为经过mmap的共享内存段的大小是没有限制的。<br /><br />apc.shm_size = 30<br />; 每个共享内存块的大小(以MB为单位，建议值为128~256)。<br />; 有些系统(包括大多数BSD变种)默认的共享内存块大小非常少。<br /><br />apc.slam_defense = 0<br />; 在非常繁忙的服务器上，无论是启动服务还是修改文件，<br />; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。<br />; 这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。<br />; 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存，从而减少碰撞几率。<br />; 反对使用该指令，鼓励设为 0 来禁用这个特性。建议该用apc.write_lock指令。<br /><br />apc.stat = On<br />; 是否启用脚本更新检查。<br />; 改变这个指令值要非常小心。<br />; 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新，<br />; 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。<br />; 如果设为 Off 则表示不进行检查，从而使性能得到大幅提高。<br />; 但是为了使更新的内容生效，你必须重启Web服务器。<br />; 这个指令对于include/require的文件同样有效。但是需要注意的是，<br />; 如果你使用的是相对路径，APC就必须在每一次include/require时都进行检查以定位文件。<br />; 而使用绝对路径则可以跳过检查，所以鼓励你使用绝对路径进行include/require操作。<br /><br />apc.user_entries_hint = 4096<br />; 类似于num_files_hint指令，只是针对每个不同用户而言。<br />; 如果你不能确定，则设为 0 。<br /><br />apc.write_lock = On<br />; 是否启用写入锁。<br />; 在非常繁忙的服务器上，无论是启动服务还是修改文件，<br />; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。<br />; 启用该指令可以避免竞争条件的出现。<br /><br />apc.rfc1867 = Off<br />; 打开该指令后，对于每个恰好在file字段之前含有APC_UPLOAD_PROGRESS字段的上传文件，<br />; APC都将自动创建一个upload_&lt;key&gt;的用户缓存条目(&lt;key&gt;就是APC_UPLOAD_PROGRESS字段值)。<br />; 需要注意的是，文件上传跟踪在这里并不是线程安全的，<br />; 所以如果老文件尚未上载完毕且新文件已经开始上载，那么将丢失对老文件的跟踪。<br /><br />apc.localcache = Off<br />; 是否使用非锁定本地进程shadow-cache ，它可以减少了向缓冲区写入时锁之间的竞争。<br /><br />apc.localcache.size = 512<br />; 本地进程的shadow-cache，应当设为一个足够大的值，大约相当于num_files_hint的一半。<br /><br />apc.stat_ctime = Off<br />; 尚无文档<br /><br /><br />[bcmath]<br />; 为任意精度数学计算提供了二进制计算器(Binary Calculator)，<br />; 它支持任意大小和精度的数字，以字符串形式描述。<br /><br />bcmath.scale = 0<br />; 用于所有bcmath函数的10十进制数的个数<br /><br /><br />[GD]<br /><br />gd.jpeg_ignore_warning = Off<br />; 是否忽略jpeg解码器的警告信息(比如无法识别图片格式)。<br />; 有image/jpeg与image/pjpeg两种MIME类型，GD库只能识别前一种传统格式。<br />; 参见：http://twpug.net/modules/newbb/viewtopic.php?topic_id=1867&amp;forum=14<br />; http://bugs.php.net/bug.php?id=29878<br />; http://www.faqs.org/faqs/jpeg-faq/part1/section-11.html<br /><br /><br />[Filter]<br />; 对来源不可靠的数据进行确认和过滤，本扩展模块是实验性的。<br /><br />filter.default = "unsafe_raw"<br />; 使用指定的过滤器过滤$_GET,$_POST,$_COOKIE,$_REQUEST数据，<br />; 原始数据可以通过input_get()函数访问。<br />; "unsafe_raw"表示不做任何过滤。<br /><br />filter.default_flags =<br />; filter_data()函数的默认标志。<br /><br /><br />[mbstring]<br />;多字节字符串模块支持<br /><br />mbstring.language = "neutral"<br />; 默认的NLS(本地语言设置)，可设置值如下：<br />; 默认值"neutral"表示中立，相当于未知。<br />; "zh-cn"或"Simplified Chinese"表示简体中文<br />; "zh-tw"或"Traditional Chinese"表示繁体中文<br />; "uni"或"universal"表示Unicode<br />; 该指令自动定义了随后的mbstring.internal_encoding指令默认值，<br />; 并且mbstring.internal_encoding指令必须放置在该指令之后。<br /><br />mbstring.internal_encoding =<br />; 本指令必须放置在mbstring.language指令之后。<br />; 默认的内部编码，未设置时取决于mbstring.language指令的值：<br />; "neutral" 对应 "ISO-8859-1"<br />; "zh-cn"   对应 "EUC-CN" (等价于"GB2312")<br />; "zh-tw"   对应 "EUC-TW" (等价于"BIG5")<br />; "uni"     对应 "UTF-8"<br />; 提醒：对于简体中文还可以强制设置为"CP936" (等价于"GBK")<br />; 注意：可能 SJIS, BIG5, GBK 不适合作为内部编码，不过"GB2312"肯定没问题。<br />; 建议手动强制指定<br /><br />mbstring.encoding_translation = Off<br />; 是否对进入的HTTP请求按照mbstring.internal_encoding指令进行透明的编码转换，<br />; 也就是自动检测输入字符的编码并将其透明的转化为内部编码。<br />; 可移植的库或者程序千万不要依赖于自动编码转换。<br /><br />mbstring.http_input = "pass"<br />; 默认的HTTP输入编码，"pass"表示跳过(不做转换)<br />; "aotu"的含义与mbstring.detect_order指令中的解释一样。<br />; 可以设置为一个单独的值，也可以设置为一个逗号分隔的列表。<br /><br />mbstring.http_output = "pass"<br />; 默认的HTTP输出编码，"pass"表示跳过(不做转换)<br />; "aotu"的含义与mbstring.detect_order指令中的解释一样。<br />; 可以设置为一个单独的值，也可以设置为一个逗号分隔的列表。<br />; 必须将output_handler指令设置为"mb_output_handler"才可以。<br /><br />mbstring.detect_order =<br />; 默认的编码检测顺序，"pass"表示跳过(不做转换)。<br />; 默认值("auto")随mbstring.language指令的不同而变化：<br />; "neutral"和"universal" 对应 "ASCII, UTF-8"<br />; "Simplified Chinese"   对应 "ASCII, UTF-8, EUC-CN, CP936"<br />; "Traditional Chinese"  对应 "ASCII, UTF-8, EUC-TW, BIG-5"<br />; 建议在可控环境下手动强制指定一个单一值<br /><br />mbstring.func_overload = 0<br />; 自动使用 mb_* 函数重载相应的单字节字符串函数。<br />; 比如：mail(), ereg() 将被自动替换为mb_send_mail(), mb_ereg()<br />; 可用 0,1,2,4 进行位组合。比如7表示替换所有。具体替换说明如下：<br />; 0: 无替换<br />; 1: mail() → mb_send_mail()<br />; 2: strlen() → mb_strlen() ; substr() → mb_substr()<br />;    strpos() → mb_strpos() ; strrpos() → mb_strrpos()<br />;    strtolower() → mb_strtolower() ; strtoupper() → mb_strtoupper()<br />;    substr_count() → mb_substr_count()<br />; 4: ereg() → mb_ereg() ; eregi() → mb_eregi()<br />;    ereg_replace() → mb_ereg_replace() ; eregi_replace() → mb_eregi_replace()<br />;    split() → mb_split()<br /><br />mbstring.script_encoding =<br />; 脚本所使用的编码<br /><br />mbstring.strict_detection = Off<br />; 是否使用严谨的编码检测<br /><br />mbstring.substitute_character =<br />; 当某个字符无法解码时，就是用这个字符替代。<br />; 若设为一个整数则表示对应的Unicode值，不设置任何值表示不显示这个错误字符。<br />; 建议设为"□"<br /><br /><br />[Mcrypt]<br />; 一个mcrypt库的接口，该库支持许多种块加密算法。<br />; 不建议使用该模块，因为毛病太多，建议在数据库层进行加密。<br /><br />mcrypt.algorithms_dir =<br />; 默认的加密算法模块所在目录。通常是"/usr/local/lib/libmcrypt"。<br />; 目前尚无详细说明文档，此处的解释可能是错误的。<br /><br />mcrypt.modes_dir =<br />; 默认的加密模式模块所在目录。通常是"/usr/local/lib/libmcrypt"。<br />; 目前尚无说明文档，此处的解释可能是错误的。<br /><br /><br />[Memcache]<br />; 一个高性能的分布式的内存对象缓存系统，通过在内存里维护一个统一的巨大的hash表，<br />; 它能够用来存储各种格式的数据，包括图像、视频、文件以及数据库检索的结果等。<br /><br />memcache.allow_failover = On<br />; 是否在遇到错误时透明地向其他服务器进行故障转移。<br /><br />memcache.chunk_size = 8192<br />; 数据将按照此值设定的块大小进行转移。此值越小所需的额外网络传输越多。<br />; 如果发现无法解释的速度降低，可以尝试将此值增加到32768。<br /><br />memcache.default_port = 11211<br />; 连接到memcached服务器时使用的默认TCP端口。<br /><br />memcache.max_failover_attempts = 20<br />; 接受和发送数据时最多尝试多少个服务器，进在打开memcache.allow_failover时有效。<br /><br /><br />[Zlib]<br />; 该模块允许PHP透明的读取和写入gzip(.gz)压缩文件。<br /><br />zlib.output_compression = Off<br />; 是否使用zlib库透明地压缩脚本输出结果。<br />; 该指令的值可以设置为：Off、On、字节数(压缩缓冲区大小，默认为4096)。<br />; 如果打开该指令，当浏览器发送"Accept-Encoding: gzip(deflate)"头时，<br />; "Content-Encoding: gzip(deflate)"和"Vary: Accept-Encoding"头将加入到应答头当中。<br />; 你可以在应答头输出之前用ini_set()函数在脚本中启用或禁止这个特性。<br />; 如果输出一个"Content-Type: image/??"这样的应答头，压缩将不会启用(为了防止Netscape的bug)。<br />; 你可以在输出"Content-Type: image/??"之后使用"ini_set('zlib.output_compression', 'On')"重新打开这个特性。<br />; 注意1: 压缩率会受压缩缓冲区大小的影响，如果你想得到更好的压缩质量，请指定一个较大的压缩缓冲区。<br />; 注意2: 如果启用了zlib输出压缩，output_handler指令必须为空，同时必须设置zlib.output_handler指令的值。<br /><br />zlib.output_compression_level = -1<br />; 压缩级别，可用值为 0~9 ，0表示不压缩。值越高效果越好，但CPU占用越多，建议值为1~5。<br />; 默认值 -1 表示使用zlib内部的默认值(6)。<br /><br />zlib.output_handler =<br />; 在打开zlib.output_compression指令的情况下，你只能在这里指定输出处理器。<br />; 可以使用的处理器有"zlib.inflate"(解压)或"zlib.deflate"(压缩)。<br />; 如果启用该指令则必须将output_handler指令设为空。<br /><br /><br />[dbx]<br />; 一个数据库抽象层，为不同数据库提供了统一的接口。目前支持：<br />; FrontBase,SQL Server,MySQL,ODBC,PostgreSQL,Sybase-CT,Oracle 8,SQLite<br /><br />dbx.colnames_case = "unchanged"<br />; 字段名可以按照"unchanged"或"uppercase","lowercase"方式返回。<br /><br /><br />[MySQLi]<br />; MySQLi模块只能与4.1.3以上版本的MySQL一起工作。<br /><br />mysqli.max_links = -1<br />; 每个进程中允许的最大连接数(持久和非持久)。-1 代表无限制<br /><br />mysqli.default_port = 3306<br />; mysqli_connect()连接到MySQL数据库时使用的默认TCP端口。<br />; 如果没有在这里指定默认值，将按如下顺序寻找：<br />; (1)$MYSQL_TCP_PORT环境变量<br />; (2)/etc/services文件中的mysql-tcp项(unix)<br />; (3)编译时指定的MYSQL_PORT常量<br />; 注意：Win32下，只使用MYSQL_PORT常量。<br /><br />mysqli.default_socket =<br />; mysqli_connect()连接到本机MySQL服务器时所使用的默认套接字名。<br />; 若未指定则使用内置的MqSQL默认值。<br /><br />mysqli.default_host =<br />; mysqli_connect()连接到MySQL数据库时使用的默认主机。安全模式下无效。<br /><br />mysqli.default_user =<br />; mysqli_connect()连接到MySQL数据库时使用的默认用户名。安全模式下无效。<br /><br />mysqli.default_pw =<br />; mysqli_connect()连接到MySQL数据库时使用的默认密码。安全模式下无效。<br />; 在配置文件中保存密码是个坏主意，任何使用PHP权限的用户都可以运行<br />; 'echo cfg_get_var("mysql.default_password")'来显示密码!<br />; 而且任何对该配置文件有读权限的用户也能看到密码。<br /><br />mysqli.reconnect = Off<br />; 是否允许重新连接<br /><br /><br />[PostgresSQL]<br />;PostgresSQL模块建议与8.0以上版本一起工作。<br /><br />pgsql.allow_persistent = On<br />; 是否允许持久连接<br /><br />pgsql.max_persistent = -1<br />; 每个进程中允许的最大持久连接数。-1 代表无限制。<br /><br />pgsql.max_links = -1<br />; 每个进程中允许的最大连接数(持久和非持久)。-1 代表无限制。<br /><br />pgsql.auto_reset_persistent = Off<br />; 自动复位在pg_pconnect()上中断了的持久连接，检测需要一些额外开销。<br /><br />pgsql.ignore_notice = Off<br />; 是否忽略PostgreSQL后端的提醒消息。<br />; 记录后端的提醒消息需要一些很小的额外开销。<br /><br />pgsql.log_notice = Off<br />; 是否在日志中记录PostgreSQL后端的提醒消息。<br />; 仅在pgsql.ignore_notice=Off时，才可以记录。</pre>
<img src ="http://www.cppblog.com/nt05/aggbug/64353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-19 04:23 <a href="http://www.cppblog.com/nt05/archive/2008/10/19/64353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网卡绑定</title><link>http://www.cppblog.com/nt05/archive/2008/10/17/64256.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Fri, 17 Oct 2008 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/17/64256.html</guid><description><![CDATA[
		<font size="2">市面上现在天生支持绑定功能的网卡不多，而且多是出身名门的高档服务器网卡，身价不菲，设置过程也比较专业，使用和维护都不简便。难道我等平头百姓，攥着几十元的廉价8139的兄弟们就无缘领略</font>
		<a href="http://www.qqread.com/z/network/c/index.html" target="_blank">
				<font size="2">双网卡</font>
		</a>
		<font size="2">绑
定的快感了吗？非也，今天我就教大家一招，只需一款小小的软件，就可以用普通的8139之类的网卡体验一把双网卡绑定的愉悦，这个软件就叫做
“NICExpress”，可能行家们已经捂着嘴乐了，呵呵，笔者的出发点是给菜鸟兄弟们排难解惑，穷办法自娱自乐，说得过火的地方，大家不要见
笑，DIY的乐趣就在于此啊。 </font>
		<p>
				<font size="2">　　朋友或许会问了，为什么要用双网卡呢？用双网卡有什么好处？所谓双网卡，就是通过软件将双网卡绑定为一个</font>
				<a href="http://www.qqread.com/z/tech/ip/index.html" target="_blank">
						<font size="2">IP地址</font>
				</a>
				<font size="2">，这个技术对于许多朋友来说并不陌生，许多高档服务器网卡（例如intel8255x系列、3COM服务器网卡等）都具有多网卡绑定功能，可以通过软硬件设置将两块或者多块网卡绑定在同一个IP地址上，使用起来就好象在使用一块网卡。</font>
		</p>
		<p>
				<font size="2">　　多网卡绑定的优点不少，首先，可以增大带宽，假如一个网卡的带宽是100M，理论上两块网卡就是200M，三块就是300M，当然实际上的效果是不会是这样简单的增加的，不过经实际测试使用多个网卡对于增加带宽，保持带宽的稳定性肯定是有裨益的，如果<a href="http://www.qqread.com/z/switch-buy/index.html" target="_blank">交换机</a>等
相关条件不错的话，这个效果还是很能令人满意；其次，可以形成网卡冗余阵列、分担负载，双网卡被绑定成“一块网卡”之后，同步一起工作，对服务器的访问流
量被均衡分担到两块网卡上，这样每块网卡的负载压力就小多了，抗并发访问的能力提高，保证了服务器访问的稳定和畅快，当其中一块发生故障的时候，另一块立
刻接管全部负载，过程是无缝的，服务不会中断，直到维修人员到来。</font>
		</p>
		<p>
				<font size="2">　　OK，现在就手把手的教大家如何用50元来打造出双网卡的效果！</font>
		</p>
		<p>
				<font size="2">　　先下载软件</font>
				<a href="http://www.pconline.com.cn/server/apply/0409/pic/NIC4.rar" target="_blank">
						<font color="#3366cc" size="2">
								<u>（点击这里下载）</u>
						</font>
				</a>
				<font size="2">，
这是最新版本4.0，只有2.15M，软件的兼容性已经做得很好，支持win98/Me/2000/XP/2003。基本上支持目前市场上常见的各种网
卡，百兆和千兆网卡都可以用来绑定，但是千万注意，最好用于绑定的网卡是完全相同的，至少也是基于同一芯片的，这样多块网卡才能合作得比较好。切记不要把
10M网卡和100M网卡绑定在一起，那样根本起不到提升作用。</font>
		</p>
		<p>
				<font size="2">　　下载完软件，先不忙安装，咱们还是先准备好硬件。</font>
		</p>
		<p>
				<br />
				<font size="2">　　第一部分：硬件安装</font>
		</p>
		<p>
				<font size="2">　　虽然，理论上讲绑定越多网卡在一起，最终效果提升就越明显，但是考虑到复杂程度，这里就以绑定双网卡为例进行说明，如果读者觉得好玩，兴致很高的话，按照下面方法愿意绑定多少就绑定多少个网卡，其实一般同一台服务器，绑定2－3块网卡也就够了，太多了，据说因为<a href="http://www.qqread.com/tag/1622/index.html" target="_blank">链路聚合</a>的先天缺点，会过多占用服务器资源，反过来会影响服务器速度（关于这个我没实验，不过我觉得凡事都离不开物极必反的道理，适度最好）。</font>
		</p>
		<p>
				<font size="2">　　我取出“珍藏”的一对市场上随处可见的8139D10M/100M自适应网卡，市场价格25元一个，北京某厂的产品，做工还算精细，总成本50元人民币。</font>
		</p>
		<p>
				<br />
				<font size="2">
						<a href="http://www.qqread.com/ArtImage/20060319/gj22404_1.jpg" target="_blank">
								<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图一)" src="http://www.qqread.com/ArtImage/20060319/gj22404_1.jpg" border="0" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">　　然后，抱出笔者的一台私有服务器，呵呵，虽然破旧一点，不过可是立功不小啊，上面现在运行着<a href="http://www.qqread.com/z/server/ftp/index.html" target="_blank">FTP</a>、MAIL等服务，几百个朋友的EMAIL都是通过它来传递的啊。<a href="http://www.qqread.com/z/sys/safe-seting/index.html" target="_blank">配置</a>情况为intel810主板（集成<a href="http://www.qqread.com/keys/xianka/index.html" target="_blank">显卡</a>）＋256MSD内存＋10GIDE硬盘（<a href="http://www.qqread.com/tag/2102/index.html" target="_blank">系统</a>盘）＋120GIDE硬盘（存放互联网^^）。<a href="http://www.qqread.com/keys/system-software/index.html" target="_blank">系统软件</a>是<a href="http://www.qqread.com/tag/1110/index.html" target="_blank">windows2000</a>高级服务器版。</font>
		</p>
		<p>
				<font size="2">　　废话少说，开干，打开服务器机箱，把两块网卡拧在主板PCI插槽上，拧好了，看看还不错。</font>
		</p>
		<p>
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_2.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图二)" src="http://www.qqread.com/ArtImage/20060319/gj22404_2.jpg" border="0" />
				</a>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_3.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图三)" src="http://www.qqread.com/ArtImage/20060319/gj22404_3.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　再从后面看看效果。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_4.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图四)" src="http://www.qqread.com/ArtImage/20060319/gj22404_4.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　拿出珍藏的10M－8口<a href="http://www.qqread.com/tag/1471/index.html" target="_blank">集线器</a>，
哈哈，别笑话，我手头只有这个，能说清楚方法就可以了，如果是读者自己DIY，请务必选一台好的交换机，至少要10/100M自适应的，这是网络通畅的关
键，别象我把100M网卡连在10M集线器上，那速度怎么也好不了啊。做几条网线，把集线器、网卡连接起来，集线器连入上级交换机，因为是在家里实验，所
以，我就把集线器的Uplink口连入家用路由器的任意一个网口里，路由器则连入我家<a href="http://www.qqread.com/z/adsl/network/index.html" target="_blank">ADSL</a>“大猫”。</font>
		</p>
		<p>
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_5.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图五)" src="http://www.qqread.com/ArtImage/20060319/gj22404_5.jpg" border="0" />
				</a>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_6.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图六)" src="http://www.qqread.com/ArtImage/20060319/gj22404_6.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　至此，硬件部分安装完毕。就这么简单。</font>
		</p>
		<p>
				<font size="2">　　第二部分：设置调试</font>
		</p>
		<p>
				<font size="2">　　下面要进行设置及调试了，也就是要将这两块8139D廉价网卡，如同高档服务器网卡那样绑定在一起，使用同一个IP地址，同时同步工作。其过程并不复杂，估计20分钟足够了。</font>
		</p>
		<p>
				<font size="2">　　将刚刚下载的NIC Express软件的安装包NIC4.rar解压缩得到安装文件“NICExpressW2KEE.exe”，双击它<a href="http://www.qqread.com/tag/1718/index.html" target="_blank">启动</a>安装程序，一路NEXT，软件提示输入unlock key（注册码），如果没有注册码，就只好点击Demo，选择试用，这样可以获得30天的免费试用期，在这30天里如果觉得不错，你可以想办法去弄一个注册码（怎么弄？找小编问，他可能有，哈哈）。</font>
		</p>
		<p>
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_7.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图七)" src="http://www.qqread.com/ArtImage/20060319/gj22404_7.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　到下图所示界面，软件提示选择是否开启LOAD Balancing 功能？什么是LOAD
Balancing 功能呢？LOAD
Balancing的中文意思可以翻译为负载均衡，在这里就是网络负载均衡。也就是当多块网卡被绑定合一之后，当数据流量很大的时候，软件会自动调整，将
数据流量负载均衡地分配到各个网卡上，以减轻单块网卡的压力，达到畅快的访问效果。我们绑定双网卡，其中目的之一就是为了实现负载均衡，我们自然要开启这
个功能，所以，在这里一定要选择“Enabled”。当然，如果你在这里选择错了也没关系，今后也可以通过NIC Express软件管理界面开启。<br /><br /><br /><br /></font>
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_8.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图八)" src="http://www.qqread.com/ArtImage/20060319/gj22404_8.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　继续一路NEXT，在<a href="http://www.qqread.com/keys/windowsxp/index.html" target="_blank">Windows XP</a>里安装时如果遇到提示“NIC Express Virtual Miniport”没有通过Windows测试，无法验证它同Windows XP的相容性，不要理会，选择“仍然继续”就行了。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_9.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图九)" src="http://www.qqread.com/ArtImage/20060319/gj22404_9.jpg" border="0" />
				</a>
				<br />
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_10.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十)" src="http://www.qqread.com/ArtImage/20060319/gj22404_10.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　到了下图所示界面，就到了真正绑定网卡的时候了：</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_11.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十)" src="http://www.qqread.com/ArtImage/20060319/gj22404_11.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　大家看到这个界面一共分为上、中、下，三个窗口，上面的是空白，中间的写着8139-2，这个8139-2是我
自己起的绑定之后的网卡组的名称，原来这里默认写的是New
array，也可以不修改，你也可以根据自己喜好，写成别的名字。在最下面的窗口里列出了目前服务器上安装的两块网卡的名字。我们下一步就是要用<a href="http://www.qqread.com/keys/shubiao/index.html" target="_blank">鼠标</a>选中下面的两块网卡名字，然后点击界面中间的Add键，把两块网卡加入上面的窗口里，这样两块网卡就这样被加入了网卡组里，初步绑定成一块“网卡”了，今后可以使用同一个IP地址了。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_12.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十二)" src="http://www.qqread.com/ArtImage/20060319/gj22404_12.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　点击OK继续，NIC Express出现一个配置界面，选项很多，但是不必太操心，因为这些配置都不必修改，使用默认值就可以了，直接点击OK、点击Finish完成安装<a href="http://www.qqread.com/z/windows/process/index.html" target="_blank">进程</a>。至此软件安装基本结束，剩下就需要对软件和网卡进行一些必要的设置工作。</font>
		</p>
		<p>
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_13.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十三)" src="http://www.qqread.com/ArtImage/20060319/gj22404_13.jpg" border="0" />
				</a>
				<br />
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_14.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十四)" src="http://www.qqread.com/ArtImage/20060319/gj22404_14.jpg" border="0" />
				</a>
				<br />
				<br />
				<font size="2">　　点击桌面“开始”菜单，选择执行菜单里的“NIC Express Enterprise
Edition”选项，这是NIC
Express软件自带的一个监控程序，首先点击“setting”选项，在这里可以设置网卡流量计量单位，可以按照Packets/Sec、Mbits
/Sec、Kbits/Sec三种单位来计算，一般都是使用默认的Mbits/Sec来计算，也就是兆/每秒，其实在这里只需要修改一下“Graph
Detail（图形显示）”即可，将默认的“By Protocol”改成“By Incoming/Outgoing”，别的不需要改。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_15.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十五)" src="http://www.qqread.com/ArtImage/20060319/gj22404_15.jpg" border="0" />
				</a>
				<br />
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_16.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十六)" src="http://www.qqread.com/ArtImage/20060319/gj22404_16.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　如果你想分别观察绑定组中每块网卡的流量或者整个组的流量，只需在“Select
Device”选项中选择一下设备即可。最后点击“Advanced”选项，设定网卡绑定的工作模式，在这里也可以点击“Load Balancing
Disable”来关闭网卡负载均衡功能。使用NIC Express绑定的双网卡组默认工作于“NIC Express ELB”模式下，这是NIC
Express所特有的一种工作模式，实际效果很好。我们都知道利用昂贵的Intel PROSET绑定的Intel
8255x的组合是运行在“802.3ad”工作模式下的，这一模式在NIC Express中也可以选择，但是多数使用者在实际使用后都认为“NIC
Express ELB”模式的效果优于“802.3ad”模式，大家今后可以自己实践测试比较一下。如果你也使用默认的“NIC Express
ELB”模式，那么“Advanced”选项里也就不用改什么，一切默认即可。至此NIC Express的设置结束。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_17.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十七)" src="http://www.qqread.com/ArtImage/20060319/gj22404_17.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　第三部分：“虚拟网卡”设定</font>
		</p>
		<p>
				<font size="2">　　最后还要看看网卡的设置，用鼠标在桌面“<a href="http://www.qqread.com/tag/2033/index.html" target="_blank">网上邻居</a>”
上点击右键弹出“网络和拨号连接”窗口，可以看到原来的两个网卡连接图标已经变成了三个，多出来的一个图标就是“NIC Express
Virtual Adapter”，这个就是绑定后的网卡组，这个网卡组的使用和使用单一网卡完全一样，相当于一个单一的“虚拟网卡”。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_18.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十八)" src="http://www.qqread.com/ArtImage/20060319/gj22404_18.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　用鼠标在这个图标上点击右键选择属性，可以为这个“虚拟网卡”设定IP地址、<a href="http://www.qqread.com/z/network/mask/index.html" target="_blank">子网掩码</a>、<a href="http://www.qqread.com/tag/1952/index.html" target="_blank">网关</a>等
等，其实在安装“NIC
Express”过程中，如果服务器原来的单一网卡已经设置了这些，那么“虚拟网卡”就会自动设定和原来的网卡一样。在这里选择“NIC
Express Transport for Ethernet”还可以自由对网卡绑定组进行调整，例如，减少或者加入一块网卡，这个较之Intel
PROSET要方便许多，Intel PROSET在增加或者减少绑定组里的网卡之前必须删除原来的绑定组然后重新创建。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_19.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图十九)" src="http://www.qqread.com/ArtImage/20060319/gj22404_19.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　好了，好了，至此一切都已经做好，我们的服务器已经成为一台地地道道的“双网卡冗余服务器”了，我们来运行一下，看看表现。</font>
		</p>
		<p>
				<font size="2">　　第四部分：测试双网卡绑定后的效果</font>
		</p>
		<p>
				<font size="2">　　检查一下<a href="http://www.qqread.com/tag/2124/index.html" target="_blank">线路</a>，
前面说过两块网卡已经用网线连入10M集线器（这就相当于机房机柜里的百兆交换机），集线器的Uplink口连入了家用路由器的任意一个网口，路由器通过
ADSL大猫接入互联网（北京512K包月ADSL），这样服务器就已经和互联网连通了，按下Power键启动服务器，由于服务器里面已经安装了动态<a href="http://www.qqread.com/tag/2248/index.html" target="_blank">域名</a>软件，服务器启动之后，很快与国际域名www.usacase.com连接到一起（具体过程请看不久前发表在太平洋网站的《绝对疯狂!1G容量的<a href="http://www.qqread.com/z/server/mail/index.html" target="_blank">邮件服务器</a>自
己打造》），这时只要访问www.usacase.com域名，即可从世界各地访问到我的服务器了，我让上海的一个朋友用FTP软件登陆这台“双网卡冗余
服务器”，下载一个50M的压缩文件包。嚯，只见服务器上的两块8139D网卡的指示灯同时闪烁起来，闪烁的频率完全同步，煞是好看！</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_20.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图二十)" src="http://www.qqread.com/ArtImage/20060319/gj22404_20.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　再看那台古董级10M集线器，两个接<a href="http://www.qqread.com/keys/surf/index.html" target="_blank">上网</a>卡的接口指示灯也是飞快同步闪烁，说明两块网卡在同步工作，同时分担访问的流量。上海的朋友说感觉速度不错，毕竟只是512K的ADSL，也仅能看看网卡同步闪烁的美丽效果了。</font>
		</p>
		<p>
				<br />
				<br />
				<a href="http://www.qqread.com/ArtImage/20060319/gj22404_21.jpg" target="_blank">
						<img alt="[硬件] 够绝!50元打造双网卡负载均衡服务器(图二十)" src="http://www.qqread.com/ArtImage/20060319/gj22404_21.jpg" border="0" />
				</a>
		</p>
		<p>
				<font size="2">　　然后，我又在<a href="http://www.qqread.com/z/network/29/index.html" target="_blank">局域网</a>里
进行了传输实验，因为有那个10M集线器的瓶颈，所以效果不是很好，但是也能看出一些明显改善。从局域网另一台使用单个杂牌10M8029网卡的电脑上通
过网上邻居访问已经用NIC Express绑定了双8139D网卡的服务器，传输200M文件，通过“NIC Express Enterprise
Edition”中的曲线监控图观察到，双网卡绑定组的传输速率从8M/s起步，最高达到8.2M/s，两机之间平均传输速率比较稳定，偶尔有大幅度的波
动，是软件正在调整两块网卡的负载均衡，只有零点几秒就恢复正常，基本稳定在7.5－8M/s左右，已经接近那个10M集线器的最大传输极限。之后，从服
务器上删除一块网卡，再进行两机传输实验，发现传输最高速率已经骤然减少到5M/s，而且传输过程中速率上下波动很大，平均传输速率也就3M/s左右，可
见前后差异还是很明显的。</font>
		</p>
		<p>
				<font size="2">　　现在这台绑定了双网卡的服务器正在白天黑夜不停机地运行着，大家可以通过</font>
				<u>www.usacase.com</u>
				<font size="2">或者mail.usacase.com访问体验一下，上面运行的就是我在《绝对疯狂!1G容量的邮件服务器自己打造》一文中提到的邮局程序，任何朋友都可以上去申请免费的百兆邮箱，体验一下“唐华牌”双网卡冗余服务器的性能（嘿嘿，其实你也感觉不出什么）。</font>
		</p>
		<p>
				<font size="2">　　最后说几句，作为本文的总结和补充：</font>
		</p>
		<p>
				<font size="2">　　1、经过实际使用，我发现使用NIC Express绑定的双网卡组运行的稳定性很好，没有出现过什么软件的冲突，我的一个朋友已经把它应用到自己的电信<a href="http://www.qqread.com/tag/1925/index.html" target="_blank">托管</a>服务器上，运行了半年多了，也很稳定；</font>
		</p>
		<p>
				<font size="2">　　2、理论上讲NIC Express绑定的网卡越多，效果提升应该越明显，如果可能大家可以自己动手绑定3块、4块网卡试试，不过切记使用的网卡最好是一个品牌一个型号；</font>
		</p>
		<p>
				<font size="2">　　3、NIC
Express最初被老鸟们拿来玩的时候，并没有想到应用在服务器上做网卡冗余阵列，大家多是把局域网内的几台电脑同时都绑定双网卡，这样各个电脑之间的
传输速率和传输稳定性获得了明显的提升，后来大家发现只要其中一台电脑使用NIC
Express绑定了双网卡组，其他使用单网卡的电脑访问这台有网卡绑定组的电脑，也能获得传输速率和稳定性的改善，于是我才想到将这个技术应用到服务器
上。</font>
		</p>
		<p>
				<font size="2">　　4、我个人认为使用NIC
Express绑定多网卡，在当今这个数据时代具有一定的实际意义，无论是对于互联网服务器还是局域网服务器的用户都有启发，当我们为服务器绑定多网卡形
成阵列之后，不仅可以扩大服务器的网络带宽，而且可以有效均衡负载和提高容错能力，避免服务器出现传输瓶颈或者因某块<a href="http://www.qqread.com/tag/1961/index.html" target="_blank">网卡故障</a>而停止服务。</font>
		</p>
		<p>
				<font size="2">　　5、也许你会说，在当今千兆网卡早已普及的时代，还费劲绑定几块百兆网卡做什么？其实绑定多网卡的目的并不是仅
仅为了提高带宽，这样做还有一个最大的优点就是多块网卡可以有效增强服务器的负载承受能力和冗余容错能力。也许你也经历过，当使用单块10M/100M网
卡在局域网里拷贝1G以上大文件的时候，经常会出现电脑停止响应，或者速度奇慢接近死机的情况，当多网卡绑定之后，这种情况会得到明显改善。</font>
		</p>
		<p>
				<font size="2">　　6、大家再想想，如果绑定的不是几块百兆网卡，而是几块千兆网卡，会是什么局面？想不想试试？让我们一起来DIY迎接<a href="http://www.qqread.com/z/10000m/index.html" target="_blank">万兆</a>时代的到来吧</font>
		</p>
<img src ="http://www.cppblog.com/nt05/aggbug/64256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-17 20:06 <a href="http://www.cppblog.com/nt05/archive/2008/10/17/64256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>磁盘的GPT保护分区转换</title><link>http://www.cppblog.com/nt05/archive/2008/10/17/64220.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Thu, 16 Oct 2008 20:51:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/17/64220.html</guid><description><![CDATA[
		<div id="blog_text" class="cnt">
				<p>磁盘的GPT保护分区转换<br />
GUID 分区表 (GPT)  <br />
一种由基于 Itanium 计算机中的可扩展固件接口 (EFI) 使用的磁盘分区架构。与主启动记录 (MBR) 分区方法相比，GPT
具有更多的优点，因为它允许每个磁盘有多达 128 个分区，支持高达 18
千兆兆字节的卷大小，允许将主磁盘分区表和备份磁盘分区表用于冗余，还支持唯一的磁盘和分区 ID (GUID)。  </p>
				<p>与支持最大卷为 2 TB (terabytes) 并且每个磁盘最多有 4 个主分区（或 3 个主分区，1
个扩展分区和无限制的逻辑驱动器）的主启动记录 (MBR) 磁盘分区的样式相比，GUID 分区表 (GPT) 磁盘分区样式支持最大卷为 18
EB (exabytes) 并且每磁盘最多有 128 个分区。与 MBR
分区的磁盘不同，至关重要的平台操作数据位于分区，而不是位于非分区或隐藏扇区。另外，GPT
分区磁盘有多余的主要及备份分区表来提高分区数据结构的完整性。 </p>
				<p>不能将 GPT 移至运行 Windows NT 4.0、Windows 2000、Windows XP 或 Windows Server
2003 的基于 x86 的计算机上。不过，可以将 GPT 磁盘从运行带有 SP1 的 Windows Server 2003 的基于 x86
的计算机或基于 x64 的计算机移至运行 Windows Server 2003 或 Windows XP 的基于 Itanium
的计算机上，反之亦然。</p>
				<p>
				</p>
				<p>现在使用 diskpart 命令解决它吧：</p>
				<p>1. 打开命令提示符，输入 diskpart<br />
2. 输入 list disk ，查看磁盘情况，这里有两个磁盘，一个主机箱内的硬盘，一个移动硬盘。<br />
3. 输入 select disk n （其中的 n 指的是要接收焦点的磁盘的磁盘编号，也就是我们需要转换的磁盘的编号）<br />
4. 输入 clean all ，将指定的磁盘上所有扇区都设置为零，这样就完全删除了磁盘上的所有数据。</p>
				<p>下面的操作可选：<br />
5. 可以使用 convert mbr ，将具有 GUID 分区表 (GPT) 分区形式的空白基本磁盘转换为具有主启动记录 (MBR) 分区形式的基本磁盘。<br />
5. 重新进入“计算机管理”的“磁盘管理”，这时系统会发现一个新磁盘，要求初始化选择。哈哈！赶快选择 MBR 主分区 吧！（我用的是这一种）</p>
				<p>6. 为心爱的移动硬盘分区，格式化，拷贝资料吧！希望对一些朋友有用！</p>
		</div>
<img src ="http://www.cppblog.com/nt05/aggbug/64220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-17 04:51 <a href="http://www.cppblog.com/nt05/archive/2008/10/17/64220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让系统中隐藏的设备在设备管理器中显示出来</title><link>http://www.cppblog.com/nt05/archive/2008/10/17/64219.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Thu, 16 Oct 2008 18:53:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/17/64219.html</guid><description><![CDATA[
		<div id="blog_text" class="cnt">
				<div>
						<p>一、运行 Devmgmt.msc set DEVMGR_SHOW_NONPRESENT_DEVICES=1，打开设备管理器；</p>
						<p>二、是选择“附件”中的“命令行提示符”，输入“set devmgr_show_ nonpresent_devices=1”后再启动“设备管理器”；</p>
						<p>三、是我的电脑&gt;属性&gt;高级&gt;环境变量 <br />
在系统变量里面,按"新建",在"变量名"里面填入" DEVMGR_SHOW_NONPRESENT_DEVICES" ,变量值填入"1"；</p>
						<p>四、是使用注册表编辑器编辑以下注册表值来实现。</p>
						<p>注册项：[HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetControlSession ManagerEnvironment]</p>
						<p>键值名：DEVMGR_SHOW_ NONPRESENT_DEVICES（字符串值）</p>
						<p>值数据：1（0隐藏，1显示）</p>
						<p>针对上面的方法，可以使用下面的批处理来达到目的</p>
						<p>@echo off<br />
echo REGEDIT4&gt;devmgmt.reg<br />
echo.&gt;&gt;devmgmt.reg<br />
echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment]&gt;&gt;devmgmt.reg<br />
echo "devmgr_show_nonpresent_devices"="1"&gt;&gt;devmgmt.reg<br />
echo.&gt;&gt;devmgmt.reg<br />
REM ---------------------------------------------------<br />
REM The above is a script. to generate devmgmt registry<br />
REM ---------------------------------------------------<br />
@echo on<br />
REM [开始菜单] ---&gt; 运行 ---&gt; 输入cmd</p>
						<p>set devmgr_show_nonpresent_devices=1<br />
cd /d %SystemRoot%System32<br />
start devmgmt.msc<br /><br />
REM [菜单] 查看 ---&gt; 显示隐藏设备<br />
@echo.<br />
@pause</p>
				</div>
		</div>
<img src ="http://www.cppblog.com/nt05/aggbug/64219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-17 02:53 <a href="http://www.cppblog.com/nt05/archive/2008/10/17/64219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows nt 中更改PPPOE MTU大小</title><link>http://www.cppblog.com/nt05/archive/2008/10/16/64186.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Thu, 16 Oct 2008 11:07:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/16/64186.html</guid><description><![CDATA[
		<h2 class="subTitle" id="tocHeadRef">概要</h2>
		<script type="text/javascript"><![CDATA[oadTOCNode(1, 'summary');]]&gt;</script> 本文介绍如何更改 PPPoE 最大传送单位 (MTU) 大小。<br /><br />
默认和最大 PPPoE MTU 大小为 1,480 字节。对于某些 Internet 服务提供商 (ISP)，您可能需要将 PPPoE 连接的
MTU 大小降至 1,400 和 1,480 之间的一个值（例如 1,454）。不要将 MTU 大小设置为小于 1,400。 有关默认 MTU
大小的其他信息，请单击下面的文章编号，以查看 Microsoft 知识库中相应的文章：<div class="indent"><a class="KBlink" href="http://support.microsoft.com/kb/314496/">314496</a><span class="pLink"> (http://support.microsoft.com/kb/314496/)</span> 不同网络拓扑的默认 MTU 大小
</div>有关如何确定是否需要降低 PPPoE 连接的 MTU 大小的其他信息，请单击下面的文章编号，以查看 Microsoft 知识库中相应的文章：<div class="indent"><a class="KBlink" href="http://support.microsoft.com/kb/159211/">159211</a><span class="pLink"> (http://support.microsoft.com/kb/159211/)</span> Diagnoses and Treatment of Black Hole Routers
</div><br /><span></span><p class="topOfPage"><a href="http://support.microsoft.com/kb/283165/zh-cn#top"><img src="http://support.microsoft.com/library/images/support/en-us/uparrow.gif" alt="" />回到顶端</a></p><h3 id="tocHeadRef">修改 MTU 大小</h3><script type="text/javascript"><![CDATA[oadTOCNode(2, 'summary');]]&gt;</script><b>警告</b>：“注册表编辑器”使用不当可导致严重问题，可能需要重新安装操作系统。Microsoft 不能保证您可以解决因“注册表编辑器”使用不当而导致的问题。使用“注册表编辑器”需要您自担风险。<br /><br /> 要修改 PPPoE MTU 大小，请创建以下注册表项：<div class="indent"><b>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Ndiswan\Parameters\Protocols\0</b></div>并添加下列注册表值：<div class="indent"><b>数值名称</b>：ProtocolType<br /><b>数据类型</b>：REG_DWORD<br /><b>数值数据</b>：0x00000800<br /><br /><b>数值名称</b>：PPPProtocolType<br /><b>数据类型</b>：REG_DWORD<br /><b>数值数据</b>：0x00000021<br /><br /><b>数值名称</b>：ProtocolMTU<br /><b>数据类型</b>：REG_DWORD<br /><b>数值数据</b>：<i>适当的 MTU 大小</i>（十进制）</div>为此，请按下列步骤操作： 
		  <table class="list ol"><tbody><tr><td class="number">1.</td><td class="text">单击<b>开始</b>，单击<b>运行</b>，键入 <span class="userInput">regedit</span>，然后单击<b>确定</b>。</td></tr><tr><td class="number">2.</td><td class="text">在注册表中找到并单击以下注册表项：<div class="indent"><b>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Ndiswan\Parameters</b></div></td></tr><tr><td class="number">3.</td><td class="text">在<b>编辑</b>菜单上，指向<b>新建</b>，然后单击<b>项</b>。</td></tr><tr><td class="number">4.</td><td class="text">键入 <span class="userInput">Protocols</span>，然后按 Enter 键。</td></tr><tr><td class="number">5.</td><td class="text">在<b>编辑</b>菜单上，指向<b>新建</b>，然后单击<b>项</b>。</td></tr><tr><td class="number">6.</td><td class="text">键入 <span class="userInput">0</span>，然后按 Enter 键。</td></tr><tr><td class="number">7.</td><td class="text">在<b>编辑</b>菜单上，指向<b>新建</b>，然后单击 <b>DWORD 值</b>。</td></tr><tr><td class="number">8.</td><td class="text">键入 <span class="userInput">ProtocolType</span>，然后按 Enter 键。</td></tr><tr><td class="number">9.</td><td class="text">在<b>编辑</b>菜单上，单击<b>修改</b>。</td></tr><tr><td class="number">10.</td><td class="text">键入 <span class="userInput">800</span>，然后单击<b>确定</b>。</td></tr><tr><td class="number">11.</td><td class="text">在<b>编辑</b>菜单上，指向<b>新建</b>，然后单击 <b>DWORD 值</b>。</td></tr><tr><td class="number">12.</td><td class="text">键入 <span class="userInput">PPPProtocolType</span>，然后按 Enter 键。</td></tr><tr><td class="number">13.</td><td class="text">在<b>编辑</b>菜单上，单击<b>修改</b>。</td></tr><tr><td class="number">14.</td><td class="text">键入 <span class="userInput">21</span>，然后单击<b>确定</b>。</td></tr><tr><td class="number">15.</td><td class="text">在<b>编辑</b>菜单上，指向<b>新建</b>，然后单击 <b>DWORD 值</b>。</td></tr><tr><td class="number">16.</td><td class="text">键入 <span class="userInput">ProtocolMTU</span>，然后按 Enter 键。</td></tr><tr><td class="number">17.</td><td class="text">在<b>编辑</b>菜单上，单击<b>修改</b>。</td></tr><tr><td class="number">18.</td><td class="text">键入 <span class="userInput"><i>适当的 MTU 大小</i></span>（十进制值），然后单击<b>确定</b>。</td></tr><tr><td class="number">19.</td><td class="text">退出“注册表编辑器”。</td></tr></tbody></table><b>注意：</b><table class="list ul"><tbody><tr><td class="bullet">•</td><td class="text">结果，如果 MTU 大小被设置为 1460（十进制），则以下命令行中的 NUM 的最大值可以为 1432：<div class="indent"><b>ping <var>IP_address</var> -f -l NUM</b></div></td></tr><tr><td class="bullet">•</td><td class="text">您可能需要重新启动计算机才能使这一更改生效。</td></tr></tbody></table><img src ="http://www.cppblog.com/nt05/aggbug/64186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-16 19:07 <a href="http://www.cppblog.com/nt05/archive/2008/10/16/64186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更改nt命令行全局字体</title><link>http://www.cppblog.com/nt05/archive/2008/10/13/63848.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 12 Oct 2008 20:34:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/13/63848.html</guid><description><![CDATA[
		<h2>快照比较报告 Regshot 2.0.1.61 unicode</h2>
		<div align="center">
				<table id="info" cellspacing="1">
						<tbody>
								<tr class="h">
										<td colspan="3">综合报告</td>
								</tr>
								<tr class="b">
										<td> </td>
										<td class="h">快照 A</td>
										<td class="h">快照 B</td>
								</tr>
								<tr class="a">
										<td class="a">快照日期</td>
										<td class="b">2008/10/13 4:22:04</td>
										<td class="b">2008/10/13 4:22:26</td>
								</tr>
								<tr class="b">
										<td class="a">计算机</td>
										<td class="b">WIN-65NAC14GPVY</td>
										<td class="b">WIN-65NAC14GPVY</td>
								</tr>
								<tr class="a">
										<td class="a">用户</td>
										<td class="b">Administrator</td>
										<td class="b">Administrator</td>
								</tr>
								<tr class="b">
										<td class="a">快照类型</td>
										<td class="b">
										</td>
										<td class="b">
										</td>
								</tr>
								<tr class="a">
										<td class="a">快照时间</td>
										<td class="b">8.05 秒</td>
										<td class="b">8.05 秒</td>
								</tr>
								<tr class="b">
										<td class="a">键</td>
										<td class="b">280363</td>
										<td class="b">280363</td>
								</tr>
								<tr class="a">
										<td class="a">值</td>
										<td class="b">563992</td>
										<td class="b">563992</td>
								</tr>
								<tr class="b">
										<td class="a">文件夹</td>
										<td class="b">0</td>
										<td class="b">0</td>
								</tr>
								<tr class="a">
										<td class="a">文件</td>
										<td class="b">0</td>
										<td class="b">0</td>
								</tr>
								<tr class="b">
										<td class="a">移除键</td>
										<td class="b">0</td>
										<td class="b">-</td>
								</tr>
								<tr class="a">
										<td class="a">新添键</td>
										<td class="b">-</td>
										<td class="b">0</td>
								</tr>
								<tr class="b">
										<td class="a">移除值</td>
										<td class="b">0</td>
										<td class="b">-</td>
								</tr>
								<tr class="a">
										<td class="a">新添值</td>
										<td class="b">-</td>
										<td class="b">0</td>
								</tr>
								<tr class="b">
										<td class="a">改变值</td>
										<td class="b">6</td>
										<td class="b">6</td>
								</tr>
								<tr class="a">
										<td class="a">
												<b>全部变化</b>
										</td>
										<td class="b">6</td>
										<td class="b">6</td>
								</tr>
								<tr class="b">
										<td class="a">另存为注册表文件</td>
										<td class="b">
												<a href="Report.1.UndoReg.txt" target="_blank">Report.1.UndoReg.txt</a>
										</td>
										<td class="b">
												<a href="Report.1.RedoReg.txt" target="_blank">Report.1.RedoReg.txt</a>
										</td>
								</tr>
								<tr class="a">
										<td class="c" colspan="3">
												<b>注释</b>: <span class="i"></span></td>
								</tr>
						</tbody>
				</table>
		</div>
		<table id="hive" cellspacing="1">
				<tbody>
						<tr class="a">
								<td>
										<a name="b">
										</a> </td>
						</tr>
						<tr class="h">
								<td>移除键 (0) 快照 A</td>
						</tr>
						<tr class="c">
								<td>
										<a name="c">
										</a> </td>
						</tr>
						<tr class="h">
								<td>新添键 (0) 快照 B</td>
						</tr>
						<tr class="c">
								<td>
										<a name="d">
										</a> </td>
						</tr>
						<tr class="h">
								<td>移除值 (0) 快照 A</td>
						</tr>
						<tr class="f">
								<td>
										<a name="e">
										</a> </td>
						</tr>
						<tr class="h">
								<td>新添值 (0) 快照 B</td>
						</tr>
						<tr class="f">
								<td>
										<a name="f">
										</a> </td>
						</tr>
						<tr class="h">
								<td>改变值 (6) 快照 A</td>
						</tr>
						<tr class="e">
								<td>
										<nobr>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQLServer]</nobr>
								</td>
						</tr>
						<tr class="g">
								<td>"uptime_time_utc"=hex:e1,90,c1,13,a8,2c,c9,01</td>
						</tr>
						<tr class="f">
								<td>"uptime_time_utc"=hex:e1,d6,84,37,a8,2c,c9,01</td>
						</tr>
						<tr class="e">
								<td>
										<nobr>[HKEY_USERS\S-1-5-21-3029139756-1145469629-3932341643-500\Console]</nobr>
								</td>
						</tr>
						<tr class="g">
								<td>"CurrentPage"=dword:00000002</td>
						</tr>
						<tr class="f">
								<td>"CurrentPage"=dword:00000001</td>
						</tr>
						<tr class="e">
								<td>
										<nobr>[HKEY_USERS\S-1-5-21-3029139756-1145469629-3932341643-500\Console\%SystemRoot%_system32_cmd.exe]</nobr>
								</td>
						</tr>
						<tr class="g">
								<td>"FontSize"=dword:000c0000</td>
						</tr>
						<tr class="f">
								<td>"FontSize"=dword:00000000</td>
						</tr>
						<tr class="g">
								<td>"FontFamily"=dword:00000036</td>
						</tr>
						<tr class="f">
								<td>"FontFamily"=dword:00000000</td>
						</tr>
						<tr class="g">
								<td>"FontWeight"=dword:00000190</td>
						</tr>
						<tr class="f">
								<td>"FontWeight"=dword:00000000</td>
						</tr>
						<tr class="g">
								<td>"FaceName"="新宋体"</td>
						</tr>
						<tr class="f">
								<td>"FaceName"=""</td>
						</tr>
						<tr class="f">
								<td>
										<a name="g">
										</a> </td>
						</tr>
				</tbody>
		</table>
		<table id="file" cellspacing="1">
				<tbody>
						<tr class="h">
								<td>删除文件 (0)</td>
						</tr>
						<tr class="a">
								<td> </td>
						</tr>
						<tr class="h">
								<td>新添文件 (0)</td>
						</tr>
						<tr class="a">
								<td> </td>
						</tr>
						<tr class="h">
								<td>变化文件 (0)<br /><br />根据这些信息 发现cmd在注册表中的hkey_users\用户SID-500\console下保存设置<br />其中console是全局的 其项下每个子项记录一个窗口的个性设置<br />尝试通过cmd命令或者某窗口属性更改字体大小和类型 得到信息:<br />如果更改为最美观的宋体 12px为例<br />console下的fontfamily更改为10进制54<br />fontsize更改为10进制786432 fontweight10进制400<br />其它如缓冲区的全局大小可以举一反三<br /></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/nt05/aggbug/63848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-13 04:34 <a href="http://www.cppblog.com/nt05/archive/2008/10/13/63848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装sql server 2008的依赖包时提示安装失败 因为其依赖windows update服务</title><link>http://www.cppblog.com/nt05/archive/2008/10/13/63847.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 12 Oct 2008 19:11:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/10/13/63847.html</guid><description><![CDATA[安装sql server 2008的依赖包时提示安装失败 因为其依赖windows update服务<br /><img src ="http://www.cppblog.com/nt05/aggbug/63847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-10-13 03:11 <a href="http://www.cppblog.com/nt05/archive/2008/10/13/63847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>禁用windows关机事件跟踪</title><link>http://www.cppblog.com/nt05/archive/2008/09/21/62408.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Sun, 21 Sep 2008 11:04:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/09/21/62408.html</guid><description><![CDATA[
		<strong>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Reliability<br /></strong>ShutdownReasonUI<br /><strong>类型：</strong><strong>REG _ DWORD <br /></strong><img src ="http://www.cppblog.com/nt05/aggbug/62408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-09-21 19:04 <a href="http://www.cppblog.com/nt05/archive/2008/09/21/62408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何禁用MMC</title><link>http://www.cppblog.com/nt05/archive/2008/08/05/58088.html</link><dc:creator>nt05</dc:creator><author>nt05</author><pubDate>Tue, 05 Aug 2008 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/nt05/archive/2008/08/05/58088.html</guid><description><![CDATA[[HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{E12BBB5D-D59D-4E61-947A-301D25AE8C23}]<br />"Restrict_Run"=dword:00000001<br /><img src ="http://www.cppblog.com/nt05/aggbug/58088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nt05/" target="_blank">nt05</a> 2008-08-05 21:45 <a href="http://www.cppblog.com/nt05/archive/2008/08/05/58088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>