Мы используем веб-программное обеспечение, в которое пользователи могут входить, чтобы управлять доступом к общим ресурсам, контролируемым группами 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 выдал нечто более приятное?
Здесь есть две проблемы.
CMDlet Get-QADPermission
пишет прямо в консоль во время выполнения, поэтому вы видите Permissions for: ...
. Поскольку ваш конвейер выполняет запись в один и тот же вывод, все это смешивается. Вместо этого сохраните вывод из конвейера в переменной.
Когда вы вставляете группу в 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'
}
Также обратите внимание, что это работает только для разрешений на определенные свойства. Он не будет возвращать результаты для пользователя, имеющего «Полный доступ» к группе, даже если ему все еще разрешено изменять атрибут участника.