Вопрос или проблема
Powershell взять на себя права собственности на объекты AD
У меня есть список пользователей, компьютеров и групп, владельцем которых являются случайные люди в Active Directory. Я хотел бы очистить их по соображениям безопасности и сделать так, чтобы владельцем всех этих объектов были только доменные администраторы. Может ли кто-то помочь с PowerShell-скриптом для этого?
Я искал в Google, но безуспешно. Я нашел этот старый код, но он не работает, постоянно появляется ошибка с владельцем. Запускаю от имени доменного администратора на машине с Windows 10.
Param (
[parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true)][string]$Identity,
[parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true)][string]$Owner
)
try {
$oADObject = Get-ADObject -Filter { (Name -eq $Identity) -or (DistinguishedName -eq $Identity) };
$oAceObj = Get-Acl -Path ("ActiveDirectory:://RootDSE/" + $oADObject.DistinguishedName);
} catch {
Write-Error "Не удалось найти исходный объект.";
return;
}
try {
$oADOwner = Get-ADObject -Filter { (Name -eq $Owner) -or (DistinguishedName -eq $Owner) };
$oNewOwnAce = New-Object System.Security.Principal.NTAccount($oADOwner.Name);
} catch {
Write-Error "Не удалось найти новый объект владельца.";
return;
}
try {
$oAceObj.SetOwner($oNewOwnAce);
Set-Acl -Path ("ActiveDirectory:://RootDSE/" + $oADObject.DistinguishedName) -AclObject $oAceObj;
} catch {
$errMsg = "Не удалось установить новый ACE для " + $oADObject.Name;
Write-Error $errMsg;
}
Например, запуск
.\set-adowner.ps1 -Identity "RANDOMUSER" -Owner "доменные администраторы"
Также я хотел бы, чтобы скрипт работал с текстовым файлом со всеми samaccountname объектов, как только я запущу базовый скрипт.
Спасибо за любую помощь,
Фред
Коллега ответил на мой вопрос, для всех интересующихся:
Param (
[parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true)][string]$Owner
)
$Identities = Import-Csv .\identities.csv
foreach ($obj in $Identities) {
$Identity = $obj.sAMAccountName;
Write-Host "Установка владения для $Identity..."
# Получаем объект идентичности (группы, пользователя, учетной записи компьютера и т.д.), владельца которого хотим изменить
$oADObject = Get-ADObject -Filter { (sAMAccountName -eq $Identity) -or (sAMAccountName -eq $Identity) } -properties sAMAccountName;
$oAceObj = Get-Acl -Path ("ActiveDirectory:://RootDSE/" + $oADObject.DistinguishedName);
# Получаем объект учетной записи, которой хотим передать владение вышеуказанным объектом
$oADOwner = Get-ADObject -Filter { (sAMAccountName -eq $Owner) -or (sAMAccountName -eq $Owner) } -properties sAMAccountName;
$oNewOwnAce = New-Object System.Security.Principal.NTAccount($oADOwner.sAMAccountName);
# Устанавливаем владельца объекта
$oAceObj.SetOwner($oNewOwnAce);
Set-Acl -Path ("ActiveDirectory:://RootDSE/" + $oADObject.DistinguishedName) -AclObject $oAceObj;
}
Ответ или решение
Конечно, я помогу вам с этой задачей. Вам нужно написать PowerShell-скрипт, который будет изменять владельца объектов Active Directory (AD) на "Domain Admins" для заданного списка пользователей и других объектов. Я предоставлю улучшенную версию вашего исходного скрипта, которая сможет работать с файлом, содержащим samAccountName объектов.
Вот как это можно сделать:
-
Создайте CSV-файл, содержащий ваши объекты. Убедитесь, что у вас есть столбец с названием
sAMAccountName
. Например, файл может называтьсяidentities.csv
и выглядеть так:sAMAccountName user1 user2 group1 computer1
- Используйте следующий PowerShell-скрипт для изменения владельца объектов:
Param (
[parameter(Mandatory=$true)][string]$Owner,
[parameter(Mandatory=$true)][string]$InputFile
)
# Импортируем список идентификаторов из CSV-файла
$Identities = Import-Csv $InputFile
foreach ($obj in $Identities) {
$Identity = $obj.sAMAccountName
Write-Host "Устанавливаем владельца для $Identity..."
try {
# Получаем объект в AD
$oADObject = Get-ADObject -Filter { (sAMAccountName -eq $Identity) } -Properties DistinguishedName
if (-not $oADObject) {
Write-Warning "Объект $Identity не найден."
continue
}
# Получаем текущий ACL объекта
$oAceObj = Get-Acl -Path ("ActiveDirectory:://RootDSE/" + $oADObject.DistinguishedName)
# Получаем объект нового владельца
$oADOwner = Get-ADObject -Filter { (sAMAccountName -eq $Owner) } -Properties sAMAccountName
if (-not $oADOwner) {
Write-Warning "Объект владельца $Owner не найден."
continue
}
# Устанавливаем нового владельца
$oNewOwnAce = New-Object System.Security.Principal.NTAccount($oADOwner.sAMAccountName)
$oAceObj.SetOwner($oNewOwnAce)
Set-Acl -Path ("ActiveDirectory:://RootDSE/" + $oADObject.DistinguishedName) -AclObject $oAceObj
Write-Host "Владелец для $Identity успешно установлен."
} catch {
Write-Error "Ошибка при установке владельца для $Identity: $_"
}
}
- Запустите скрипт, передав нужные параметры. Например, в PowerShell выполните:
.\set-adowner.ps1 -Owner "Domain Admins" -InputFile .\identities.csv
Объяснение скрипта:
- Скрипт принимает два параметра: имя нового владельца и имя файла со списком объектов.
- Используется
Import-Csv
для загрузки идентификаторов объектов из CSV-файла. - В цикле для каждого объекта:
- Получается объект из AD с использованием
Get-ADObject
. - Получается текущий ACL (Access Control List) объекта с помощью
Get-Acl
. - Получается новый объект владельца.
- Устанавливается новый владелец с помощью метода
SetOwner
. - Обновляется ACL с помощью
Set-Acl
.
- Получается объект из AD с использованием
Замечания:
- Убедитесь, что вы запускаете PowerShell с правами администратора и у вас есть соответствующие разрешения для выполнения этих операций в Active Directory.
- Рекомендуется протестировать скрипт на тестовой среде перед применением его в рабочей.