win32 API QueryServiceConfig2函数支持SERVICE_CONFIG_TRIGGER_INFO结构,以获取触发服务启动的事件。但是,python的win32service.QueryServiceConfig2()没有列出这样的值作为参数选项。是否可以使用win32service模块获取该信息?
很不幸的是,不行。这是在Python 3.5和PyWin32 v221下运行的简单代码片段:
#!/usr/bin/env python3
import win32service
if __name__ == "__main__":
for name in dir(win32service):
if name.startswith("SERVICE_CONFIG_"):
print(name, getattr(win32service, name))
输出:
(py35x64_test) e:\Work\Dev\StackOverflow\q046916726>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" a.py SERVICE_CONFIG_DELAYED_AUTO_START_INFO 3 SERVICE_CONFIG_DESCRIPTION 1 SERVICE_CONFIG_FAILURE_ACTIONS 2 SERVICE_CONFIG_FAILURE_ACTIONS_FLAG 4 SERVICE_CONFIG_PRESHUTDOWN_INFO 7 SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO 6 SERVICE_CONFIG_SERVICE_SID_INFO 5
我还检查了win32con(这是另一个PyWin32模块,只包含常量定义),但也没有运气。
然后,我看了$ {PYWIN32_SRC_DIR} /pywin32-221/win32/src/win32service.i,并注意到对于ChangeServiceConfig2(以及QueryServiceConfig2),InfoLevel参数是针对上述常量进行专门检查的,因此通过了它value(8)直接引发异常(NotImplementedError)。
在进一步讨论之前,让我们花点时间了解调用这样的Python包装器(如win32service.QueryServiceConfig2
)时会发生什么:
对于[MS.Docs]: ChangeServiceConfig2W function,数据通过参数来回传递(取决于dwInfoLevel值,lpInfo可以有多种含义):
添加对所有这些参数的支持并不是一项微不足道的任务,因此不会处理它们(至少目前是这样)。
还有更多像这样的例子,我想这是一个优先事项,因为没有多少人要求功能,加上MS的(不幸?)设计决定具有这种复杂行为的功能。
作为替代方案(非常复杂),您可以使用[Python 3.Docs]: ctypes - A foreign function library for Python,但是您必须定义我在Python中列出的所有结构(以扩展ctypes.Structure
)。