#powershell #active-directory #ldap
#powershell #active-directory #ldap
Вопрос:
Я пытаюсь получить все группы, членами которых являются пользователи домена, но фильтрую только группы с заданным атрибутом расширения. Я установил атрибут расширения 12 для всех групп домена, чтобы лучше фильтровать некоторые запросы (например, Инфраструктура — безопасность — электронное обучение). Мой запрос должен получить только группы пользователей с
атрибут расширения12 = безопасность
(например). Я использую что-то вроде:
get-aduser -filter -Properties memberof | select name, @{ l="GroupMembership"; e={$_.memberof -join ";" } }
и я получаю все группы пользователей. Как я могу выполнить фильтрацию по атрибуту расширения группы?
Комментарии:
1. Вам нужно только прямое членство в группе или это также должно разрешать косвенное членство в группе?
2. Привет. Вы имеете в виду вложенные группы? Нет, только прямое членство в группе.
Ответ №1:
Вы могли бы использовать обратную зависимость ( member
для объекта group) для запроса всех групп, членом которых является пользователь, всего по 1 запросу на пользователя. Здесь используется фильтр LDAP:
$groupLabel = "Security"
Get-ADUser -Filter * |ForEach-Object {
$groups = Get-ADGroup -LDAPFilter "(amp;(extensionattribute12=$groupLabel)(member=$($_.DistinguishedName)))"
[pscustomobject]@{
User = $_.SamAccountName
GroupMembership = $groups.DistinguishedName -join ';'
}
}
Если вам нужно обработать большое количество пользователей или членства в группах, может оказаться быстрее получить все группы, удовлетворяющие extensionAttribute12
критериям, и использовать этот список для фильтрации по memberOf
атрибуту пользователей:
$groupLabel = "Security"
# Create a hash set and populate it with the distinguished
# names of all the groups we're looking for
$groupDNs = [System.Collections.Generic.HashSet[string]]::new(@(
Get-ADGroup -Filter "extensionAttribute12 -eq '$groupLabel'" |Select -Expand DistinguishedName
))
Get-ADUser -Filter * -Properties memberOf |ForEach-Object {
# Retrieve memberOf values and filter against the hash set
$groups = $_.memberOf |Where-Object { $groupDNs.Contains($_) }
[pscustomobject]@{
User = $_.SamAccountName
GroupMembership = $groups -join ';'
}
}
Ответ №2:
Сделайте это с помощью N 1 запросов
$groups = @( Get-ADGroup -Filter '(extensionattribute12 -eq "security")' )
$users = @( $groups |
ForEach-Object { Get-ADGroupMember -Identity $_ -Recursive } |
Sort-Object -Unique )
$users # All users of all groups that have EA12 = security
Ответ №3:
Get-ADUser -filter {...} -Properties memberof | select name, @{ l="GroupMembership"; e={( $_.memberof | Get-ADGroup |?{ $_.extensionattribute12 -eq 'security' }) -join ";" }} |?{ $_.GroupMembership }
Комментарии:
1. Отличная работа, будет лучше, если вы добавите некоторый контекст в свой код