Eu estava tentando encontrar uma maneira de definir "Aplicar política" como "Negar" para um determinado grupo em vários GPOs (cerca de 50), então estava procurando uma maneira de fazer isso automaticamente, quando me deparei com esta postagem em um ( aparentemente) abandonou o blog 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 foreach
loop, para obter meus grupos de um arquivo de texto. Funciona, exceto para a linha 14:
$ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $GroupSid,"ReadProperty, GenericExecute","Deny","None"
Isso lança 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
Claro, a linha 16 falha, assim $ace1
como $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 gerado. Então, quando fui ao GPMC, cliquei no GPO e recebi uma mensagem dizendo:
“As permissões para este GPO na pasta SYSVOL são inconsistentes com as do Active Directory. É recomendável que essas permissões sejam consistentes. Para alterar as permissões no SYSVOL para as do Active Directory, clique em OK.”
Clicar em OK corrige a bagunça, mas ainda estou procurando uma solução para essa solução alternativa ... Alguma ideia?
Remova $ace1 e remova essas linhas;
Tudo o que você deseja é adicionar o direito Negar inscrição. Portanto, você não precisa alterar a ACL na pasta de políticas Sysvol e também não deseja remover os direitos de leitura.
$ace1 remove os direitos da política de leitura.
O código final é este: