Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Get ADUser-查找子域的ForeignSecurityPrincipal和用户_Powershell_Active Directory - Fatal编程技术网

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) 我一直在使用下面的脚本(递归地)输

我们在两个森林之间有(双向)信任关系:

  • 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)

    我一直在使用下面的脚本(递归地)输出给定组中的所有成员。它可以完美地输出ForeignSecurityPrincipal以及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成员可以正常输出,但它在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。我将添加一些输出,看看它为什么不能捕获任何东西。