Eu acho que isso pode ter a ver com como Get-Acl
funciona sob o capô. Se bem me lembro, ele recupera tanto a DACL (que você quer) quanto a SACL (que você não quer) do objeto. Seu usuário sqladmin só tem permissões para modificar a DACL. E quando você usa Set-Acl
com seu objeto modificado, ele tenta gravar todo o objeto, incluindo a SACL, mesmo que ela não tenha mudado. E como você não tem acesso, obtém o acesso negado.
Há uma questão relacionada aqui que tem uma solução alternativa para lidar com permissões em objetos do sistema de arquivos. Mas o método GetAccessControl()
não existe em objetos do AD.
No entanto, o objeto AD tem seu próprio conjunto de métodos que você pode usar como uma alternativa. Um deles é ModifyAccessRule . Aqui está uma modificação do seu código para usá-lo.
# grab the data you need from the AD objects
$AG = Get-ADComputer AG
$AGDN = $AG.DistinguishedName # input AD computer distinguishedname
$cluster = Get-ADComputer cluster
$SID = [System.Security.Principal.SecurityIdentifier] $cluster.SID
# create the ACE you want to add
$identity = [System.Security.Principal.IdentityReference] $SID
$adRights = [System.DirectoryServices.ActiveDirectoryRights] "GenericAll"
$type = [System.Security.AccessControl.AccessControlType] "Allow"
$inheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance] "None"
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $identity,$adRights,$type,$inheritanceType
# get an ADSI reference to the AD object we're going to tweak
$AGADSI = [adsi]"LDAP://$AGDN"
# we need an existing boolean output variable for the function
$modified = $false
# call the function and commit the changes
$AGADSI.PSBase.ObjectSecurity.ModifyAccessRule([System.Security.AccessControl.AccessControlModification]::Add,$ace,[ref]$modified)
$AGADSI.PSBase.CommitChanges()
# you could/should check the value of $modified to make sure it's True before doing the
# commit. But hypothetically the only thing that would screw it up is if you botched the
# ACE creation.