Заметки · 06.09.2024

Защита от случайностей

Одной из первых записей на сайте был пост про 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

После того как командлет сделает своё дело, в консоль будет выведен лог действий с перечнем модифицированных подразделений.