获取ADSI对象的用户域名?
Get the domain name of the user of ADSI object?
在下面的脚本中,它会打印组的所有用户。但是,缺少域名(某些用户在不同的 Windows 域中)?
$computer = [ADSI]"WinNT://$server,computer"
$computer.psbase.children | ? {
$_.psbase.schemaClassName -eq 'group'
} | % {
$gn = $_.name.ToString()
write-host $gn
write-host "------"
$group =[ADSI]$_.psbase.Path
$group.psbase.Invoke("Members") | % {
$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
}
}
尝试获取 SID 而不是名称并将其转换回用户名:
$computer.psbase.children | ? {
$_.psbase.schemaClassName -eq 'group'
} | % {
$gn = $_.name.ToString()
write-host $gn
write-host "------"
$group =[ADSI]$_.psbase.Path
$group.psbase.Invoke("Members") | % {
<b>$bytes =</b> $_.GetType().InvokeMember(<b>'objectSid'</b>, 'GetProperty', $null, $_, $null)
<b>$sid = New-Object Security.Principal.SecurityIdentifier ($bytes, 0)
$sid.Translate([Security.Principal.NTAccount])</b>
}
}
结果应包括计算机或域名。
我们有一个类似的问题,计算机上有来自不同域的帐户,我们需要该域。不幸的是,我认为 SID 提取对于本地帐户和计算机在某些情况下曾经加入的域不起作用,因此它没有 return 所有结果。
这是我为我们找到的最佳解决方案:
Admin = $_.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $_, $null)
会 return 结果像
WinNT://#domain#/#account#
或WinNT://#domain of computer#/#computer-name#/#account#
对于本地帐户
$servers= get-content 'C:\temp\work\localadmins\serverlist_in.txt'
$output = 'C:\temp\work\localadmins\serverlist_out.csv'
$results = @()
foreach($server in $servers)
{
$admins = @()
$group =[ADSI]"WinNT://$server/Administrators"
$members = @($group.psbase.Invoke("Members"))
$members | foreach {
$obj = new-object psobject -Property @{
Server = $Server
Admin = $_.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $_, $null)
}
$admins += $obj
}
$results += $admins
}
$results | Export-csv $Output -NoTypeInformation
在下面的脚本中,它会打印组的所有用户。但是,缺少域名(某些用户在不同的 Windows 域中)?
$computer = [ADSI]"WinNT://$server,computer"
$computer.psbase.children | ? {
$_.psbase.schemaClassName -eq 'group'
} | % {
$gn = $_.name.ToString()
write-host $gn
write-host "------"
$group =[ADSI]$_.psbase.Path
$group.psbase.Invoke("Members") | % {
$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
}
}
尝试获取 SID 而不是名称并将其转换回用户名:
$computer.psbase.children | ? {
$_.psbase.schemaClassName -eq 'group'
} | % {
$gn = $_.name.ToString()
write-host $gn
write-host "------"
$group =[ADSI]$_.psbase.Path
$group.psbase.Invoke("Members") | % {
<b>$bytes =</b> $_.GetType().InvokeMember(<b>'objectSid'</b>, 'GetProperty', $null, $_, $null)
<b>$sid = New-Object Security.Principal.SecurityIdentifier ($bytes, 0)
$sid.Translate([Security.Principal.NTAccount])</b>
}
}
结果应包括计算机或域名。
我们有一个类似的问题,计算机上有来自不同域的帐户,我们需要该域。不幸的是,我认为 SID 提取对于本地帐户和计算机在某些情况下曾经加入的域不起作用,因此它没有 return 所有结果。
这是我为我们找到的最佳解决方案:
Admin = $_.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $_, $null)
会 return 结果像
WinNT://#domain#/#account#
或WinNT://#domain of computer#/#computer-name#/#account#
对于本地帐户
$servers= get-content 'C:\temp\work\localadmins\serverlist_in.txt'
$output = 'C:\temp\work\localadmins\serverlist_out.csv'
$results = @()
foreach($server in $servers)
{
$admins = @()
$group =[ADSI]"WinNT://$server/Administrators"
$members = @($group.psbase.Invoke("Members"))
$members | foreach {
$obj = new-object psobject -Property @{
Server = $Server
Admin = $_.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $_, $null)
}
$admins += $obj
}
$results += $admins
}
$results | Export-csv $Output -NoTypeInformation