2017-07-10 3 views
0

je sais comment récupérer une liste des administrateurs locaux sur une machine distante via WMI:requête WMI administrateurs locaux, y compris les membres du groupe

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

Ceci renvoie les utilisateurs et les groupes:

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"

Cependant, si un utilisateur est un membre de SomeOtherGroup ci-dessus, j'ai besoin de savoir qu'il est membre - et donc un administrateur local. Donc, j'ai besoin d'étendre (probablement récursivement) tous les membres du groupe.

Existe-t-il une requête WMI pouvant se rejoindre automatiquement sur win32_group, en développant tous les noms d'utilisateurs de tous les groupes qui sont des administrateurs locaux?

Répondre

0

Il est ASSOCIATORS OF statement dans le WMI Query Language (WQL):

La déclaration ASSOCIATORS OF récupère toutes les instances qui sont associés à une instance de source particulière. Les instances récupérées sont appelées les points de terminaison. Chaque point de terminaison est renvoyé autant de fois qu'il existe d'associations entre celui-ci et l'objet source .

Le VBScript suivant doit faire le travail:

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 

Notez que bien qu'il y ait un wmic équivalent (voir ASSOC verb), il est l'utilisation pourrait être un problème difficile que toutes les sorties de toute utilité cmd est du texte (c'est-à-dire pas des objets) et doit être analysé en utilisant for loop command.