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

Сценарий Powershell для установки разрешений AD не работает с «Доступ запрещен», несмотря на то, что запущенная учетная запись имеет правильные разрешения

Я использую следующий командлет Powershell как часть скрипта:

# Posted by TobyU at www.pwsh.ch on 13.09.2018
# https://www.pwsh.ch/active-directory-powershell-delegate-permission-to-reset-user-passwords-for-a-specific-organizational-unit-150.html

function Set-ResetPasswordDelegation(){
    param(
    [string]$OrganizationalUnit,
    [string]$DelegationGroupName
    )

    # Configuration Parameters
    $confADRight = "ExtendedRight"
    $confDelegatedObjectType = "bf967aba-0de6-11d0-a285-00aa003049e2" # User Object Type GUID
    $confExtendedRight = "00299570-246d-11d0-a768-00aa006e0529" # Extended Right PasswordReset GUID

    # Collect and prepare Objects
    $delegationGroup = Get-ADGroup -Identity $DelegationGroupName
    $delegationGroupSID = [System.Security.Principal.SecurityIdentifier] $delegationGroup.SID
    $delegationGroupACL = Get-Acl -Path "AD:\$OrganizationalUnit"

    # Build Access Control Entry (ACE)
    $aceIdentity = [System.Security.Principal.IdentityReference] $delegationGroupSID
    $aceADRight = [System.DirectoryServices.ActiveDirectoryRights] $confADRight
    $aceType = [System.Security.AccessControl.AccessControlType] "Allow"
    $aceInheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance] "Descendents"
    $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($aceIdentity, $aceADRight, $aceType, $confExtendedRight, $aceInheritanceType,$confDelegatedObjectType)

    # Apply ACL
    $delegationGroupACL.AddAccessRule($ace)
    Set-Acl -Path "AD:\$OrganizationalUnit" -AclObject $delegationGroupACL
}

Подводя итог, приведенный выше сценарий предназначен для делегирования разрешений на сброс пароля, чтобы определенной группе безопасности (параметр DelegationGroupName) было разрешено сбрасывать пароли для всех пользователей внутри определенного подразделения (параметр OrganisationalUnit).

Это отлично работает при запуске от имени администратора, но когда я пытаюсь запустить его как учетную запись, которую использую для выполнения запланированных задач, я сталкиваюсь с проблемой. Увидеть ниже:

PS D:\Program\ocpermissions> Set-ResetPasswordDelegation -OrganizationalUnit 'OU=Test,OU=ITA,DC=kos,DC=local' 'Test PW Reset Group'
Set-Acl : This security ID may not be assigned as the owner of this object
At D:\Program\ocpermissions\PasswordResetDelegation.psm1:29 char:5
+     Set-Acl -Path "AD:\$OrganizationalUnit" -AclObject $delegationGro ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (OU=Test,OU=ITA,DC=kos,DC=local:St
   ring) [Set-Acl], ADException
    + FullyQualifiedErrorId : ADProvider:SetSecurityDescriptor:ADError,Microso
   ft.PowerShell.Commands.SetAclCommand

И это несмотря на то, что я дал пользователю, что скрипт выполняется для полного контроля над OU и всеми объектами в нем. (Просто в целях тестирования.) Я также не вижу, что код пытается изменить владельца OU, так что это меня еще больше смущает.

Как ни странно, при тестировании я даже не получаю то же самое в своем реальном производственном подразделении. Вместо этого я получаю следующее:

Set-Acl : Access is denied
At D:\Program\ocpermissions\PasswordResetDelegation.psm1:29 char:5
+     Set-Acl -Path "AD:\$OrganizationalUnit" -AclObject $delegationGro ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (OU=Externa anvä...DC=kos,DC=l
   ocal:String) [Set-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : ADProvider:SetSecurityDescriptor:AccessDenied,Mi
   crosoft.PowerShell.Commands.SetAclCommand

Что могло происходить? Что может мешать правильной работе скрипта? (Я должен добавить, что сценарий отлично работает с учетной записью, имеющей права администратора домена, но я действительно не хочу запускать запланированную задачу с этими разрешениями.)

Кажется, что Set-Acl не работает правильно в этом контексте. Не уверен, что именно с этим было не так, но когда вместо этого использовали Set-ADOrganizationalUnit $ou -Replace @{nTSecurityDescriptor = $ouacl} установить ACL проблема исчезла.

Это говорит о том, что проблема не в разрешениях AD, как я изначально подозревал.

Вот фиксированная версия функции, которую я пытался использовать:

function Set-ResetPasswordDelegation(){
    param(
    [string]$OrganizationalUnit,
    [string]$DelegationGroupName
    )

    # Configuration Parameters
    $confADRight = "ExtendedRight"
    $confDelegatedObjectType = "bf967aba-0de6-11d0-a285-00aa003049e2" # User Object Type GUID
    $confExtendedRight = "00299570-246d-11d0-a768-00aa006e0529" # Extended Right PasswordReset GUID

    # Collect and prepare Objects
    $delegationGroup = Get-ADGroup -Identity $DelegationGroupName
    $delegationGroupSID = [System.Security.Principal.SecurityIdentifier] $delegationGroup.SID
    $ou = Get-ADOrganizationalUnit -Properties nTSecurityDescriptor $OrganizationalUnit
    $ouacl = $OU.nTSecurityDescriptor

    # Build Access Control Entry (ACE)
    $aceIdentity = [System.Security.Principal.IdentityReference] $delegationGroupSID
    $aceADRight = [System.DirectoryServices.ActiveDirectoryRights] $confADRight
    $aceType = [System.Security.AccessControl.AccessControlType] "Allow"
    $aceInheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance] "Descendents"
    $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($aceIdentity, $aceADRight, $aceType, $confExtendedRight, $aceInheritanceType,$confDelegatedObjectType)

    # Apply ACL
    $ouacl.AddAccessRule($ace)
    Set-ADOrganizationalUnit $ou -Replace @{nTSecurityDescriptor = $ouacl}
}