Одной из первых записей на сайте был пост про PS1-скрипт массовой установки галчонка «Срок действия пароля неограничен» в настройках учётных записей пользователей Active Directory. Сегодня с помощью всё того же PowerShell попробуем проставить другого галчонка — Защитить объект от случайного удаления.
Иногда этот параметр достаточно доставучий. Особенно когда мешает спокойно перенести объект в другое подразделение. К его поведению нужно привыкнуть и научиться его уважать. В конце концов, он делает именно то для чего и создан — защищает.
Писать отдельный скрипт для сабжа нет никакого смысла. По сути, нам нужна только простая однострочная команда. Например, так можно защитить от случайного удаления конкретного пользователя username:
Get-ADUser username | Set-ADobject -ProtectedFromAccidentalDeletion $true
Можно усложнить задачку и запихнуть имя пользователя в переменную, а с помощью параметра WhatIf проверить действие конвейера:
$aduser = "test" Get-ADUser $aduser | Set-ADobject -ProtectedFromAccidentalDeletion $true -WhatIf
Для документирования действий заменим WhatIf на Verbose:
$aduser = "test" Get-ADUser $aduser | Set-ADobject -ProtectedFromAccidentalDeletion $true -Verbose
Но всё же командлет Set-ADobject создан для модификации объекта Active Directory, поэтому правильнее будет работать именно с командлетом Get-ADObject, а вывод фильтровать по классам объектов.
Так получаем всех пользователей Active Directory:
Get-ADObject -filter {(ObjectClass -eq "user")}
Так все компьютеры:
Get-ADObject -filter {(ObjectClass -eq "computer")}
И, наконец, группы:
Get-ADObject -filter {(ObjectClass -eq "group")}
Рассмотрим пример. В каком-то гипотетическом подразделении у нас имеется ряд компьютеров со снятой галкой «Защитить объект от случайного удаления». Попробуем пройтись по всем объектам подразделения и проставить галку. Скрин до:

В переменной $ou я разместил адрес подразделения, добавил его в качестве базы поиска и передал все полученные объекты по конвейеру в командлет Set-ADObject:
$ou = "OU=Office,OU=PC,OU=Company,DC=org,DC=domain,DC=local" Get-ADObject -SearchBase $ou -filter * | Set-ADObject -ProtectedFromAccidentalDeletion:$true
Скрин после:

Кстати, сами подразделения тоже следовало бы защищать от случайных действий. Для начала хотелось бы посмотреть имеются ли в домене подразделения без защиты:
(Get-ADOrganizationalUnit -filter * -Properties ProtectedFromAccidentalDeletion | where {$_.ProtectedFromAccidentalDeletion -eq $false}).Name
Конструкция вернёт в консоль перечень имён подразделений, которые любой может снести или переместить без всяких проблем. Теперь добавим в конвейер специальный командлет для модификации подразделений Set-ADOrganizationalUnit:
Get-ADOrganizationalUnit -filter * -Properties ProtectedFromAccidentalDeletion | where {$_.ProtectedFromAccidentalDeletion -eq $false} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true -Verbose
После того как командлет сделает своё дело, в консоль будет выведен лог действий с перечнем модифицированных подразделений.