Powershell – убираем старые учетные записи


Периодически любому системному администратору приходится убирать мусор из Active Directory: чем больше домен, тем быстрее накапливаются учетные записи компьютеров и пользователей, которые давно не используются.

 

Действия примерно такие:

1.       Нужно установить нормативный срок: пусть будет один квартал или 90 дней – если учетная запись не использовалась 90 дней, то она считается старой.

2.       Нужно найти все старые учетные записи.

3.       Проанализировать каждую, чтобы случайно не задеть все еще нужные учетные записи.

4.       Что-то сделать со старыми учетными записями: удалить или переместить в отдельный контейнер, запретить.

В переводе на Powershell:

# Если учетная запись не использовалась 90 дней, то она считается старой

#

$OldDate = (Get-Date).AddDays(-90).ToFileTime()

 

# Куда перемещать

#

$OldComputersDN = «OU=old-computers,DC=domain,DC=ru»

 

# Ищем, анализируем и выбираем

#

$r=Get-ADComputer -Filter { PasswordLastSet -le $OldDate } -ResultSetSize $null -Properties * | Out-GridView -PassThru

 

# Ищем для пользователя $r=Get-ADUser -Filter { PasswordLastSet -le $OldDate } -ResultSetSize $null -Properties * | Out-GridView -PassThru

 

# Варианты действий

#

$r | Disable-ADAccount -Identity $_ -Whatif

$r | Move-ADObject -Identity $_ -TargetPath $OldComputersDN -Whatif

$r | Remove-ADObject -Identity $_ -Whatif

 

 

Чистых вам каталогов! Улыбка

Реклама

комментариев 17

  1. А почему поиск неактивной учетной записи идет по параметру PasswordLastSet? Не везде применена политика паролей (тем более смены пароля раз в месяц или т.п.).
    Не удобнее ли искать по атрибуту LastLogOnDate?

    • Скрипт изначально предназначен для поиска старых учетных записей компьютеров. Относительно учетных записей пользоватлей, то вы правы: можно использовать атрибут lastLogon.

  2. А у меня что-то не хочет работать скрипт =(

    • Проверяйте кавычки.

      • Он пишет

        $r=Get-ADComputer -Filter { PasswordLastSet -le $OldDate } -ResultSetSize $null -Properties * | Out-GridView -PassThru

        Out-GridView : Не удается найти параметр, соответствующий имени параметра «Pass
        Thru».
        строка:1 знак:119
        + $r=Get-ADComputer -Filter { PasswordLastSet -le $OldDate } -ResultSetSize $nu
        ll -Properties * | Out-GridView -PassThru <<<<
        + CategoryInfo : InvalidArgument: (:) [Out-GridView], ParameterBi
        ndingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
        ands.OutGridViewCommand

  3. Не, не поможете?

    • Какая у Вас версия PowerShell

    • Незнакомый скрипт надо выполнять по одной команде и проверять результат на каждом шаге, тем более что WordPress ломает форматирование. Как минимум надо заменить кавычки на » «

      • Кавычки я исправлял, с ними всё нормально.
        А вот со строкой

        $r=Get-ADComputer -Filter { PasswordLastSet -le $OldDate } -ResultSetSize $null -Properties * | Out-GridView -PassThru

        Он пишет

        Out-GridView : Не удается найти параметр, соответствующий имени параметра «Pass
        Thru».
        строка:1 знак:119
        + $r=Get-ADComputer -Filter { PasswordLastSet -le $OldDate } -ResultSetSize $nu
        ll -Properties * | Out-GridView -PassThru <<<<
        + CategoryInfo : InvalidArgument: (:) [Out-GridView], ParameterBi
        ndingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
        ands.OutGridViewCommand

    • Вариантов несколько:
      1. get-help Out-GridView
      Проверьте, есть ли у Вас там вообще параметр -PassThru.
      2. Уберите этот параметр, т.к. он здесь, по сути, не нужен, так как дальше не идет никакой команды.

      • О! Не хватало компонента «Интегрированная среда сценариев PowerShell».
        Правда с параметром PassThru всё равно не работает.

        А теперь затык на следующей строке.

        $r | Move-ADObject -Identity $_ -TargetPath $OldComputersDN -Whatif

        Ответ:

        Move-ADObject : Не удается проверить аргумент для параметра «Identity». Аргумен
        т имеет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего п
        овторите выполнение команды.
        строка:1 знак:29
        + $r | Move-ADObject -Identity <<<< $_ -TargetPath $OldComputersDN -Whatif
        + CategoryInfo : InvalidData: (:) [Move-ADObject], ParameterBindi
        ngValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Activ
        eDirectory.Management.Commands.MoveADObject

        Он говорит о том, что нет объектов для перемещения?

    • Да, он говорит что нет данных, с которыми он бы мог работать.
      Т.к. $r пустая.
      А пустая она потому, что cmdlet Out-GridView открывает тебе список компов, подходящие для блокировки. Параметр -PassThru позволяет выбрать из этого списка компьютеры, нажать ОК (без этого параметра, ОК не появляется), и список выделенных машин попадает в переменную $r.
      Параметра нет, и в переменную $r ничего не передается.

      • Т.е. были бы данные для работы, всё сработало бы и с параметром -PassThru?

  4. У вас какая версия Powershell? Установите как минимум v3.

  5. Доброго дня, выбираю нужные учетки и все равно ошибка. Буду признателен. :)

    PS C:\Users\unge> $OldDate = (Get-Date).AddDays(-90).ToFileTime()
    PS C:\Users\unge> $OldComputersDN = «OU=computers for delete,DC=****,DC=ru»
    PS C:\Users\unge> $r=Get-ADComputer -Filter { PasswordLastSet -le $OldDate
    } -ResultSetSize $null -Properties * | Out-GridView -PassThru
    PS C:\Users\ungefuktdv> $r | Move-ADObject -Identity $_ -TargetPath $OldComputer
    sDN -Whatif
    Move-ADObject : Не удается проверить аргумент для параметра «Identity». Аргумен
    т имеет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего п
    овторите выполнение команды.
    строка:1 знак:30
    + $r | Move-ADObject -Identity $_ -TargetPath $OldComputersDN -Whatif
    + ~~
    + CategoryInfo : InvalidData: (:) [Move-ADObject], ParameterBindi
    ngValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Activ
    eDirectory.Management.Commands.MoveADObject

    • Если пишет, что аргумент NULL, то значит так и есть. И это не допустимый аргумент для Move-ADObject. Избавьтесь от NULL. Например, $r | ? {$_}

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: