我们在2个林之间建立了(2种方式)信任关系:
森林acme.com中有几个子域
我在domain1.acme.com中有一个(嵌套的)组,其中既包含domain2.acme.com中的用户,又包含来自someOtherForest.com中的foreignSecurityPrincipals。
我连接到的服务器使用domain1.acme.com上的DC(dc1)。
我一直在使用以下脚本来输出给定组的所有成员(递归)。它可以很好地输出foreignSecurityPrincipals和domain1用户,但是来自domain2的成员会出错:
$Groups = Get-ADGroup -Properties * -Filter * -SearchBase "CN=app-users,OU=app,DC=domain1,DC=acme,DC=com"
Foreach($G In $Groups) {
$members = Get-ADGroupMember $G -recursive | Get-ADUser -Properties Mail |Select-Object DistinguishedName,sAMAccountName, Mail |
Export-CSV -Path C:\output.csv -NoTypeInformation
}
如果我在Get-AdUser部分中添加-server dc1:3268
(DC的GC),则可以很好地输出domain2成员,但是在foreignSecurityPrincipals上会出错。
是否可以从acme.com的所有子域中同时输出foreignSecurityPrincipal和成员?
答案 0 :(得分:1)
使用GC端口的方法是正确的,因为那样可以照顾您的森林。
但是问题仍然是外国安全负责人。 Get-ADGroupMember
的文档说,它输出“代表用户,计算机或组的主要对象”。因此,它仅适用于这三种类型的对象,不适用于外国安全委托人。
这当然会使事情变得有些困难,原因有两个:
-Recursive
属性,因此必须手动处理。 This告诉我,我们可以改用Get-ADObject
。
我很无聊,所以我为你写了这篇。我们这里确实有类似的域设置,因此我能够对其进行测试。但是请记住,域是硬编码的。它假定任何外国安全主体都将在该域上,而不在其他任何域上。因此,请确保您更新域名(3个地方)。
它通过从外部安全委托人那里获取objectSid
(它实际上是外部域上的帐户的SID)并使用它来查找该域上的用户来解析外部帐户。
function Get-Members {
param([Microsoft.ActiveDirectory.Management.ADGroup]$group)
$members = $group | Select-Object -ExpandProperty Members | Get-ADObject -Server dc1:3268 -Properties Mail,SamAccountName,objectSid,ObjectClass
$returnMembers = New-Object System.Collections.ArrayList
foreach ($member in $members) {
if ($member.ObjectClass -eq "ForeignSecurityPrincipal") {
$returnMembers.Add((Get-ADUser -Server someOtherForest.com $member.objectSid -Properties Mail,SamAccountName)) | Out-Null
} elseif ($member.ObjectClass -eq "Group") {
$nestedMembers = (Get-Members ($member | Get-ADGroup -Properties Members))
if ($nestedMembers) {
if ($nestedMembers.Count -gt 1) {
$returnMembers.AddRange($nestedMembers) | Out-Null
} else {
$returnMembers.Add($nestedMembers) | Out-Null
}
}
} else {
$returnMembers.Add($member) | Out-Null
}
}
return $returnMembers
}
$Groups = Get-ADGroup -Server dc1:3268 -Properties Members -Filter * -SearchBase "CN=app-users,OU=app,DC=domain1,DC=acme,DC=com"
Foreach($G In $Groups) {
$members = Get-Members $G |Select-Object DistinguishedName,sAMAccountName, Mail |
Export-CSV -Path C:\output.csv -NoTypeInformation
}
答案 1 :(得分:0)
Gabriel Luci的答案帮助我编辑了原始脚本,以创建一个可产生相同结果集的快速AD查询。
这适用于我们的设置,但是我不确定它是否适用于所有AD设置。
警告:使用-erroraction 'silentlycontinue'
选项可抑制发生的错误。
这将显示组(在服务器域中)包括嵌套组的所有成员(域,子域和受信任的林域)。每个用户只会出现一次,无论他们属于多少个嵌套组。
$set = New-Object 'System.Collections.Generic.HashSet[Microsoft.ActiveDirectory.Management.ADUser]'
$Groups = Get-ADGroup -Properties * -Filter * -SearchBase "CN=app-users,OU=app,DC=domain1,DC=acme,DC=com"
Foreach($G In $Groups)
{
$members = Get-ADGroupMember $G -recursive | Get-ADUser -Properties Mail -erroraction 'silentlycontinue'
$subDomainMembers = Get-ADGroupMember $G -recursive | Get-ADUser -Server dc1:3268 -Properties Mail -erroraction 'silentlycontinue'
Foreach ($i In $members){
$set.Add($i)| Out-Null
}
Foreach ($i In $subDomainMembers){
$set.Add($i)| Out-Null
}
}
$set |Select-Object -Unique DistinguishedName,sAMAccountName, Mail | Export-CSV -Path C:\output.csv -NoTypeInformation