我正在尝试将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
答案 0 :(得分:2)
Translate()
方法返回IdentityReference
个对象。该对象的唯一属性(Value
)为您提供已翻译标识的字符串值。
(Get-ADDomain -Identity 'DOMAIN').DNSroot
可能会为您提供您正在寻找的内容。
如果NetBIOS域名太不明确,您可以尝试这样的事情:
$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
}