Список пользователей AD, которые не принадлежат ни к одной из нескольких групп

Во-первых, я не сценарист, поэтому прошу прощения, если это звучит как вопрос новичка.

Я пытаюсь написать запрос Powershell, чтобы перечислить все учетные записи пользователей в определенном поддереве OU, которые не принадлежат хотя бы к одной из 4 групп.

Насколько я могу судить, вы не можете запросить это непосредственно в объекте AD User, поэтому вам нужно перебирать группы, чтобы получить членство, но я не понимаю, как это сделать в нескольких группах.

Я собрал сценарий, который может найти всех пользователей, добавить их во временную группу, а затем удалить их, если они принадлежат к одной из четырех других групп, но это выглядит ужасно, поэтому я надеюсь, что кто-то лучшее решение.

Вот что у меня сейчас есть (не смейтесь) :-(

Import-Module ActiveDirectory
$groupname = "TempGroup"
$excludegroup1 = "Group1"
$excludegroup2 = "Group2"
$excludegroup2 = "Group4"
$excludegroup2 = "Group4"
$users = Get-ADUser -Filter * -SearchBase "ou=xxx,dc=xxx,dc=xxx" -SearchScope Subtree
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup1
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup2
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup3
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup4
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}

Вся помощь с благодарностью принимается.


person Jim    schedule 13.09.2013    source источник


Ответы (2)


Все пользователи, компьютеры, группы и контакты (и, возможно, другие объекты) в Active Directory имеют свойство, называемое memberof. Это свойство содержит уникальные имена всех групп из всего леса, членом которого является этот объект, как следует из имени атрибута.

Имея эту информацию, теперь вы можете создать поисковый запрос ldap для поиска всех объектов, которые не являются членами хотя бы одной из этих групп:

(!(|(memberof=CN=Group1,dc=domain,dc=com)(memberof=CN=Group3,dc=domain,dc=com)(memberof=CN=Group3,dc=domain,dc=com)))

Другие условия могут быть включены по мере необходимости.

Если вам нужно сначала получить отличительные имена этих групп, вы можете либо жестко закодировать их в своем фильтре, либо выполнить обычный поиск Powershell для групп, а затем прочитать их отличительные имена.

Вы можете использовать запрос ldap через параметр команды -LDAPFilter. .

person Robert Rossmann    schedule 13.09.2013
comment
Спасибо за помощь, Shadow Walker. Я столкнулся с несколькими ошибками при использовании -LDAPFilter, но ваш код помог мне найти то, что мне было нужно, так что в конце концов я добрался до цели. Ваше здоровье. - person Jim; 16.09.2013

Если кому-то интересно, это код, который у меня есть сейчас. Он использует группу, которую сбрасывает при каждом запуске, потому что тогда я могу просто дважды щелкнуть пользователя, чтобы попасть в его объект и добавить его в группу, в которой он отсутствует.

Import-Module ActiveDirectory
$groupname = "NotInGroups"
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$users = Get-ADUser -Filter {((memberof -notlike "CN=Group1,DC=domain,DC=local") -AND (memberof -notlike "CN=Group2,DC=domain,DC=local") -AND (memberof -notlike "CN=Group3,DC=domain,DC=local") -AND (memberof -notlike "CN=Group4,DC=domain,DC=local"))} -SearchBase "ou=users,dc=domin,dc=local" -SearchScope Subtree
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
} 
person Jim    schedule 16.09.2013