Поиск членов группы AD - PullRequest
1 голос
/ 10 февраля 2020

Я создаю сценарий для поиска пользователей AD, которые не выполнили вход в систему в течение X дней и не относятся к определенной c группе безопасности. У меня есть 2 пользователя в OU, один из которых находится в группе безопасности DoNotDisable (pileum), а другой - нет (bubba).

$DC = Get-ADDomainController
$OUs = Get-ADOrganizationalUnit -Filter 'Name -eq "test"'
$accounts = $null
$canNotDisable = Get-ADGroupMember -Identity DoNotDisable -Recursive | Select -ExpandProperty Name
$TimeStamp = get-date -format D
$description = "Disabled on " + $TimeStamp

foreach ($OU in $OUs) {
    # Search for User Accounts inactive for XX Days and Disable if not in DoNotDisable Security Group
    $accounts = Search-ADAccount -SearchBase $OU -AccountInactive -TimeSpan ([timespan]90d) -UsersOnly
        foreach($account in $accounts){
        If ($canNotDisable -contains $account){
        Write-Host "$account can not be disabled"
        } Else {
        Write-Host "$account can be disabled"
        }
    }
}

Если я посмотрю на переменную $ canNotDisable, она вытягивает правильный пользователь в группе DoNotDisable.

enter image description here

Однако, когда я запускаю полный скрипт, он возвращает как пользователя в группе, так и пользователя, которого нет в группе .

enter image description here

Буду очень признателен, если кто-нибудь поможет мне разобраться, что мне не хватает. ТИА.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Измените свой оператор if во внутреннем foreach l oop, чтобы он соответствовал идентификаторам, а не всему объекту.

Поскольку $canNotDisable представляет собой список строк, вам необходимо извлечь имя из переменной $Account, чтобы узнать, существует ли она (не результирующий объект).

foreach ($OU in $OUs) {
    # Search for User Accounts inactive for XX Days and Disable if not in DoNotDisable Security Group
    $accounts = Search-ADAccount -SearchBase $OU -AccountInactive -TimeSpan ([timespan]90d) -UsersOnly
        foreach($account in $accounts){
        If ($canNotDisable -contains $account.Name){
        Write-Host "$account can not be disabled"
        } Else {
        Write-Host "$account can be disabled"
        }
    }
}
1 голос
/ 10 февраля 2020

Я думаю, что проблема здесь в том, что объекты, возвращаемые Get-ADGroupMember, не относятся к тому же типу, который возвращен Get-ADUser. Они оба представляют пользователей AD, но объекты не эквивалентны, и, что удивительно, сравнение не было выполнено для правильной работы для объектов этих типов.

Если это проблема, я бы ожидал сначала получить список ObjectGUID из списка $ canNotDisable (например, $ canNotDisableGuids = $ canNotDisable |% {$ _. ObjectGuid}), а затем проверка наличия в списке каждого пользователя ObjectGUID в действительности может работать. Похоже, что одинаковые ObjectGUID есть в обоих объектах.

...