我需要使用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代码,它运行得很好。我还尝试在下一台机器\解释器上运行上面的代码:
service_h
不是0,
GetLastError为0service_h
不是0,GetLastError是0service_h
不是0,GetLastError是6,service_h
可以用于其他服务功能,如StartService
service_h
不是0,GetLastError是0service_h
为0,GetLastError为6,引发异常。在总结这些测试:
OpenService
返回0,并在上面的代码中引发错误,有时它返回正确的句柄,可用于StartServiceA
等其他服务函数中,而且这个函数工作得很好(至少我尝试过启动服务并启动它)。在
目前没有回答
相关问题 更多 >
编程相关推荐