为什么远程WMI调用Win32_Printer返回某些机器的空集?

时间:2011-10-21 19:02:11

标签: wmi

我正在使用WMI(首先在VBScript中对所有内容进行原型设计,因为示例更加丰富并且它消除了VBScript / Python阻抗)以远程连接到新PC(我们称之为PC2)。大多数Win32_*类可以远程读取,但Win32_Printer在查询时返回空集,但仅在我远程查询时才返回。生成的SWbemObjectSet始终具有零.Count。没错。我可以连接到PC1并接收带有非零SWbemObjectSet的{​​{1}},可以迭代它等等。如果我在本地运行脚本(从{{1中删除超级用户用户名和密码后)我自然得到一个非零.Count并且可以迭代它。即使我愚蠢地使用我自己的域管理员帐户,问题仍然存在。剧本:

.ConnectServer

为简洁起见,省略了注释和错误检查。

它似乎不是防火墙问题。

  • 原因1:如果确实存在防火墙阻塞,则会收到错误消息 从.Count返回,“RPC服务器不可用。”
  • 原因2:我可以访问并运行WMI类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检索信息。
  • 原因2:我应该收到错误。

它似乎不是操作系统版本问题:

  • 原因:PC2和PC1都运行Windows 7 Professional。 PC1运行的是64位版本,PC2运行的是32位。

虽然我开始尝试从64位服务器访问32位计算机,但它似乎不是32位与64位问题。

  • 原因1:我在Win32_ComputerSystem尝试前Win32_ComputerSystem32添加了值__ProviderArchitecture(参数中包含SWbemNamedValueSet虽然我无法在没有类型不匹配运算符的情况下将相同的上下文添加到已连接服务器的.ConnectServer方法中,但无济于事。
  • 原因2:我后来从具有相同结果的32位服务器运行脚本。

它似乎不是一个损坏的WMI问题。

  • 原因:一旦我停止使用凭据,我就可以从目标计算机本身运行脚本,并接收一个包含多个项目的结果集,并可以遍历它。

我的脚本中似乎没有凭据/命名空间错误。

  • 原因:使用来自同一源计算机的SWbemNamedValueSet并使用相同的用户名,密码,身份验证级别,模拟级别,命名空间等等,我会收到相同的空集以供回答。

它似乎不是目标计算机上WMI命名空间安全性的问题。

  • 原因1:使用与脚本使用的凭据相同的凭据登录目标计算机生成结果。
  • 原因2:.ExecQueryWBemTest.exe位于同一名称空间中。 Win32_Printer有效。
  • 原因3:使用Win32_ComputerSystem Microsoft管理控制台(MMC)为超级用户授予完全权限后,从根命名空间开始,传播到“此命名空间和子命名空间”,重新启动并再次检查,我仍然收到相同的空集。

似乎不是PC2和PC1的相应OU是问题所在。

  • 原因:我交换了每台机器所在的OU并重新启动。没有变化。

它似乎不是本地计算机组:

  • 原因:我使PC2中的组成员身份看起来像PC1并重新启动。没有变化。

对于Win32_ComputerSystem,远程访问不起作用似乎并不神奇。

  • 原因:我可以阅读PC1的Wmimgmt.msc课程。

我的WQL似乎并不常见。

  • 原因:“Win32_Printer”是我的测试用例。

我的DCOM设置似乎没有关闭。

  • 原因:当我通过PC1和PC2时,它们看起来相同。

我甚至在WMI-Activity中点击跟踪日志,为PC1和PC2打印出来,然后按Win32_PrinterSELECT * 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排序显示的顺序略有不同。这是我能看到的最接近的差异。我在这一点上很难过。

我知道这种情况危险地接近系统管理问题。

2 个答案:

答案 0 :(得分:2)

在win32_printer spec page中找到此链接引用此问题http://www.lansweeper.com/forum/yaf_postsm18178_WMI-Security-PowershellLansweeper.aspx#post18178似乎只返回此用户的打印机安装程序,而不是系统上的所有打印机。因此,如果您从未使用用于枚举打印机的用户凭据登录到远程系统,则会得到空的结果。

答案 1 :(得分:0)

看起来你有很好的机会。 ServerFault可能会产生更多......

这是一个很长的镜头,但我曾经听过终端服务被禁用,在发布WMI查询时会出现问题......

编辑:

这可能不适用,但值得一看:AD Delegation