用py2exe打包的一个windows服务进程,在win8上用taskkill杀,只有打开管理员权限的cmd才能杀掉,问题是软件更新时我要用脚本或者程序自动杀掉它,所以怎么在脚本中获取使用win8的管理员权限杀掉进程呢? 图形界面和右键点击神马的就不说了。
1
geeklian 2015-02-15 12:21:55 +08:00 via iPhone
如果脚本就能骗过UAC,那微软还是倒闭算了。
|
2
geeklian 2015-02-15 12:53:22 +08:00
吐槽完,还是说说经验,我也是在win下用python+powershell运维的。
我的观点:关闭uac不是啥好主意。 1. 为了今后升级平滑,要改写你的服务,加入自己停止的功能。 2. 这次升级用py2exe打包你的补丁,给输出的exe文件新建一个manifest文件。模仿.net程序,加入:requestedExecutionLevel="requireAdministrator" ,具体用这段字符串google.... 3.如果程序很简单,可以不用py2exe打包,pywin32写出的服务,直接python.exe code.py也是ok的,参考django代码,可以做到替换py文件,程序自动reload。 reload也参考下http://www.indelible.org/ink/python-reloading/ |
3
lujjjh 2015-02-15 17:49:57 +08:00
用 taskkill 杀服务并不优雅,Windows 本身提供了一系列操作服务的接口,这种轮子别人一定也是造过了的。
随便搜了下: http://pyxr.sourceforge.net/PyXR/c/python24/lib/site-packages/win32/lib/win32serviceutil.py.html 操作服务也是需要提升权限的,但是比 taskkill 好很多。 除此之外,Windows 还提供了许多进程间通信的方法: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574(v=vs.85).aspx 通过进程间通信,甚至可以实现很多除启动、停止服务之外的事情。 当然,以管理员身份执行命令的接口 Windows 自然也是有的: http://stackoverflow.com/questions/19672352/how-to-run-python-script-with-elevated-privilage-on-windows 总之,尽可能让服务进程自己结束(Windows 的服务管理接口也算),尽可能少用 taskkill 这种不优雅的方式。 |
4
linuxzpf OP @geeklian 写服务的时候就已经加入停止的信号了,但是在有的windows上服务还是不能正常停止,所以才想到杀进程是最直接了当的方式。你说的这个方法我还没试过,听起来很高大上嘛
|