我有一个ForeignSecurityPrincipals,需要将它解析为distinguishedName,但不确定如何解决。
我有这个代码来获取NTAccount
$m = "CN=S-1-1-11-1111111111-1111111111-1111111111-1111111,CN=ForeignSecurityPrincipals,DC=one,DC=two,DC=company,DC=com"
$member = [ADSI]("LDAP://" + $m)
$sid = New-Object System.Security.Principal.SecurityIdentifier ($member.objectSid[0], 0)
$sid.Translate([System.Security.Principal.NTAccount]).value发布于 2018-02-16 14:43:43
可以使用SID绑定到对象(然后获取distinguishedName),但至少必须知道域的DNS名称:
$user = [ADSI]"LDAP://$domaindns/<SID=$($sid.Value)>"要获取域的DNS名称,您需要检查域所具有的所有信任,并将DNS名称和域的SID存储在列表中。然后,您可以将用户SID的域部分与您的列表匹配,并获得DNS名称(用户的SID将以域的SID开始)。
此页有一些关于提取所有信任的信息,但是他最后使用的方法是WMI,这可能不起作用,这取决于您的权限。不是为了我。你也可以对ADSI做同样的事,但我还没做过。至少这是个起点。
更新:
你可以试试这个:
$DomainSIDList = @{}
$Forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
#Get trusts from each domain in the forest -- this will include forest trusts
ForEach($Domain in $Forest.Domains) {
$adsisearcher = New-Object system.directoryservices.directorysearcher
$adsisearcher.SearchRoot = [ADSI]"LDAP://CN=System,$($Domain.GetDirectoryEntry().distinguishedName)"
$adsisearcher.Filter = "(objectclass=trustedDomain)"
ForEach($ExtDomain in $adsisearcher.FindAll()) {
$name = $ExtDomain.Properties["name"][0]
"Found $($name)"
$sid = New-Object System.Security.Principal.SecurityIdentifier ($ExtDomain.Properties["securityidentifier"][0], 0)
if (-not $DomainSIDList.Contains($sid.Value)) {
"Adding $($sid.Value), $($name)"
$DomainSIDList.Add($sid.Value, $name)
}
}
}一旦运行,$DomainSIDList将包含受信任域的列表。它将包含森林中的所有域,您并不真正需要这些域,但这并不是什么大问题。
https://stackoverflow.com/questions/48809201
复制相似问题