【问题标题】:Get-ADUser - find both ForeignSecurityPrincipals and users of a subDomainGet-ADUser - 查找 ForeignSecurityPrincipals 和 subDomain 的用户
【发布时间】:2018-11-10 06:02:42
【问题描述】:

我们在 2 个森林之间有(2 路)信任关系:

  1. acme.com
  2. someOtherForest.com

我们在 Forest 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
}

如果我将-server dc1:3268(DC 的 GC)添加到 Get-AdUser 部分,则 domain2 成员输出正常,但在 foreignSecurityPrincipals 上出错。

有没有办法从 acme.com 的所有子域中同时输出 foreignSecurityPrincipals 和成员?

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    您在使用 GC 端口时走在正确的轨道上,因为这将照顾您的森林。

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

    这当然会让事情变得更加困难,原因有两个:

    1. 您无法使用-Recursive 属性,因此您必须手动处理。
    2. 您仍然需要解决 Foreign Security Principals。

    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
    }
    

    【讨论】:

    • 如果原始函数中没有提到GC服务器,那么foreignsecurityprincipals被完美解析是不是很奇怪?
    • 它是......虽然我无法在我们的环境中复制它。它只是告诉我“指定的目录服务属性或值不存在”
    • 所以我将“dc1”替换为适当的 DC,并将 someOtherForest.com 替换为该森林的 DC 和 DC:3268。当然,我将 SearchBase 更改为适当的组....但是我似乎无法获得任何成员.... $members 变量始终返回空。
    • 我在那里复制了您的代码...$members 变量实际上是Export-Csv cmdlet 的结果,因为您正在将数据传送到其中。这可能就是为什么它是空的。您可能想要分隔这些行。但是您的 CSV 文件中应该有一些内容。
    • CSV 为空。这就是我检查 $members 的原因。我将添加一些输出,看看为什么它没有捕获任何东西。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 2020-06-10
      • 2021-12-30
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多