以管理员身份运行
将TCP代理程序写好后,经过初步测试没什么问题,便发给领导看效果。不一会,领导说程序在他的Win7机器上根本运行不了,为了排除环境问题,他又特意弄了台Win8机器测,结果一样。我的开发机器用的Win7系统,按理不应该有问题,我在他的测试环境下启动dbgview查看运行日志,发现在OpenSCManager时出错了,错误码对应解释是权限不够。经过确认,当前用户虽然不是Administrator(Win7默认禁用Administrator用户),但确实属于管理员组,而我的开发机用的是Administrator用户。
我们知道,在Vista及其后的版本中,为了提高系统安全,默认是以普通用户身份运行程序的,如果权限不足,则可以通过右键菜单中的"以管理员身份运行"来提升权限。既然日志输出都说了是因为权限不足,那就以管理员身份运行吧,然而这次连一条日志输出都没了!
好在运行的不是二进制程序,而是批处理脚本。由于运行脚本时一闪而过,看不清输出内容,我决定先打开CMD,然后在CMD中运行该批处理,事实证明这种做法无效,因为输出的内容仍是权限不足,看来还是要以管理员身份运行,只能在批处理中加类似pause的命令进行调试了。
一切准备就绪后再次运行,输出的内容竟然是"tcpproxy.exe不是内部或外部命令,也不是可运行的程序或批处理文件",可见该批处理并没有找到对应的文件,而批处理与tcpproxy.exe明明就放在同一个目录下!我尝试在批处理的开头加上"echo %cd%"查看当前工作目录,结果发现双击运行时当前工作目录就是批处理所在的目录,可以找到tcpproxy.exe,而以管理员身份运行时,当前工作目录变成了"C:\Windows\System32",自然找不着。
找到问题原因后,我把批处理中的"tcpproxy.exe"改成"~dp0tcpproxy.exe",也就是使用绝对路径,问题就解决了。
总结
- Vista及更高版本的Windows默认以普通权限运行程序,如果权限不够,应选择"以管理员身份运行";
- 以管理员身份运行时,要注意初始的当前目录会切换到系统目录;