Besoin de mettre à jour l’adresse IP distante d’une règle de pare‑feu stockée dans un GPO ? Voici deux méthodes PowerShell éprouvées — recréation contrôlée ou modification in‑situ du filtre — avec scripts prêts à l’emploi, astuces de validation et garde‑fous pour l’exploitation.
Contexte et problème
Un administrateur doit remplacer l’adresse IP d’une règle Windows Defender Firewall configurée par stratégie de groupe. La tentative suivante échoue :
Set-NetFirewallRule -GPOSession $GpoSession -DisplayName 'MaRègle' -RemoteAddress '192.168.1.100'
Le message d’erreur « A parameter cannot be found that matches parameter name ‘GPOSession’ » s’explique simplement : Set‑NetFirewallRule
ne prend pas en charge le paramètre -GPOSession
. C’est un point souvent méconnu du module NetSecurity : certaines cmdlets gèrent les sessions GPO (Open‑NetGPO
/Save‑NetGPO
), d’autres non.
Ce qu’implique l’absence de -GPOSession
sur Set‑NetFirewallRule
- Vous ne pouvez pas modifier « directement » une règle existante dans une session GPO avec cette cmdlet.
- Il faut soit recréer la règle (suppression puis nouvelle création), soit modifier le filtre d’adresse associé via les cmdlets
*AddressFilter
, qui elles acceptent-GPOSession
.
Deux voies sûres pour remplacer l’adresse IP
Approche | Cmdlets principales | Quand l’utiliser | Avantages / Inconvénients |
---|---|---|---|
Supprimer puis recréer la règle | Open‑NetGPO , Remove‑NetFirewallRule , New‑NetFirewallRule , Save‑NetGPO | Quand vous maîtrisez la définition de la règle (action, profils, ports…) et acceptez une recréation fidèle. | + Facile à raisonner, repart propre. − Risque de perte d’attributs oubliés (groupe, interface, service…). |
Modifier le filtre d’adresse (in‑situ) | Get‑NetFirewallAddressFilter , Set‑NetFirewallAddressFilter | Quand seule l’adresse distante change et que la règle doit rester intacte. | + Minimal, conserve tout le reste. − Nécessite d’identifier le bon filtre (remote vs local). |
Pré‑requis et bonnes pratiques avant changement
- Droits : exécuter PowerShell en administrateur de domaine ou avec des délégations GPO adaptées.
- Session GPO : regroupez les modifications avec
Open‑NetGPO
et terminez parSave‑NetGPO
afin de limiter les écritures et les risques de conflit. - Sauvegarde : conservez un backup du GPO
Backup-GPO -Name 'NomDuGPO' -Path '\\serveur\GPO-Backups'
. - Identification fiable : ne dépendez pas uniquement de
-DisplayName
(non garanti unique). NotezName
etInstanceID
lorsque c’est possible. - Validation : prévoyez un contrôle post‑déploiement (
gpupdate /force
,gpresult /H
, journaux pare‑feu).
Méthode 1 : supprimer puis recréer la règle
Étapes minimales
$gpo = Open-NetGPO -PolicyStore 'domain.local\NomDuGPO'
# (Optionnel) Visualiser la règle avant suppression
Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' |
Select-Object DisplayName, Name, InstanceID, Enabled, Direction, Action
# Supprimer l'ancienne
Remove-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' -Confirm:$false
# Recréer à l'identique (exemple : blocage entrant d'une IP précise)
New-NetFirewallRule -GPOSession $gpo ` -DisplayName 'MaRègle'`
-Direction Inbound -Action Block -Enabled True ` -RemoteAddress '192.168.1.100'`
-Profile Any ` -Program Any -Service Any`
-Protocol Any
# Valider la session
Save-NetGPO -GPOSession $gpo
Adaptez les paramètres Direction, Action, Profile, Protocol, etc., pour correspondre à l’ancienne définition. Un moyen sûr consiste à capturer la configuration d’origine (Get‑NetFirewallRule
+ Get‑NetFirewallAddressFilter
, Get‑NetFirewallPortFilter
…) avant suppression.
Version robuste et idempotente
Le snippet ci‑dessous remplace l’adresse distante uniquement si nécessaire et reconstruit la règle à l’identique (filtre port/service conservé) :
param(
[Parameter(Mandatory=$true)] [string] $GpoPath, # ex. 'domain.local\NomDuGPO'
[Parameter(Mandatory=$true)] [string] $DisplayName, # ex. 'MaRègle'
[Parameter(Mandatory=$true)] [string[]] $NewRemoteAddress # ex. @('192.168.1.100')
)
$gpo = Open-NetGPO -PolicyStore $GpoPath
$rules = Get-NetFirewallRule -GPOSession $gpo -DisplayName $DisplayName
if(-not $rules){
throw "Règle introuvable dans $GpoPath : $DisplayName"
}
foreach($r in $rules){
$addr = $r | Get-NetFirewallAddressFilter
$old = ($addr.RemoteAddress -join ',')
$new = ($NewRemoteAddress -join ',')
if($old -eq $new){
Write-Host "Aucun changement pour '$($r.DisplayName)' ($($r.Name))"
continue
}
# Capturer éléments critiques à répliquer
$dir = $r.Direction; $act = $r.Action; $ena = $r.Enabled
$grp = $r.Group; $prf = $r.Profile; $int = $r.InterfaceType
$svc = ($r | Get-NetFirewallServiceFilter).Service
$prt = ($r | Get-NetFirewallPortFilter)
$app = ($r | Get-NetFirewallApplicationFilter).Program
# Supprimer puis reconstruire
$null = $r | Remove-NetFirewallRule -GPOSession $gpo -Confirm:$false
$params = @{
GPOSession = $gpo
DisplayName = $r.DisplayName
Direction = $dir
Action = $act
Enabled = $ena
Group = $grp
Profile = $prf
InterfaceType= $int
RemoteAddress= $NewRemoteAddress
}
if($svc) { $params['Service'] = $svc }
if($app) { $params['Program'] = $app }
if($prt){ $params['Protocol'] = $prt.Protocol
if($prt.LocalPort) { $params['LocalPort'] = $prt.LocalPort }
if($prt.RemotePort) { $params['RemotePort'] = $prt.RemotePort } }
New-NetFirewallRule @params | Out-Null
Write-Host "Mise à jour: $($r.DisplayName) — $old → $new"
}
Save-NetGPO -GPOSession $gpo
Write-Host "Terminé."
À retenir
- Cette approche est universelle mais exige de bien répliquer tous les filtres et métadonnées.
- Privilégiez les valeurs de
-Name
et-InstanceID
si vous devez cibler précisément une seule règle portant un libellé générique.
Méthode 2 : modifier directement le filtre d’adresse
Lorsque seule l’adresse distante évolue, la voie la plus propre consiste à modifier le filtre d’adresse associé à la règle — sans toucher au reste.
Commande express
$gpo = Open-NetGPO -PolicyStore 'domain.local\NomDuGPO'
Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress '192.168.1.100'
Save-NetGPO -GPOSession $gpo
Avec plusieurs adresses et IPv6
$newIPs = @('10.0.0.1','10.0.0.2','192.168.1.0/24','2001:db8::/32')
Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress $newIPs
Save-NetGPO -GPOSession $gpo
Fonction prête à l’emploi (idempotente)
function Set-GpoFirewallRemoteAddress {
[CmdletBinding(SupportsShouldProcess)]
param(
[Parameter(Mandatory)] [string] $GpoPath,
[Parameter(Mandatory)] [string] $DisplayName,
[Parameter(Mandatory)] [string[]] $RemoteAddress
)
$gpo = Open-NetGPO -PolicyStore $GpoPath
$rules = Get-NetFirewallRule -GPOSession $gpo -DisplayName $DisplayName
if(-not $rules){ throw "Règle introuvable: '$DisplayName' dans '$GpoPath'." }
foreach($r in $rules){
$af = $r | Get-NetFirewallAddressFilter
$old = ($af.RemoteAddress -join ',')
$new = ($RemoteAddress -join ',')
if($old -eq $new){
Write-Verbose "Aucun changement pour $($r.Name)"
continue
}
if($PSCmdlet.ShouldProcess($r.Name, "RemoteAddress $old -> $new")){
$af | Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress $RemoteAddress
Write-Host "OK: $($r.DisplayName) ($($r.Name)) mis à jour."
}
}
Save-NetGPO -GPOSession $gpo
}
Pourquoi c’est souvent la meilleure option
- Sécurité : aucune fenêtre où la règle n’existe plus.
- Exactitude : pas de risque d’oublier un paramètre lors d’une recréation.
- Lisibilité : l’historique de la règle reste linéaire, utile pour l’audit.
Exemples d’usage avancés
Mettre à jour plusieurs règles d’un même GPO
$gpo = Open-NetGPO -PolicyStore 'domain.local\NomDuGPO'
$map = @{
'Règle Web Sortant' = @('203.0.113.10','203.0.113.11')
'MaRègle' = @('192.168.1.100')
}
foreach($kv in $map.GetEnumerator()){
Get-NetFirewallRule -GPOSession $gpo -DisplayName $kv.Key |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress $kv.Value
}
Save-NetGPO -GPOSession $gpo
Piloter depuis un CSV
Fichier remplacements.csv
:
GpoPath,DisplayName,RemoteAddress
domain.local\Serveurs-SQL,SQL Sortant,"10.10.10.0/24"
domain.local\PareFeu-Postes,MaRègle,"192.168.1.100;192.168.1.101"
Script :
$rows = Import-Csv .\remplacements.csv
foreach($row in $rows){
$ips = $row.RemoteAddress -split ';'
$gpo = Open-NetGPO -PolicyStore $row.GpoPath
Get-NetFirewallRule -GPOSession $gpo -DisplayName $row.DisplayName |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress $ips
Save-NetGPO -GPOSession $gpo
}
Contrôles et validation post‑modification
- Rendu effectif : sur une machine cible, forcer l’application et vérifier :
gpupdate /force gpresult /H C:\temp\gpresult.html
- Inspection des règles appliquées :
Get-NetFirewallRule -PolicyStore ActiveStore | Where-Object DisplayName -eq 'MaRègle' | Format-List DisplayName, Enabled, Direction, Action
- Test de connectivité :
Test-NetConnection -ComputerName 192.168.1.100 -Port 443
- Journalisation : activez les logs pare‑feu (dropping/allow) pour confirmer le comportement.
Pièges fréquents et dépannage
Symptôme | Cause probable | Correctif |
---|---|---|
La commande Set‑NetFirewallRule -GPOSession échoue | Paramètre -GPOSession non pris en charge par cette cmdlet | Utiliser la méthode « recréer » ou « modifier le filtre d’adresse » |
Règle non trouvée | -DisplayName ambigu ou orthographe | Filtrer avec -Name ou inspecter Name /InstanceID avant ciblage |
Aucun effet sur postes | GPO non lié / filtrage de sécurité / filtre WMI | Vérifier le lien, la sécurité, le WMI, et l’ordre des GPO |
Résultats incohérents entre sites | Réplication SYSVOL/AD en cours | Attendre la convergence, vérifier l’état DFSR/NTFRS |
Perte d’un paramètre après recréation | Paramètre oublié lors du New‑NetFirewallRule | Script de capture préalable des filtres (ports, service, programme, interface) |
Blocage inattendu | Conflit de règles (priorités Domain vs Local, Block vs Allow) | Analyser l’effective policy et l’ordre des règles, privilégier un Block spécifique si nécessaire |
Bien comprendre « RemoteAddress »
- Règle entrante : RemoteAddress = adresse source du client.
- Règle sortante : RemoteAddress = adresse de destination visée par la machine locale.
- Valeurs acceptées : IP unique, plages CIDR (
10.0.0.0/24
), LocalSubnet, plages IPv6 (2001:db8::/32
), listes séparées par virgules. - Plusieurs adresses : passez un tableau
@('10.0.0.1','10.0.0.2')
ou une chaîne avec virgules.
Check‑list opérationnelle
Étape | Commande type | Objectif |
---|---|---|
Ouvrir une session GPO | $gpo = Open-NetGPO -PolicyStore 'domain.local\GPO' | Regrouper les modifications avant commit |
Lister les règles | Get-NetFirewallRule -GPOSession $gpo | Select DisplayName, Name | Identifier précisément la cible |
Voir le filtre d’adresse | Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' | Get-NetFirewallAddressFilter | Confirmer l’état initial |
Mettre à jour l’adresse | Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress '192.168.1.100' | Changer uniquement ce qui doit l’être |
Sauvegarder la session | Save-NetGPO -GPOSession $gpo | Écrire dans le GPO |
Valider côté poste | gpupdate /force | Appliquer immédiatement |
Conseils d’exploitation pour environnements exigeants
- Staging : éditez un GPO de pré‑production, liez‑le à une OU de test (ou appliquez un filtre WMI), puis promouvez.
- Journal d’audit : encapsulez chaque lot dans
Start‑Transcript
/Stop‑Transcript
et consignez l’horodatage, l’auteur, les diff d’IP. - Gestion des erreurs : activez
$ErrorActionPreference='Stop'
et utilisez destry/catch/finally
pour garantirSave‑NetGPO
ouUndo
(restauration de backup) en cas d’échec. - Conflits : documentez la hiérarchie des GPO (Ordre de liaison, héritage bloqué, enforcement) ; un GPO « Enforced » en amont peut outrepasser vos changements.
- Traçabilité : normalisez DisplayName et Group (ex.
[FW] SRV Sortant <App>
) pour faciliter les recherches et les rapports.
Foire aux questions
Q : Puis‑je vraiment modifier une règle GPO existante sans la supprimer ?
R : Oui, en ciblant son filtre d’adresse via Get‑NetFirewallAddressFilter
et Set‑NetFirewallAddressFilter
. Cette approche conserve tous les autres filtres (ports, service, programme, interface, etc.).
Q : Comment vérifier rapidement le nom exact d’une règle dans un GPO ?
R : Listez les règles de la session :
Get-NetFirewallRule -GPOSession $gpo | Select-Object DisplayName, Name, InstanceID
Q : Puis‑je fournir plusieurs adresses en une fois ?
R : Oui. Passez un tableau (@('10.0.0.1','10.0.0.2')
) ou une liste séparée par virgules. Les notations CIDR et IPv6 sont prises en charge.
Q : Quelle est la différence entre RemoteAddress et LocalAddress ?
R : RemoteAddress cible l’hôte distant (source en entrant, destination en sortant). LocalAddress restreint l’adresse locale de la machine à laquelle s’applique la règle. Ne pas les confondre.
Q : Pourquoi utiliser une session GPO plutôt que d’écrire directement dans le magasin de stratégie ?
R : La session GPO permet d’agréger les changements et de ne committer qu’une fois, réduisant les accès répétés au contrôleur de domaine et les risques de conflits.
Résumé pratique
- Constat :
Set‑NetFirewallRule
ne gère pas-GPOSession
, d’où l’erreur. - Solutions :
- Recréation contrôlée (supprimer puis
New‑NetFirewallRule
) ; - Modification in‑situ via
Set‑NetFirewallAddressFilter
(recommandée si seule l’IP change).
- Recréation contrôlée (supprimer puis
- Bonnes pratiques : session GPO, sauvegarde GPO, ciblage fiable par
Name/InstanceID
, validationsgpupdate
/gpresult
/ journaux pare‑feu.
Snippets « copier‑coller »
Changer une seule adresse pour une règle donnée
$gpo = Open-NetGPO -PolicyStore 'domain.local\NomDuGPO'
Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress '192.168.1.100'
Save-NetGPO -GPOSession $gpo
Ajouter/Remplacer par une liste d’adresses
$ips = @('10.0.0.5','10.0.0.6','10.0.1.0/24','2001:db8::/48')
Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress $ips
Save-NetGPO -GPOSession $gpo
Recréer la règle en assurant l’équivalence
$r = Get-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle'
$af = $r | Get-NetFirewallAddressFilter
$pf = $r | Get-NetFirewallPortFilter
$sf = $r | Get-NetFirewallServiceFilter
$ap = $r | Get-NetFirewallApplicationFilter
$r | Remove-NetFirewallRule -GPOSession $gpo -Confirm:$false
New-NetFirewallRule -GPOSession $gpo ` -DisplayName $r.DisplayName`
-Direction $r.Direction ` -Action $r.Action`
-Enabled $r.Enabled ` -Group $r.Group`
-Profile $r.Profile ` -InterfaceType $r.InterfaceType`
-RemoteAddress '192.168.1.100' ` -Protocol $pf.Protocol`
-LocalPort $pf.LocalPort ` -RemotePort $pf.RemotePort`
-Service $sf.Service `
-Program $ap.Program
Save-NetGPO -GPOSession $gpo
Checklist de sécurité et de qualité
- Exécuter d’abord en WhatIf lorsque disponible (
-WhatIf
sur vos fonctions). - Appliquer le principe de moindre privilège : déléguer l’édition du GPO plutôt qu’utiliser le compte Domain Admin partout.
- Documenter les changements (numéro de ticket, justification, risques, plan de retour arrière).
- Surveiller l’échec de traitement des GPO côté clients (Event Viewer → Applications and Services Logs → Microsoft‑Windows‑GroupPolicy/Operational).
En bref : l’échec de Set‑NetFirewallRule -GPOSession
est attendu ; choisissez la recréation contrôlée ou, de préférence, la mise à jour in‑situ du filtre d’adresse. Travaillez dans une session GPO, sauvegardez, validez sur un périmètre pilote, puis déployez sereinement.