首页 文章

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

提问于
浏览
2

我正在使用WMI(首先在VBScript中对所有内容进行原型设计,因为示例更丰富并且它消除了VBScript / Python阻抗)以远程连接到新PC(我们称之为PC2) . 大多数 Win32_* 类可以远程读取,但 Win32_Printer 在查询时返回空集,但仅在我远程查询时才返回 . 结果 SWbemObjectSet.Count 始终为零 . 没错 . 我可以连接到PC1并接收带有非零 .CountSWbemObjectSet ,可以迭代它等等 . 如果我在本地运行脚本(自然地从 .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 的错误,"The RPC server is unavailable."

  • 原因2:我可以轻松访问并运行WMI类 Win32_ComputerSystem .

它似乎不是用户名/密码问题 .

  • 原因1:我可以从 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 并使用相同的用户名,密码,身份验证级别,模拟级别,命名空间等,我收到相同的空集以获得答案 .

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

  • 原因1:使用与脚本使用的凭据相同的凭据登录目标计算机生成结果 .

  • 原因2: Win32_PrinterWin32_ComputerSystem 位于同一名称空间中 . Win32_ComputerSystem 有效 .

  • 原因3:使用 Wmimgmt.msc Microsoft管理控制台(MMC)为超级用户授予完全权限后,从根命名空间开始,传播到"This namespace and subnamespaces,"重新启动,然后再次检查,我仍然收到相同的空集 .

它似乎不是PC2和PC1的相应OU .

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

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

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

对于 Win32_Printer 而言,远程访问不起作用似乎并不神奇 .

  • 原因:我可以阅读PC1的 Win32_Printer 课程 .

看来我的WQL并不常见 .

  • 原因:“ SELECT * FROM Win32_Printer ”是我的测试用例 .

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

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

我甚至在WMI-Activity中点击跟踪日志,为PC1和PC2打印出来,然后按 GroupOperationIDOperationID 排序( 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

在两组日志中,如果按 GroupOperationIDOperationID 排序,它们似乎按相同的顺序排列 . 按 EventID 排序显示的顺序略有不同 . 那个's the closest I can see to a difference. I'在这一点上很难过 .

我知道这个问题危险地接近系统管理问题 .

2 回答

  • 2

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

  • 0

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

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

    编辑:

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

相关问题