【问题标题】:WMI query local administrators including group membersWMI 查询本地管理员,包括组成员
【发布时间】:2017-07-10 15:15:10
【问题描述】:

我知道如何通过 WMI 获取远程计算机上的本地管理员列表:

wmic /Node:"ComputerName" path win32_groupuser where (groupcomponent="win32_group.name=\"administrators\",domain=\"Computername\"")

这将返回用户和组:

GroupComponent PartComponent win32_group.domain="Computername",name="administrators" \\Computername\root\cimv2:Win32_UserAccount.Domain="Computername",Name="Administrator" win32_group.domain="Computername",name="administrators" \\Computername\root\cimv2:Win32_Group.Domain="MYDOMAIN",Name="Domain Admins" win32_group.domain="Computername",name="administrators" \\Computername\root\cimv2:Win32_Group.Domain="MYDOMAIN",Name="SomeOtherGroup" win32_group.domain="Computername",name="administrators" \\Computername\root\cimv2:Win32_UserAccount.Domain="MYDOMAIN",Name="MyUser"

但是,如果用户是上述SomeOtherGroup 的成员,我需要知道他是成员 - 因此是本地管理员。所以,我需要(可能递归地)扩展所有组成员。

是否有一个 WMI 查询可以在 win32_group 上自行加入,扩展所有本地管理员组的所有用户名?

【问题讨论】:

    标签: wmi wmi-query wmic wql


    【解决方案1】:

    WMI Query Language (WQL)中有ASSOCIATORS OF statement

    ASSOCIATORS OF 语句检索所有实例 与特定的源实例相关联。的实例 检索到的被称为端点。返回每个端点 它与源之间存在关联的次数 对象。

    下面的 VBScript 应该可以完成这项工作:

    option explicit
    
    Function wmiGroupMembers( sGroupName, intLevel)
      Dim colSubGroups, colSubGroup, sQuery
    
      sQuery = "Associators of {win32_group.domain=""" & sDomainName & _
                                          """,name=""" & sGroupName & """} " _
            & "Where ResultRole = PartComponent"
    
      Set colSubGroups = objWMIService.ExecQuery( sQuery )
      For Each colSubGroup in colSubGroups
        If LCase( colSubGroup.Path_.Class) = "win32_group" Then
          wmiGroupMembers colSubGroup.Name, intLevel + 1
        End If 
        sResult = sResult & vbNewLine & intLevel _
                              & vbTab & sGroupName _
                              & vbTab & colSubGroup.Domain _
                              & vbTab & colSubGroup.Name
      Next
    End Function
    
    Dim sResult, wshNetwork, sComputerName, sDomainName, objWMIService
    sResult = ""
    Set wshNetwork    = WScript.CreateObject( "WScript.Network" )
        sComputerName = wshNetwork.ComputerName
        sDomainName   = UCase( wshNetwork.UserDomain)
    Set objWMIService = GetObject("winmgmts:\\" & sComputerName & "\root\cimv2")
    
    wmiGroupMembers "administrators", 0
    
    Wscript.Echo sResult
    

    请注意,虽然有一个 wmic 等效项(请参阅 ASSOC verb),但它的使用可能是一个棘手的问题,因为任何 cmd 实用程序的所有输出都是文本(即不是对象)并且必须使用 @987654324 进行解析@。

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      相关资源
      最近更新 更多