Как получить все группы, членом которых является пользователь, на основе атрибута расширения группы

#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. Отличная работа, будет лучше, если вы добавите некоторый контекст в свой код