Powershell Get ADUser-查找子域的ForeignSecurityPrincipal和用户
我们在两个森林之间有(双向)信任关系:Powershell Get ADUser-查找子域的ForeignSecurityPrincipal和用户,powershell,active-directory,Powershell,Active Directory,我们在两个森林之间有(双向)信任关系: acme.com someOtherForest.com 我们在forest acme.com中有几个子域 域名1.acme.com 域名2.acme.com 我在domain1.acme.com中有(嵌套)组,其中包含domain2.acme.com中的用户和someOtherForest.com中的foreignSecurityPrincipals 我连接的服务器使用domain1.acme.com上的DC(dc1) 我一直在使用下面的脚本(递归地)输
$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
}
如果我将-server dc1:3268
(DC的GC)添加到Get AdUser部分,则domain2成员可以正常输出,但它在ForeignSecurityPrincipal上会出错
有没有一种方法可以从acme.com的所有子域输出ForeignSecurityPrincipal和成员?使用GC端口是正确的,因为这样可以保护您的林 但问题仍然在于外国安全原则。的文档称它输出“代表用户、计算机或组的主要对象”。因此,它只适用于这三种类型的对象,而不适用于外部安全主体 这当然会让事情变得更加困难,原因有二:
-Recursive
属性,因此必须手动处理该属性获取对象
我很无聊,所以我给你写了这封信。我们这里有一个类似的域设置,所以我能够测试它。但请记住,域是硬编码的。它假定任何外国安全主体将位于该域,而不是任何其他域。因此,请确保更新域名(3个位置)
它通过从外部安全主体获取objectSid
(实际上是外部域上帐户的SID)来解析外部帐户,并使用该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
}
Gabriel Luci的回答帮助我编辑了我的原始脚本,创建了一个快速的广告查询,生成了相同的结果集。 这是为我们的设置工作,但我不能肯定它会为每一个广告设置工作。 警告:使用
-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
如果在最初的函数中没有提到GC服务器,那么外国安全性原则就可以很好地解决,这不是很奇怪吗。。。虽然我不能在我们的环境中复制它。它只是告诉我“指定的目录服务属性或值不存在”,所以我用适当的DC替换了“dc1”,用该林的DC和DC:3268替换了someOtherForest.com。当然,我把搜索库改成了一个合适的组。。。。然而,我似乎找不到任何成员。。。。$members变量总是返回空的。我在那里复制了你的代码。。。
$members
变量实际上是导出Csv
cmdlet的结果,因为您正在将数据管道化到该cmdlet中。这可能就是为什么它是空的。您可能需要分隔这些行。但是你的CSV文件中应该有一些内容。CSV是空的。这就是为什么我检查了$members。我将添加一些输出,看看它为什么不能捕获任何东西。