Python WMI 调用在 Windows 7 下无法工作

4 投票
2 回答
5325 浏览
提问于 2025-04-16 11:39

我在Windows 7上用Python通过win32com使用WMI时遇到了一个棘手的问题。到现在为止,我还没找到解决办法。

这是我的代码:

from win32com.client import GetObject

def get_printers(computer):
    """ Get a list of printers from the specified computer name. """
    wmiservice = GetObject(r"winmgmts:{impersonationLevel=impersonate}!\\" + computer + r"\root\cimv2")
    return wmiservice.ExecQuery("Select * from Win32_Printer")

for printer in get_printers("ps2"):
    print printer.Name

在Windows XP上运行得很好。但是在Windows 7上运行时却完全不行:

Traceback (most recent call last):
  File "C:\Python27\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 325, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Python27\sample\temp2.py", line 8, in <module>
    for printer in get_printers("ps2"):
  File "C:\Python27\sample\temp2.py", line 5, in get_printers
    wmiservice = GetObject(r"winmgmts:{impersonationLevel=impersonate}!\\" + computer + r"\root\cimv2")
  File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 72, in GetObject
    return Moniker(Pathname, clsctx)
  File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 87, in Moniker
    moniker, i, bindCtx = pythoncom.MkParseDisplayName(Pathname)
com_error: (-2147024891, 'Access is denied.', None, None)

我在Windows 7上尝试了我能想到的所有办法:关闭防火墙(没有病毒扫描程序),确保DCOM已启用,确保WMI已启用,并且关闭了用户帐户控制(UAC)。如果能得到任何帮助,我将非常感激。

注意:我在Windows 7 Ultimate x86(以及Windows XP SP3)上使用的是Python 2.7.1和pywin32构建215。

2 个回答

0

错误代码 -2147024891 是因为 DCOM 出现了问题。从 Windows Vista 开始,连接到 WMI 需要对 Windows 防火墙、用户帐户控制(UAC)和 DCOM 的设置进行一些调整。你可以阅读以下文章来解决这些问题。

2

结果发现,这个问题和DCOM、WMI、UAC或者防火墙都没有关系。让我感到惊讶的是,当这些故障发生时,Win 7电脑的事件日志里根本没有任何记录。

我注意到,和最开始的问题一样,Win 7电脑的外发连接显示“访问被拒绝”。但我还发现,进入Win 7电脑的连接(用的是上面提到的同一个python脚本)显示RPC服务器不可用。其他电脑(不是Win 7的那台)在事件日志中也会报告一个kerberos错误(ID 4)。

问题的根源在于我们域里的活动目录出了点问题,特别是这台Win 7电脑。由于某种原因,活动目录错误地认为有多台电脑使用这个名字,这就是kerberos事件日志的来源。

解决这个问题的方法是:先把Win 7电脑从域里移除,给这台电脑换个新名字,然后再把它放回域里。

撰写回答