Get-ADUser-查找ForeignSecurityPrincipals和subDomain的用户

时间:2018-11-08 16:22:08

标签: powershell active-directory

我们在2个林之间建立了(2种方式)信任关系:

  1. acme.com
  2. someOtherForest.com

森林acme.com中有几个子域

  1. domain1.acme.com
  2. domain2.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和成员?

2 个答案:

答案 0 :(得分:1)

使用GC端口的方法是正确的,因为那样可以照顾您的森林。

但是问题仍然是外国安全负责人。 Get-ADGroupMember的文档说,它输出“代表用户,计算机或组的主要对象”。因此,它仅适用于这三种类型的对象,不适用于外国安全委托人。

这当然会使事情变得有些困难,原因有两个:

  1. 您无法使用-Recursive属性,因此必须手动处理。
  2. 您仍然必须解决外国安全负责人。

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