Powershell взять на себя права собственности на объекты AD

Вопрос или проблема

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 объектов.

Вот как это можно сделать:

  1. Создайте CSV-файл, содержащий ваши объекты. Убедитесь, что у вас есть столбец с названием sAMAccountName. Например, файл может называться identities.csv и выглядеть так:

    sAMAccountName
    user1
    user2
    group1
    computer1
  2. Используйте следующий 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: $_"
    }
}
  1. Запустите скрипт, передав нужные параметры. Например, в PowerShell выполните:
.\set-adowner.ps1 -Owner "Domain Admins" -InputFile .\identities.csv

Объяснение скрипта:

  1. Скрипт принимает два параметра: имя нового владельца и имя файла со списком объектов.
  2. Используется Import-Csv для загрузки идентификаторов объектов из CSV-файла.
  3. В цикле для каждого объекта:
    • Получается объект из AD с использованием Get-ADObject.
    • Получается текущий ACL (Access Control List) объекта с помощью Get-Acl.
    • Получается новый объект владельца.
    • Устанавливается новый владелец с помощью метода SetOwner.
    • Обновляется ACL с помощью Set-Acl.

Замечания:

  • Убедитесь, что вы запускаете PowerShell с правами администратора и у вас есть соответствующие разрешения для выполнения этих операций в Active Directory.
  • Рекомендуется протестировать скрипт на тестовой среде перед применением его в рабочей.

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

Капча загружается...