以WinPcap 3.0a 为例。通过比较安装前后的文件系统和注册表快照,很容易了解整个安装过程。 除去反安装的部分,关键的文件有三个:wpcap.dll,packet.dll和npf.sys。前面两个文件位于system32目录下,第三个在system32drivers下。而注册表的变化是增加了一个系统服务NPF。注意,是系统服务(即驱动)不是Win32服务。
作为系统服务,不但要在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices下增加主键,在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumRoot下也增加主键。而后者默认只有SYSTEM身份才可以修改。幸运的是,并不需要手动添加它,winpcap被调用时会自动搞定。甚至完全不用手动修改注册表,所有的事winpcap都会自己完成,只需要将三个文件复制到合适的位置就行了。
作为范例,还是演示一下如何修改注册表:利用前面说过的inf文件来实现。
[Version] Signature="$WINDOWS NT$" [DefaultInstall.Services] AddService=NPF,winpcap_svr [winpcap_svr] DisplayName=Netgroup Packet Filter ServiceType=0x1 StartType=3 ErrorControl=1 ServiceBinary=%12%
pf.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%system32drivers goto END copy npf.sys %SYSTEMROOT%system32drivers 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:.
ootcimv2: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:.
ootcimv2: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:.
ootcimv2: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)}!.
ootcimv2: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:.
ootcimv2: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:.
ootcimv2: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:.
ootcimv2: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:.
ootcimv2: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,1):d=t86400:r=r^&d:t=t mod 86400:next >>rt.vbs @echo wscript.echo cint(r)^&"d "^&t3600^&"h "^&t60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs cscript //nologo rt.vbs & del rt.vbs
这个运行时间是从性能计数器中获得的64位整型数,不会出现在49.7天后溢出的情况。
附言 cmd shell博大精深,本文挂一漏万讲了一些常用技巧,希望对各位有所帮助。
也许你早知道了这些方法,也许你有更好的方法,希望你能写出来和大家分享。
最后,感谢你耐心看完本文。本人水平有限,错误之处恳请指正。 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|