在Python中获取Windows服务句柄

2024-09-27 04:29:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用Python(版本3)中的Windows(10)上的服务。在启动和停止它们之前,我需要获取服务句柄。首先,我获得SCManager句柄(成功),然后我试图通过OpenService获得服务句柄(在示例中是“Dhcp”服务)。这是我的代码:

from ctypes import *
from ctypes.wintypes import *

OpenSCManager = windll.advapi32.OpenSCManagerA
OpenService = windll.advapi32.OpenServiceA
GetLastError = windll.kernel32.GetLastError

SC_MANAGER_ALL_ACCESS = DWORD(0xF003F)
SERVICE_ALL_ACCESS = DWORD(0xF01FF)

name = "Dhcp"

sc_manager_h = OpenSCManager(None, None, SC_MANAGER_ALL_ACCESS)
if sc_manager_h == 0: 
    raise Exception(GetLastError())
else:
    print(sc_manager_h)  # <-- OK, no exception, printed some number

service_h = OpenService(sc_manager_h, name.encode("ascii"), SERVICE_ALL_ACCESS)
if service_h == 0:
    raise Exception(GetLastError()) # <-- here raised Exception, GetLastError is 6 (ERROR_INVALID_HANDLE)
else:
    print(service_h)
    print(GetLastError())

运行代码的用户(我是在Administrator下运行的)拥有所有权限(我试图在没有权限的User下运行,并且OpenSCManager引发了正确的错误)。我还确信name或serviceassess常量没有问题,还有另一个GetLastError代码。存在这样名称的服务(在我的例子中是Dhcp)。似乎好像我以错误的方式将SCManager句柄传递给OpenService,但我不知道其他方法。在

关于OpenService的文档:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684330(v=vs.85).aspx

更新1

正如@conio建议的那样,我尝试了等效的C代码,它运行得很好。我还尝试在下一台机器\解释器上运行上面的代码:

  • Windows XP,Python3.4.3:运行良好,service_h不是0, GetLastError为0
  • Windows7,Python3.4.3:运行良好,service_h不是0,GetLastError是0
  • Windows 7(与以前的机器相同),Python3.6.2:工作错误,service_h不是0,GetLastError是6,service_h可以用于其他服务功能,如StartService
  • Windows10,Python3.4.3:运行良好,service_h不是0,GetLastError是0
  • Windows 10(与以前的计算机相同),Python3.6.2:工作错误,service_h为0,GetLastError为6,引发异常。在

总结这些测试:

  • python3.4.3运行良好
  • Python3.6.2工作错误,它总是将GetLastError设置为6,但有时它从OpenService返回0,并在上面的代码中引发错误,有时它返回正确的句柄,可用于StartServiceA等其他服务函数中,而且这个函数工作得很好(至少我尝试过启动服务并启动它)。在

Tags: 代码nameaccesswindows错误serviceexceptionmanager

热门问题