Powershell ADSI:我可以使用 SID 查询本地管理员组吗?
Powershell ADSI: Can I query the local Administrators group using a SID?
我处于多语言客户端环境中。本地管理员有“Administratoren”、“Administrators”、“Administradores”、“Administrateurs”等。
这适用于使用 Invoke-Expression 获取组成员:
PS C:\> Get-LocalGroupMember -SID "S-1-5-32-544"
ObjectClass Name PrincipalSource
----------- ---- ---------------
Benutzer PC-JOU\Administrator Local
Benutzer PC-JOU\Jou Local
使用普通组名的工作示例,例如在不需要 Invoke-* 的德国客户端上:
PS C:\> $ADSI = [ADSI]"WinNT://IP-of-computer/Administratoren"
PS C:\> $ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)}
WinNT://PC-JOU/Administrator
WinNT://PC-JOU/Jou
但我无法将其与 SID 一起使用以拥有此国际:
PS C:\> $ADSI = [ADSI]"WinNT://IP-of-computer/S-1-5-32-544"
PS C:\> $ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)}
Ausnahme beim Abrufen des Elements "Invoke": "Der Gruppenname konnte nicht gefunden werden."
In Zeile:1 Zeichen:1
+ $ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ExtendedTypeSystemException
+ FullyQualifiedErrorId : CatchFromBaseGetMember
到目前为止,我看到了 sid 的属性值:
PS C:\> $ADSI.objectSid
1
2
0
0
0
0
0
5
32
0
0
0
32
2
0
0
PS C:\> $ADSI.objectSid.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PropertyValueCollection System.Collections.CollectionBase
知道如何将 [ADSI] 与本地管理员的 SID 值一起使用吗?使用 Invoke-Expression 方法可以节省我的时间。
先通过 SID 查找组名如何?
$AdminGroupSid = 'S-1-5-32-544'
$AdminGroup = New-Object System.Security.Principal.SecurityIdentifier($AdminGroupSid)
$AdminGroupName = $AdminGroup.Translate([System.Security.Principal.NTAccount]).Value -replace '.+\'
现在只需处理您的普通代码
$ADSI = [ADSI]"WinNT://IP-of-computer/$AdminGroupName"
$ADSI.Invoke("Members") | ForEach-Object {
$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)
}
已解决:根据 Santiago Squarzon 的评论,我可以使用 WMI 获取实际的本地管理员组名称。有了正确的组名,其他一切都迎刃而解。
工作示例:我从英语域控制器查询,从德语远程计算机获取本地“Administratoren”:
$RemoteAdminGroupName = (Get-WmiObject Win32_Group -Computername 192.168.33.57 -Filter "SID='S-1-5-32-544'").Name
"local admin group on remote machine: $RemoteAdminGroupName"
$ADSI = [ADSI]"WinNT://192.168.33.57/$RemoteAdminGroupName"
$ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)}
结果:
local admin group on remote machine: Administratoren
WinNT://S2016-DE-TEST/Administrator
WinNT://PKI-TEST/Domain Admins
我处于多语言客户端环境中。本地管理员有“Administratoren”、“Administrators”、“Administradores”、“Administrateurs”等。 这适用于使用 Invoke-Expression 获取组成员:
PS C:\> Get-LocalGroupMember -SID "S-1-5-32-544"
ObjectClass Name PrincipalSource
----------- ---- ---------------
Benutzer PC-JOU\Administrator Local
Benutzer PC-JOU\Jou Local
使用普通组名的工作示例,例如在不需要 Invoke-* 的德国客户端上:
PS C:\> $ADSI = [ADSI]"WinNT://IP-of-computer/Administratoren"
PS C:\> $ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)}
WinNT://PC-JOU/Administrator
WinNT://PC-JOU/Jou
但我无法将其与 SID 一起使用以拥有此国际:
PS C:\> $ADSI = [ADSI]"WinNT://IP-of-computer/S-1-5-32-544"
PS C:\> $ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)}
Ausnahme beim Abrufen des Elements "Invoke": "Der Gruppenname konnte nicht gefunden werden."
In Zeile:1 Zeichen:1
+ $ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ExtendedTypeSystemException
+ FullyQualifiedErrorId : CatchFromBaseGetMember
到目前为止,我看到了 sid 的属性值:
PS C:\> $ADSI.objectSid
1
2
0
0
0
0
0
5
32
0
0
0
32
2
0
0
PS C:\> $ADSI.objectSid.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PropertyValueCollection System.Collections.CollectionBase
知道如何将 [ADSI] 与本地管理员的 SID 值一起使用吗?使用 Invoke-Expression 方法可以节省我的时间。
先通过 SID 查找组名如何?
$AdminGroupSid = 'S-1-5-32-544'
$AdminGroup = New-Object System.Security.Principal.SecurityIdentifier($AdminGroupSid)
$AdminGroupName = $AdminGroup.Translate([System.Security.Principal.NTAccount]).Value -replace '.+\'
现在只需处理您的普通代码
$ADSI = [ADSI]"WinNT://IP-of-computer/$AdminGroupName"
$ADSI.Invoke("Members") | ForEach-Object {
$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)
}
已解决:根据 Santiago Squarzon 的评论,我可以使用 WMI 获取实际的本地管理员组名称。有了正确的组名,其他一切都迎刃而解。
工作示例:我从英语域控制器查询,从德语远程计算机获取本地“Administratoren”:
$RemoteAdminGroupName = (Get-WmiObject Win32_Group -Computername 192.168.33.57 -Filter "SID='S-1-5-32-544'").Name
"local admin group on remote machine: $RemoteAdminGroupName"
$ADSI = [ADSI]"WinNT://192.168.33.57/$RemoteAdminGroupName"
$ADSI.Invoke("Members") | foreach {$_.GetType().InvokeMember("ADsPath", 'GetProperty', $null, $_, $null)}
结果:
local admin group on remote machine: Administratoren
WinNT://S2016-DE-TEST/Administrator
WinNT://PKI-TEST/Domain Admins