python 与 py2exe 写的服务进程在 win8 上怎么杀掉?

2015-02-15 11:33:39 +08:00
 linuxzpf

用py2exe打包的一个windows服务进程,在win8上用taskkill杀,只有打开管理员权限的cmd才能杀掉,问题是软件更新时我要用脚本或者程序自动杀掉它,所以怎么在脚本中获取使用win8的管理员权限杀掉进程呢? 图形界面和右键点击神马的就不说了。

3015 次点击
所在节点    Python
5 条回复
geeklian
2015-02-15 12:21:55 +08:00
如果脚本就能骗过UAC,那微软还是倒闭算了。
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/
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 这种不优雅的方式。
linuxzpf
2015-02-15 22:34:10 +08:00
@geeklian 写服务的时候就已经加入停止的信号了,但是在有的windows上服务还是不能正常停止,所以才想到杀进程是最直接了当的方式。你说的这个方法我还没试过,听起来很高大上嘛
linuxzpf
2015-02-15 22:35:35 +08:00
@lujjjh 看了下你提供的几个方法,都很高大上嘛,我自己真是搞不来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/171100

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX