我知道如何通过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
的成员,我需要知道他是会员 - 因此也是本地管理员。所以,我需要扩展(可能是递归地)所有组成员。
是否有可以在win32_group
上自行加入的WMI查询,扩展了本地管理员所有组的所有用户名?
在ASSOCIATORS OF
statement有WMI Query Language (WQL):
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
实用程序的所有输出都是文本(即非对象),必须使用for
loop command进行解析。