Bonjour à tous,
Je partage avec vous un script PowerShell que j'ai développé pour automatiser la création et le déploiement d'une GPO qui désactive le compte invité sur les postes du domaine.
Le script permet de :
- Créer une GPO avec un nom personnalisé
- Configurer automatiquement les paramètres de sécurité (désactivation compte invité, longueur mot de passe, etc.)
- Lier la GPO au domaine
- Déployer la mise à jour sur tous les postes clients
Le code est fonctionnel mais je rencontre un problème : bien que le script se déploie correctement sur les postes clients, les modifications ne prennent pas effet sans une intervention manuelle sur la GPO. Que ce soit pour la désactivation du compte invité ou d'autres paramètres comme le temps d'expiration des mots de passe, je dois systématiquement faire une modification manuelle dans la GPO pour que les changements s'appliquent.
J'ai d'abord pensé à un problème de droits, j'ai donc créé un exécutable pour lancer le script en tant qu'administrateur, mais cela n'a rien changé.
Mon automatisation perd tout son sens si je dois intervenir manuellement à chaque fois...
Est-ce que quelqu'un aurait déjà rencontré ce problème ou aurait une piste ? Je soupçonne peut-être un problème de priorité ou de refresh de la GPO, mais je n'arrive pas à identifier la cause exacte.
Je partage le code ci-dessous pour ceux qui voudraient l'examiner :
# Fonction de mise à jour GPO
function Update-DomainGPO {
Write-Host "Récupération des ordinateurs..."
try {
$computers = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
$totalComputers = $computers.Count
$current = 0
foreach ($computer in $computers) {
$current++
Write-Progress -Activity "Mise à jour GPO" -Status "Mise à jour sur $computer" -PercentComplete (($current / $totalComputers) * 100)
try {
if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
Invoke-Command -ComputerName $computer -ScriptBlock {
gpupdate /force /wait:0
} -ErrorAction SilentlyContinue
}
}
catch {
continue
}
}
Write-Host "Mise à jour terminée !" -ForegroundColor Green
}
catch {
Write-Host "Erreur lors de la mise à jour: $($_.Exception.Message)" -ForegroundColor Red
}
}
# Création de la GPO
function New-CustomGPO {
param(
[Parameter(Mandatory=$true)]
[string]$GPOName
)
try {
New-GPO -Name $GPOName -Comment "GPO pour désactiver le compte invité"
$securityContent = @"
[Unicode]
Unicode=yes
[System Access]
EnableGuestAccount = 0
MinimumPasswordLength = 14
PasswordComplexity = 1
[Version]
signature="`$CHICAGO`$"
Revision=1
[Registry Values]
MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1
[Privilege Rights]
SeDenyNetworkLogonRight = *S-1-5-32-546
SeDenyInteractiveLogonRight = *S-1-5-32-546
"@
$securityPath = "$env:TEMP\security.inf"
$securityContent | Out-File -FilePath $securityPath -Encoding Unicode -Force
$gpo = Get-GPO -Name $GPOName
$gpoPath = "\\$env:USERDNSDOMAIN\SYSVOL\$env:USERDNSDOMAIN\Policies\{$($gpo.Id)}"
$machineDir = "$gpoPath\Machine\Microsoft\Windows NT\SecEdit"
New-Item -Path $machineDir -ItemType Directory -Force | Out-Null
Copy-Item -Path $securityPath -Destination "$machineDir\GptTmpl.inf" -Force
$domainDN = (Get-ADDomain).DistinguishedName
New-GPLink -Name $GPOName -Target $domainDN -LinkEnabled Yes -Enforced Yes
Remove-Item -Path $securityPath -Force -ErrorAction SilentlyContinue
Write-Host "GPO créée avec succès." -ForegroundColor Green
$updateNetwork = Read-Host "Voulez-vous mettre à jour le réseau ? (O/N)"
if ($updateNetwork -eq 'O') {
Update-DomainGPO
}
}
catch {
Write-Host "Erreur: $($_.Exception.Message)" -ForegroundColor Red
}
}
# Utilisation du script
$gpoName = Read-Host "Entrez le nom de la GPO"
if (-not [string]::IsNullOrWhiteSpace($gpoName)) {
New-CustomGPO -GPOName $gpoName
}
else {
Write-Host "Le nom de la GPO ne peut pas être vide." -ForegroundColor Red
}
Aussi j'ai mis en place un scripte pour forcer les mises à jours sur Microsoft 365 App et cela fonctionne bien, à partir d'une Template Microsoft, cela n'est pas dans paramètres de sécurité.
Peut-être un piste ...
Merci d'avance pour votre aide !
Partager