我正在使用WMI(首先在VBScript中对所有内容进行原型设计,因为示例更加丰富并且它消除了VBScript / Python阻抗)以远程连接到新PC(我们称之为PC2)。大多数Win32_*
类可以远程读取,但Win32_Printer
在查询时返回空集,但仅在我远程查询时才返回。生成的SWbemObjectSet
始终具有零.Count
。没错。我可以连接到PC1并接收带有非零SWbemObjectSet
的{{1}},可以迭代它等等。如果我在本地运行脚本(从{{1中删除超级用户用户名和密码后)我自然得到一个非零.Count
并且可以迭代它。即使我愚蠢地使用我自己的域管理员帐户,问题仍然存在。剧本:
.ConnectServer
为简洁起见,省略了注释和错误检查。
它似乎不是防火墙问题。
.Count
返回,“RPC服务器不可用。”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
轻松。它似乎不是用户名/密码问题。
SWbemLocator
检索信息。它似乎不是操作系统版本问题:
虽然我开始尝试从64位服务器访问32位计算机,但它似乎不是32位与64位问题。
Win32_ComputerSystem
尝试前Win32_ComputerSystem
为32
添加了值__ProviderArchitecture
(参数中包含SWbemNamedValueSet
虽然我无法在没有类型不匹配运算符的情况下将相同的上下文添加到已连接服务器的.ConnectServer
方法中,但无济于事。它似乎不是一个损坏的WMI问题。
我的脚本中似乎没有凭据/命名空间错误。
SWbemNamedValueSet
并使用相同的用户名,密码,身份验证级别,模拟级别,命名空间等等,我会收到相同的空集以供回答。它似乎不是目标计算机上WMI命名空间安全性的问题。
.ExecQuery
与WBemTest.exe
位于同一名称空间中。 Win32_Printer
有效。Win32_ComputerSystem
Microsoft管理控制台(MMC)为超级用户授予完全权限后,从根命名空间开始,传播到“此命名空间和子命名空间”,重新启动并再次检查,我仍然收到相同的空集。似乎不是PC2和PC1的相应OU是问题所在。
它似乎不是本地计算机组:
对于Win32_ComputerSystem
,远程访问不起作用似乎并不神奇。
Wmimgmt.msc
课程。我的WQL似乎并不常见。
Win32_Printer
”是我的测试用例。我的DCOM设置似乎没有关闭。
我甚至在WMI-Activity中点击跟踪日志,为PC1和PC2打印出来,然后按Win32_Printer
,SELECT * FROM Win32_Printer
排序(GroupOperationID
不够精细,OperationID
似乎......乱序。我可以通过以下操作看到事件:
TimeCreated SystemTime
在两组日志中,如果按EventID
排序,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
排序显示的顺序略有不同。这是我能看到的最接近的差异。我在这一点上很难过。
我知道这种情况危险地接近系统管理问题。
答案 0 :(得分:2)
在win32_printer spec page中找到此链接引用此问题http://www.lansweeper.com/forum/yaf_postsm18178_WMI-Security-PowershellLansweeper.aspx#post18178似乎只返回此用户的打印机安装程序,而不是系统上的所有打印机。因此,如果您从未使用用于枚举打印机的用户凭据登录到远程系统,则会得到空的结果。
答案 1 :(得分:0)
看起来你有很好的机会。 ServerFault可能会产生更多......
这是一个很长的镜头,但我曾经听过终端服务被禁用,在发布WMI查询时会出现问题......
编辑:
这可能不适用,但值得一看:AD Delegation