【发布时间】:2011-10-21 19:02:11
【问题描述】:
我正在使用 WMI(首先在 VBScript 中对所有内容进行原型设计,因为示例更加丰富,并且它消除了 VBScript/Python 的障碍)远程连接到新的 PC(我们将其称为 PC2)。大多数Win32_* 类可以远程读取,但Win32_Printer 在查询时返回一个空集,但仅在我远程查询时。结果 SWbemObjectSet 的 .Count 始终为零。没有错误。我可以连接到 PC1 并接收带有非零 .Count 的 SWbemObjectSet,可以遍历它等等。如果我在本地运行脚本(在从 .ConnectServer 方法中删除超级用户用户名和密码之后,自然) ,我得到一个非零的.Count 并可以遍历它。即使我愚蠢地使用自己的域管理员帐户,问题仍然存在。脚本:
strComputer = "nnn.nnn.nnn.nnn"
username = "DOMAIN\superuser"
password = "thisisaverygoodpassword"
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.ImpersonationLevel = 3
objSWbemLocator.Security_.AuthenticationLevel = 6
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, "root\cimv2", username, password)
Set colSWBemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Printer")
WScript.Echo colSWBemObjectSet.Count & " Found."
For Each objPrinter in colSWBemObjectSet
For Each Property in objPrinter.Properties_
If TypeName(Property.Value) = "Variant()" Then
Wscript.Echo """" & Property.Name & """, """ & TypeName(Property.Value) & """, ""Skipping ..."""
Else
Wscript.Echo """" & Property.Name & """, """ & TypeName(Property.Value) & """, """ & Property.Value & """"
End If
Next
Next
为简洁起见,省略了注释和错误检查。
这似乎不是防火墙问题。
- 原因 1:存在防火墙阻塞时,我收到错误消息
从
SWbemLocator返回,“RPC 服务器不可用。” - 原因2:我可以访问和运行WMI类
Win32_ComputerSystem轻松。
这似乎不是用户名/密码问题。
- 原因一:我可以从
Win32_ComputerSystem检索信息。 - 原因 2:我应该得到一个错误。
这似乎不是操作系统版本问题:
- 原因:PC2 和 PC1 都运行 Windows 7 Professional。 PC1 运行 64 位版本,PC2 运行 32 位版本。
虽然我开始尝试从 64 位服务器访问 32 位机器,但这似乎不是 32 位与 64 位的问题。
- 原因 1:我在尝试
.ConnectServer之前在SWbemNamedValueSet中为__ProviderArchitecture添加了32的值(在参数中使用SWbemNamedValueSet无济于事),尽管我后来无法做到将相同的上下文添加到已连接服务器的.ExecQuery方法中,而不使用类型不匹配运算符。 - 原因 2:我后来从 32 位服务器运行脚本,结果相同。
这似乎不是 WMI 损坏问题。
- 原因:一旦我停止使用凭据,我就可以从目标计算机本身运行脚本并接收包含多个项目的结果集,并且可以对其进行迭代。
这似乎不是我的脚本中的凭据/命名空间错误。
- 原因:使用来自同一源计算机的
WBemTest.exe并使用相同的用户名、密码、身份验证级别、模拟级别、命名空间等,我收到相同的 null 集作为答案。
这似乎不是目标机器上的 WMI 命名空间安全问题。
- 原因 1:使用与脚本使用的凭据相同的凭据登录目标计算机会生成结果。
- 原因 2:
Win32_Printer与Win32_ComputerSystem在同一个命名空间中。Win32_ComputerSystem有效。 - 原因 3:使用
Wmimgmt.mscMicrosoft 管理控制台 (MMC) 授予超级用户完全权限后,从根命名空间开始,传播到“此命名空间和子命名空间”,重新启动并再次检查,我仍然收到相同的空集。
问题似乎不是 PC2 和 PC1 各自的 OU。
- 原因:我交换了每台机器所在的 OU 并重新启动。没有变化。
它似乎不是本地计算机组:
- 原因:我使 PC2 中的组成员身份看起来像 PC1 并重新启动。没有变化。
Win32_Printer 似乎没有什么神奇之处,因为远程访问不起作用。
- 原因:我可以阅读PC1的
Win32_Printer类。
我的 WQL 似乎没有异常。
- 原因:“
SELECT * FROM Win32_Printer”是我的测试用例。
我的 DCOM 设置似乎没有关闭。
- 原因:当我通过 PC1 和 PC2 时,它们看起来相同。
我什至甚至在 WMI-Activity 中点击 Trace 日志,为 PC1 和 PC2 打印它们,然后按GroupOperationID、OperationID 排序(TimeCreated SystemTime 不够精细,@ 987654350@ 似乎...出现故障。我可以从以下操作中看到事件:
IWbemServices::Connect
Start IWbemServices::ExecQuery - Select * from __ClassProviderRegistration
Start IWbemServices::GetObject - __Win32Provider.Name="WmiPerfClass"
Start IWbemServices::ExecQuery - references of {__Win32Provider.Name="WmiPerfClass"}
Start IWbemServices::GetObject - Win32_Printer
Start IWbemServices::ExecQuery - Select * From Win32_Printer
Provider::CreateInstanceEnum - Win32_Printer
在两组日志中,如果我按GroupOperationID、OperationID 排序,它们似乎以相同的顺序发生。按EventID 排序显示出一些不同的顺序。这是我能看到的最接近差异的地方。在这一点上我很难过。
我知道这非常接近系统管理问题。
【问题讨论】:
标签: wmi