获取ADSI对象的用户的域名?

在下面的脚本中,它将打印组的所有用户。 但是,域名缺失(有些用户在不同的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") | % { $bytes = $_.GetType().InvokeMember( 'objectSid' , 'GetProperty', $null, $_, $null) $sid = New-Object Security.Principal.SecurityIdentifier ($bytes, 0) $sid.Translate([Security.Principal.NTAccount]) } } 

结果应该包括计算机或域名。

在计算机上有来自不同域的帐户,我们也有类似的问题,我们需要返回域名。 不幸的是,在某些情况下,SID获取不起作用,我认为对于本地帐户和计算机曾经加入的域来说,它并没有返回所有的结果。

这是我找到的最好的解决方案:

 Admin = $_.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $_, $null) 

会返回结果如

 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