Назад | Перейти на главную страницу

(Powershell) Метод для возврата списка групп, в которых конкретный пользователь имеет безопасность «запись члена»

Мы используем веб-программное обеспечение, в которое пользователи могут входить, чтобы управлять доступом к общим ресурсам, контролируемым группами AD. Список групп, которыми может управлять пользователь, - это группы, в которых он имеет защиту «Члены записи». Это позволяет пользователям поддерживать общие файловые ресурсы без знания AD.

Я пытаюсь написать сценарий Powershell, используя quest.activeroles.admanagement, который вернет аккуратный список групп, в которых указанный пользователь имеет безопасность «Записать членов», чтобы очистить разрешения для ушедших пользователей. Группы, которые мне нужно найти, хранятся в OU, хотя их более 1000.

Я до сих пор придумал:

add-pssnapin quest.activeroles.admanagement
Get-QADObject -ShowProgress -SearchRoot 'domain.server.com/path/to/OU' -SearchScope 'OneLevel' -Type Group -SizeLimit 2500 | Get-QADPermission -Rights 'WriteProperty' -Property 'member' -Account "user" -WarningAction SilentlyContinue

Это работает нормально (хотя и неэффективно), но вывод хоста довольно беспорядочный:

Permissions for: full.domain.path/OU/path/group1

Ctrl   Account                                  Rights                              Source           AppliesTo                                    
----   -------                                  ------                              ------           ---------                                    
       Domain\user                              Write member                        Not inherited    This object and all child objects            
Permissions for: full.domain.path/OU/path/group2
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object and all child objects            
Permissions for: full.domain.path/OU/path/group3
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object only                             
Permissions for: full.domain.path/OU/path/group4
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object and all child objects            

Я получаю необходимую информацию, но вокруг нее много чуши. Если я перенаправляю / добавляю в текстовый файл, я получаю только имя пользователя, а не имена групп. В идеале мне нужен просто список имен групп без пути к OU, или, в идеальном случае, CSV, где первый столбец - это имя пользователя, а второй столбец - это группа, чтобы я мог запускать несколько пользователей (foreach ( $ username в $ usernames)):

User                Group
domain\username     group_name_one
domain\username     group_name_two
domain\username     group_name_three

Как лучше всего решить эту проблему, чтобы Export-CSV выдал нечто более приятное?

Здесь есть две проблемы.

  1. CMDlet Get-QADPermission пишет прямо в консоль во время выполнения, поэтому вы видите Permissions for: .... Поскольку ваш конвейер выполняет запись в один и тот же вывод, все это смешивается. Вместо этого сохраните вывод из конвейера в переменной.

  2. Когда вы вставляете группу в Get-QADPermission, вы выбрасываете объект группы и вместо этого получаете объект разрешений. Если вы хотите сохранить исходный объект, вам нужно отфильтровать с помощью Where-Object.

Также будьте осторожны с Get-QADPermission. Если вы запрашиваете только WriteProperty, он не будет возвращать результаты с доступом для чтения и записи. Обычно вы хотите запросить и то, и другое. И в большинстве случаев вы также хотите использовать -Inherited чтобы получить разрешения, предоставленные родительскими подразделениями. Если вы действительно ищете разовые разрешения, вы можете игнорировать этот переключатель.

function Test-UserCanModifyGroupsInOU ($Username, $OU)
{
  $results = Get-QADGroup -SearchScope 'OneLevel' -SearchRoot $OU |
    Where-Object {
      $_ | Get-QADPermission -Rights ReadProperty,WriteProperty -Property member -Account $username
    } |
    Select @{Name="User";Expression={$username}}, @{Name="Group";Expression={$_.Name}}
  $results | Write-Output
  $results | Export-Csv "$username.csv"
}

@("bob","sally") |
  ForEach-Object {
    Test-UserCanModifyGroupsInOU -Username $_ -OU 'domain.org.com/path/to/OU'
  }

Также обратите внимание, что это работает только для разрешений на определенные свойства. Он не будет возвращать результаты для пользователя, имеющего «Полный доступ» к группе, даже если ему все еще разрешено изменять атрибут участника.