作为系统服务,不但要在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=%npf.sys
将上面这些内容保存为_wpcap_.inf文件 。
再写一个批处理_wpcap_.bat:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %蚠wpcap_.inf
del _wpcap_.inf
if /i %?=%SYSTEMROOT%system32 goto COPYDRV
copy packet.dll %SYSTEMROOT%system32
copy wpcap.dll %SYSTEMROOT%system32
del packet.dll
del wpcap.dll
:COPYDRV
if /i %?=%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:.rootcimv2: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:.rootcimv2: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:.rootcimv2: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)}!.rootcimv2: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:.rootcimv2: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:.rootcimv2:win32_service").instances_ >sc.vbs
@echo if sc.state="Running" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs
推荐阅读
- 为什么警察叫条子
- 极致设计之美 我心灵的回归之旅--诺基亚7360
- dna是染色体的主要成分之一吗
- 古人之观于天地山川草木虫鱼鸟兽往往有得翻译 游褒禅山记的翻译
- 多普达838外观篇
- 豆苗炒之前要焯水吗
- 下 领航智能--Treo650试飞之基本电话功能
- 王右军是王羲之吗
- 笑而遣之的之是什么意思 笑而遣之中之的意思
- 使用一晚上感觉C139的不足之处
