Désactiver les partie inutilisées des GPOs

Dans le post précédent , nous avons vu comment lister les GPOs Vide. La création de GPO avec des parties User ou Computer vide a un impact sur leurs traitements, d’ailleurs Citrix recommande dans son “Logon Optimization Guide” _ http://support.citrix.com/article/CTX128277 _ de désactiver les parties inutilisées d’une GPO. A partir du membre gPCFileSysPath des objets AD “GroupPolicyContainer”, nous pouvons donc imaginer le script powershell suivant pour déterminer les GPOs “mal configuré”, c’est à dire, avec une partie vide non désactivé.

  Get-ADOrganizationalUnit -Filter 'OU -like "*Citrix*"' -SearchBase 'dc=fabricam,dc=com' -Properties * |% { 
	$_.gpLink -split ']' } |? { 
	$_ -match '[0,2]$'} |% {
	(($_ -replace '\[','').split(';')[0]) -replace 'LDAP://',''} |% { 
	get-adobject $_ -properties * } |
	sort -Unique DisplayName | 
	select DisplayName,flags,@{N='flagsRecommended';E={
		if([bool]( gci "$($_.gPCFileSysPath)\User") -eq $false){
			if([bool](gci "$($_.gPCFileSysPath)\Machine") -eq $false){
				3
			}else{
				1
			}
		}else {
			if([bool](gci "$($_.gPCFileSysPath)\Machine") -eq $false){
				2
			}ELSE{
				0
			}
		}
	} }

Version oneliner

Le script s’occupe de lire les GPOs lié aux OU contenant le mot Citrix, puis à partir du gPLink, nous récupérons l’ensemble des GPO linké et active (0 ou 2 ). Ensuite nous récupérons l’objet GPO et nous vérifions son contenu.

Allons un peu plus loin !

Le module GroupPolicy nous permets via la class Microsoft.GoupPolicy.Gpo de modifier le statut de la GPO via le member GpoStatus du type Microsoft.GoupPolicy.GpoStatus. Pour désactiver une partie de GPO, il suffit de donner la bonne valeur GpoStatus c’est à dire :

  • UserSettingsDisabled
  • ComputerSettingsDisabled
  • AllSettingsDisabled

Voici un exemple de comment désactiver la partie User d’une GPO

(get-gpo -Name MyGPO).GpoStatus ="UserSettingsDisabled"

Si nous mettons tout ensemble :

Get-ADOrganizationalUnit -Filter 'OU -like "*Citrix*"' -SearchBase 'dc=fabrikam,dc=com' -Properties * |% { 
	$_.gpLink -split ']' } |? { 
	$_ -match '[0,2]$'} |% {
	(($_ -replace '\[','').split(';')[0]) -replace 'LDAP://',''} |% { 
	get-adobject $_ -properties * } |
	sort -Unique DisplayName |% {
		if( $_.Flags -ne 3 ){
			if([bool]( gci "$($_.gPCFileSysPath)\User") -eq $false){
				if([bool](gci "$($_.gPCFileSysPath)\Machine") -eq $false){
					(get-gpo -Name $_.DisplayName).GpoStatus = "AllSettingsDisabled"
				}else{
					(get-gpo -Name $_.DisplayName).GpoStatus = "UserSettingsDisabled"
				}
			}else {
				if([bool](gci "$($_.gPCFileSysPath)\Machine") -eq $false){
					(get-gpo -Name $_.DisplayName).GpoStatus = "ComputerSettingsDisabled"
				}ELSE{
					#do nothing
				}
			}
		}
	} 

la version oneliner