Get-ADUser - находит и ForeignSecurityPrincipals, и пользователей поддомена - PullRequest
0 голосов
/ 08 ноября 2018

У нас есть (двусторонние) доверительные отношения между двумя лесами:

  1. acme.com
  2. someOtherForest.com

У нас есть несколько поддоменов в лесу acme.com

  1. domain1.acme.com
  2. domain2.acme.com

У меня есть (вложенные) группы в domain1.acme.com, которые содержат пользователей как domain2.acme.com, так и foreignSecurityPrincipals от someOtherForest.com.

Сервер, к которому я подключен, использует DC (dc1) на domain1.acme.com.

Я использовал следующий скрипт для вывода всех членов из данной группы (рекурсивно). Он отлично выводит 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 (GC для DC) в раздел Get-AdUser, то члены domain2 будут выводиться нормально, однако это приведет к ошибкам в foreignSecurityPrincipals.

Есть ли способ вывести ForeignSecurityPrincipals и членов из всех поддоменов acme.com?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Ответ Габриэля Люси помог мне отредактировать мой оригинальный скрипт, чтобы создать быстрый запрос 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
0 голосов
/ 08 ноября 2018

Используя порт GC, вы на правильном пути, поскольку он позаботится о вашем лесу.

Но проблема по-прежнему в принципах внешней безопасности. В документации для Get-ADGroupMember говорится, что она выводит «основные объекты, представляющие пользователей, компьютеры или группы». Так что это будет работать только для тех трех типов объектов, а не для Foreign Security Principals.

Это, конечно, усложняет ситуацию по двум причинам:

  1. У вас нет возможности использовать свойство -Recursive, поэтому вам придется обрабатывать это вручную.
  2. Вам все еще нужно разрешить Принципы внешней безопасности.

Это подсказало мне, что мы можем использовать Get-ADObject вместо.

Мне было скучно, поэтому я написал это для вас. У нас есть похожая настройка доменов, поэтому я смог ее протестировать. Но имейте в виду, что домены жестко закодированы. Предполагается, что любой иностранный субъект безопасности будет находиться в этом одном домене, а не в другом. Поэтому обязательно обновите доменные имена (3 места).

Он разрешает внешние учетные записи, беря objectSid от Foreign Security Principal, который на самом деле является 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...