获取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