python win32service - 获取服务的触发启动信息

时间:2017-10-24 17:36:04

标签: python winapi triggers startup pywin32

win32 API QueryServiceConfig2函数支持SERVICE_CONFIG_TRIGGER_INFO结构,以获取触发服务启动的事件。但是,python的win32service.QueryServiceConfig2()没有列出这样的值作为参数选项。是否可以使用win32service模块获取该信息?

1 个答案:

答案 0 :(得分:0)

不幸的是,没有。这是在 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 ,注意到 ChangeServiceConfig 2 (以及 QueryServiceConfig 2 ),针对上述常量专门检查 InfoLevel 参数,从而传递其值(< strong> 8 )直接引发异常( NotImplementedError )。

在进一步讨论之前,让我们先了解一下在调用这样的 Python 包装器时会发生什么(如win32service.QueryServiceConfig2):

  1. 参数( Python 样式 - 如果有的话)转换为 C 样式
  2. 使用上面转换的参数调用
  3. C 函数
  4. 函数结果(或输出参数) - 如果有的话 - 转换回 Python
  5. 对于[MS.Docs]: ChangeServiceConfig2W function,数据通过参数来回传递(取决于 dwInfoLevel 值, lpInfo 可以有多种含义):

    添加对所有这些参数的支持并不是一项微不足道的任务,因此不会处理它们(至少目前是这样)。

    还有更多像这样的例子,我想这是一个优先事项,因为没有多少人要求功能,加上 MS (不幸?)设计决定要有这样的功能复杂的行为。

    作为替代方案(非常复杂),您可以使用[Python 3.Docs]: ctypes - A foreign function library for Python,但是您必须定义我在 Python 中列出的所有结构(以扩展{{ 1}})。

    • 作为旁注,我确实遇到过一次:我不得不打电话给[MS.Docs]: LsaLogonUser function !!! 14个怪异的争论!!! )。显然,它不是由 PyWin32 导出的,所以我通过 ctypes 调用它,但我不得不写:
      • ~170 用于定义结构的代码行(仅限于我的方案所需的代码行)
      • ~50 行填充并调用函数