使用SecurityIdentifier Class的translate方法从SID中查找域名

时间:2016-09-13 14:34:27

标签: .net powershell active-directory

我正在尝试将foreignSecurityPrincipal对象解析为用户,计算机和组对象。我发现我可以使用SecurityIdentifier类中的translate方法将SID解析为NTAccount值,即' NetBIOSName \ username'。问题是这不是完整的域名名称。我需要DNSRoot名称或其他一些我可以从用户的distinguishedName或CanonicalName中提取域名的属性。有什么方法可以使用translate方法来实现这个目的吗?还是我可以用的其他方法?

(New-Object System.Security.Principal.SecurityIdentifier($Sid)).Translate([System.Security.Principal.NTAccount])

https://gallery.technet.microsoft.com/scriptcenter/Convert-Foreign-Security-1fdbaf46

2 个答案:

答案 0 :(得分:2)

Translate()方法返回IdentityReference个对象。该对象的唯一属性(Value)为您提供已翻译标识的字符串值。

(Get-ADDomain -Identity 'DOMAIN').DNSroot可能会为您提供您正在寻找的内容。

如果NetBIOS域名太不明确,您可以尝试这样的事情:

  • 获取您的林根域列表。
  • 列举每个森林的域名。
  • 提取每个域SID的domain-specific part
  • 从SID部分和FQDN构建哈希表。
$forest  = 'foo.example.org'
$domains = @{}
Get-ADForest $forest |
    Select-Object -Expand Domains |
    Get-ADDomain |
    ForEach-Object {
        $domains[($_.DomainSID.Value -replace '^S-\d+-\d+-')] = $_.DNSRoot
    }

使用该哈希表,您应该能够通过其用户SID查找用户域:

$userdomain = $domains[($sid -replace '^S-\d+-\d+-(.*?)-\d+$', '$1')]

答案 1 :(得分:0)

您可以尝试以下功能:

function Get-DomainFromSid($Sid){
    $domain = $null
    try{
        $objectSid = New-Object System.Security.Principal.SecurityIdentifier($Sid)
        $domain = Get-ADDomain -Identity $objectSid.AccountDomainSid | Select-Object -ExpandProperty DNSRoot
    }    
    catch{
        Write-Verbose "Failed to get domain from Sid"
    }
    return $domain
}