Периодически любому системному администратору приходится убирать мусор из 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
Чистых вам каталогов!
Filed under: Active Directory, Powershell | Tagged: Active Directory, Powershell |
А почему поиск неактивной учетной записи идет по параметру PasswordLastSet? Не везде применена политика паролей (тем более смены пароля раз в месяц или т.п.).
Не удобнее ли искать по атрибуту LastLogOnDate?
Скрипт изначально предназначен для поиска старых учетных записей компьютеров. Относительно учетных записей пользоватлей, то вы правы: можно использовать атрибут lastLogon.
А у меня что-то не хочет работать скрипт =(
Проверяйте кавычки.
Он пишет
$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
Не, не поможете?
Какая у Вас версия PowerShell
Версия 2
Незнакомый скрипт надо выполнять по одной команде и проверять результат на каждом шаге, тем более что 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?
У вас какая версия Powershell? Установите как минимум v3.
Доброго дня, выбираю нужные учетки и все равно ошибка. Буду признателен. :)
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 | ? {$_}