web-dev-qa-db-ja.com

正しい権限を持つアカウントを実行しているにもかかわらず、AD権限を設定するPowerShellスクリプトが「アクセス拒否」で失敗する

スクリプトの一部として次の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パラメーター)は特定のOU(OrganizationalUnitパラメーター)内のすべてのユーザーのパスワードをリセットできます。

これは、管理者として実行すると問題なく機能しますが、スケジュールされたタスクの実行に使用するアカウントとして実行しようとすると、問題が発生します。下記参照:

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の所有者を変更しようとしていることもわかりません。そのため、さらに混乱します。

Screenshot showing that the svc-ocpermissions account has Full Control permissions on the Test 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

何が起こっているのでしょうか?スクリプトが正しく機能しない原因は何ですか? (スクリプトは、ドメイン管理者特権を持つアカウントで正常に動作することを追加する必要がありますが、これらのアクセス許可でスケジュールされたタスクを実行したくありません。)

4

のようだ 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}
}
2