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

python win32service-获取服务的触发启动信息,python,winapi,triggers,startup,pywin32,Python,Winapi,Triggers,Startup,Pywin32,win32 API函数支持服务配置触发信息结构,以获取触发服务启动的事件。但是,python并没有将此类值列为参数选项。win32service模块是否有可能获取这些信息?不幸的是,没有。这里有一个在Python 3.5和PyWin32 v221下运行的简单代码片段: #/usr/bin/env蟒蛇3 导入win32service 如果名称=“\uuuuu main\uuuuuuuu”: 对于目录中的名称(win32service): 如果name.startswith(“服务配置”): 打印(

win32 API函数支持服务配置触发信息结构,以获取触发服务启动的事件。但是,python并没有将此类值列为参数选项。win32service模块是否有可能获取这些信息?

不幸的是,没有。这里有一个在Python 3.5和PyWin32 v221下运行的简单代码片段:

#/usr/bin/env蟒蛇3
导入win32service
如果名称=“\uuuuu main\uuuuuuuu”:
对于目录中的名称(win32service):
如果name.startswith(“服务配置”):
打印(名称,getattr(win32service,名称))
输出

(py35x64_测试)e:\Work\Dev\StackOverflow\q046916726>“c:\Work\Dev\VEnvs\py35x64_测试\Scripts\python.exe”a.py
服务配置延迟自动启动信息3
服务配置描述1
服务配置故障操作2
服务配置失败动作标志4
服务配置预关机信息7
服务配置所需权限信息6
服务配置服务SID信息5
我还检查了win32con(这是另一个PyWin32模块,只包含常量定义),但也没有运气

然后,我查看了${PYWIN32_SRC_DIR}/PYWIN32-221/win32/SRC/win32service.I,并注意到对于ChangeServiceConfig2(以及QueryServiceConfig2),InfoLevel参数是针对上述常量进行专门检查的,因此直接传递其值(8),将引发异常(NotImplementedError)

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

  • 参数(Python样式-如果有)转换为C样式
  • 使用上述转换的参数调用C函数
  • 函数结果(或输出参数)(如果有)被转换回Python
  • 例如,数据通过参数来回传输(取决于dwInfoLevel值,lpInfo可以有多种含义):

    • 让我们看一看支持的值:例如服务配置预关机信息:
      • lpInfo是指向仅具有dwPreshutdownTimeout成员(简单DWORD)的
    • 另一方面,服务配置触发信息:

      • lpInfo是指向
        • pTriggers成员是指向
          • pDataItems成员是指向
      哪一个更复杂(请注意,所有涉及的结构也有其他成员,我只列出了增加嵌套级别的成员)

    为所有这些参数添加支持并不是一项简单的任务,因此它们不会被处理(至少目前是这样)

    像这样的例子还有很多,我想这是一个优先考虑的问题,因为没有多少人要求功能,再加上MS(不幸?)的设计决策,使功能具有如此复杂的行为

    作为一种替代方法(相当复杂),您可以使用,但必须定义我在Python中列出的所有结构(扩展
    ctypes.Structure

    • 顺便说一句,我曾经遇到过这样的情况:我不得不打电话(!!!14个奇怪的论点!!!)。显然,它不是由PyWin32导出的,所以我通过ctypes调用它,但我必须编写:
      • ~170用于定义结构的代码行(仅限于我的场景所需的代码行)
      • ~50行来填充它们并调用函数

      • 不幸的是,没有。下面是一个在Python 3.5和PyWin32 v221下运行的简单代码片段:

        #/usr/bin/env蟒蛇3
        导入win32service
        如果名称=“\uuuuu main\uuuuuuuu”:
        对于目录中的名称(win32service):
        如果name.startswith(“服务配置”):
        打印(名称,getattr(win32service,名称))
        
        输出

        (py35x64_测试)e:\Work\Dev\StackOverflow\q046916726>“c:\Work\Dev\VEnvs\py35x64_测试\Scripts\python.exe”a.py
        服务配置延迟自动启动信息3
        服务配置描述1
        服务配置故障操作2
        服务配置失败动作标志4
        服务配置预关机信息7
        服务配置所需权限信息6
        服务配置服务SID信息5
        
        我还检查了win32con(这是另一个PyWin32模块,只包含常量定义),但也没有运气

        然后,我查看了${PYWIN32_SRC_DIR}/PYWIN32-221/win32/SRC/win32service.I,并注意到对于ChangeServiceConfig2(以及QueryServiceConfig2),InfoLevel参数是针对上述常量进行专门检查的,因此直接传递其值(8),将引发异常(NotImplementedError)

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

      • 参数(Python样式-如果有)转换为C样式
      • 使用上述转换的参数调用C函数
      • 函数结果(或输出参数)(如果有)被转换回Python
      • 例如,数据通过参数来回传输(取决于dwInfoLevel值,lpInfo可以有多种含义):

        • 让我们看一看支持的值:例如服务配置预关机信息:
          • lpInfo是指向仅具有dwPreshutdownTimeout成员(简单DWORD)的
        • 另一方面,服务配置触发信息:

          • lpInfo是指向
            • pTriggers成员是指向
              • pDataItems成员是指向
          哪一个更复杂(请注意,所有涉及的结构也有其他成员,我只列出了增加嵌套级别的成员)

        艾丁