Назад | Перейти на главную страницу

Копирование разрешений OU из существующей группы безопасности в новую группу безопасности

В настоящее время у нас есть группа безопасности с именем: Limited_IT_Admins, у которой есть особые разрешения (ограниченные только определенными задачами, которые они могут выполнять) для ~ 7 городских OU в пределах одной страны.

[Country] <- top level OU
  [City01]
  [City02]
  [City03]
  [City04]
  [City05]
  [City06]
  [City07]

Однако теперь мне нужно разделить эту единственную группу безопасности на три отдельные группы. Пользователи из группы Limited_IT_Admin будут разделены на три отдельные новые группы. Пользователям потребуется такой же доступ, как и у Limited_IT_Admins, но только к их соответствующим OU.

Limited_IT_Admin_01 - User01
  City01, City02, City03

Limited_IT_Admin_02 - User02
  City04, City05

Limited_IT_Admin_03 - User03
   City06, City07

Вместо того, чтобы пытаться воссоздать все специальные разрешения, которые были установлены для группы безопасности, есть ли более простой способ скопировать разрешения Limited_IT_Admins для трех новых групп?

Я создал функцию Powershell Copy-DsAcl что должно помочь в выполнении такого рода копирования разрешений Active Directory. Используя эту функцию, исходный ответ (под строкой) можно переписать более чисто как:

 Import-Module ActiveDirectory

 # Dot source the Copy-DsAcl function: https://github.com/jasonkeithscott/Copy-DsAcl
 . .\Copy-DsAcl.ps1

 # Reference objects
 $sourceGroup    = Get-ADGroup Limited_IT_Admins
 $sourceObject   = Get-ADOrganizationalUnit -Filter { Name -eq "City01" }

 # Hash for the new groups and their assigned OUs
 $targetGroups   = @{}
 $targetGroups.Add("Limited_IT_Admin_01", @("City01", "City02", "City03"))
 $targetGroups.Add("Limited_IT_Admin_02", @("City04", "City05"))
 $targetGroups.Add("Limited_IT_Admin_03", @("City06", "City07"))

 # Walk each targetGroup in the hash
 foreach ( $g in $targetGroups.GetEnumerator() ) {

     $targetGroup = Get-ADGroup $g.Name

     # Walk each $city OU and add the $targetGroup to the ACL
     foreach ( $city in $g.Value ) {

         Write-Host "Adding $($g.Name) to $city"
         $targetObject = Get-ADOrganizationalUnit -Filter { Name -eq $city }
         Copy-DsAcl $sourceGroup $sourceObject $targetGroup $targetObject

     }

 }

Приведенный ниже Powershell должен делать то, о чем вы просите. Есть несколько требований:

  1. Вам понадобится модуль Microsoft ActiveDirectory Powershell. Он включен в RSAT7.
  2. Для вашей среды вам необходимо обновить следующее:
    1. $root - PSDrive в ваше "корневое" OU. «Страна» в вашем вопросе.
    2. $sourceOU - исходное OU (имя, а не DN), из которого вы будете копировать ACE.
    3. $sourceGroup - группа (имя, а не DN или домен), указанная в ACL, которую вы скопируете.
    4. $targetGroups - Хеширование групп (имя, а не DN или домен) и OU (имя, а не DN) для применения ACE.
  3. Это будет копировать только явные ACE, а не унаследованные. Может, мне стоит взглянуть на то, как подняться на дерево, чтобы схватить унаследованные?
  4. Мне пришлось запустить это как администратор домена, так как я получал ошибку «Доступ запрещен». Хотя мои первоначальные делегации из OU, вероятно, были подозрительными.

Прочитав все это, я думаю, что мне, вероятно, следует просто написать более общую функцию, CopyOuAcl, и обновите это, когда это будет сделано. Как сейчас написано, это полностью зависит от вашего вопроса и среды.

Import-Module ActiveDirectory

$root          = "AD:\OU=Country,DC=example,DC=com"
$sourceOU       = "City01"
$sourceACL      = Get-Acl $root.Replace("AD:\", "AD:\OU=$sourceOU,")
$sourceGroup    = "Limited_IT_Admins"

# Hash for the new groups and their OUs
$targetGroups = @{}
$targetGroups.Add("Limited_IT_Admin_01", @("City01", "City02", "City03"))
$targetGroups.Add("Limited_IT_Admin_02", @("City04", "City05"))
$targetGroups.Add("Limited_IT_Admin_03", @("City06", "City07"))

# Get the uniherited ACEs for the $sourceGroup from $sourceOU
$sourceACEs = $sourceACL |
    Select-Object -ExpandProperty Access |
        Where-Object { $_.IdentityReference -match "$($sourceGroup)$" -and $_.IsInherited -eq $False }

# Walk each targetGroup in the hash
foreach ( $g in $targetGroups.GetEnumerator() ) {

    # Get the AD object for the targetGroup
    Write-Output $g.Name
    $group      = Get-ADGroup $g.Name
    $identity   = New-Object System.Security.Principal.SecurityIdentifier $group.SID

    # Could be multiple ACEs for the sourceGroup
    foreach ( $a in $sourceACEs ) {

        # From from the sourceACE for the ActiveDirectoryAccessRule constructor  
        $adRights               = $a.ActiveDirectoryRights
        $type                   = $a.AccessControlType
        $objectType             = New-Object Guid $a.ObjectType
        $inheritanceType        = $a.InheritanceType
        $inheritedObjectType    = New-Object Guid $a.InheritedObjectType

        # Create the new "copy" of the ACE using the target group. http://msdn.microsoft.com/en-us/library/w72e8e69.aspx
        $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $identity, $adRights, $type, $objectType, $inheritanceType, $inheritedObjectType    

        # Walk each city OU of the target group
        foreach ( $city in $g.Value ) {

            Write-Output "`t$city"
            # Set the $cityOU
            $cityOU = $root.Replace("AD:\", "AD:\OU=$city,")
            # Get the ACL for $cityOU
            $cityACL = Get-ACL $cityOU
            # Add it to the ACL
            $cityACL.AddAccessRule($ace)
            # Set the ACL back to the OU
            Set-ACL -AclObject $cityACL $cityOU

        }

    }

}