Eu estava tentando encontrar uma maneira de definir "Aplicar política" a "Negar" para um determinado grupo em vários GPOs (cerca de 50), por isso estava procurando uma maneira de fazer isso automaticamente, quando me deparei com este post em um blog (aparentemente abandonado) com o seguinte script :
$strGroup = "my group"
$strGPO = "my GPO"
$GroupObject = Get-ADGroup $strGroup
$GroupSid = new-object System.Security.Principal.SecurityIdentifier $GroupObject.SID
$GPOObject = Get-GPO $strGPO
$GPOPath = $GPOObject.path
$GPOADObject = [ADSI]"LDAP://$GPOPath"
$GPOObjSec = $GPOADObject.psbase.ObjectSecurity
$GPOACLList = $GPOObjSec.GetAccessRules($true,$true,[System.Security.Principal.SecurityIdentifier])
$extRight = [system.guid]"edacfd8f-ffb3-11d1-b41d-00a0c968f939"
$ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $GroupSid,"ReadProperty, GenericExecute","Deny","None"
$ace2 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $GroupSid,"ExtendedRight","Deny",$extRight,"All"
$GPOADObject.psbase.get_objectSecurity().AddAccessRule($ace1)
$GPOADObject.psbase.get_objectSecurity().AddAccessRule($ace2)
$GPOADObject.psbase.CommitChanges()
$GPOGPTstr = "\"+$GPOObject.DomainName+"\SYSVOL\"+$GPOObject.DomainName+"\Policies\{"+$GPOObject.Id+"}"
$acl = Get-ACL $GPOGPTstr
$acl.SetAccessRuleProtection($True, $False)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($strGroup,"ReadAndExecute", "ContainerInherit, ObjectInherit", "None", "Deny")
$acl.AddAccessRule($rule)
Set-Acl $GPOGPTstr $acl
Eu adicionei um loop foreach
para obter meus grupos de um arquivo de texto. Funciona, exceto pela linha 14:
$ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $GroupSid,"ReadProperty, GenericExecute","Deny","None"
Isso gera o seguinte erro:
new-object : Multiple ambiguous overloads found for "ActiveDirectoryAccessRule" and the argument count: "4".
At .\denyApplyGPOtoGroup.ps1:16 char:10
+ $ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $GroupSid ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
Naturalmente, a linha 16 falha, pois $ace1
é $null
. No entanto, o script funciona: basicamente, as permissões são aplicadas corretamente ao GPC, mas não ao GPT, o que faz sentido com o código e o erro gerados. Então, quando fui ao GPMC, cliquei no GPO e recebi uma mensagem dizendo:
“The permissions for this GPO in the SYSVOL folder are inconsistent
with those in Active Directory. It is recommended that these
permissions be consistent. To change the permissions in SYSVOL to
those in Active Directory, click OK.”
Clicar em OK corrige a bagunça, mas ainda procura uma solução para essa solução alternativa, embora ... Alguma idéia?