В настоящее время у нас есть группа безопасности с именем: 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 должен делать то, о чем вы просите. Есть несколько требований:
$root
- PSDrive в ваше "корневое" OU. «Страна» в вашем вопросе.$sourceOU
- исходное OU (имя, а не DN), из которого вы будете копировать ACE.$sourceGroup
- группа (имя, а не DN или домен), указанная в ACL, которую вы скопируете.$targetGroups
- Хеширование групп (имя, а не DN или домен) и OU (имя, а не DN) для применения ACE.Прочитав все это, я думаю, что мне, вероятно, следует просто написать более общую функцию, 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
}
}
}