Remplacer l’adresse IP d’une règle de pare‑feu GPO avec PowerShell : méthodes fiables et scripts prêts à l’emploi

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.

Sommaire

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

ApprocheCmdlets principalesQuand l’utiliserAvantages / Inconvénients
Supprimer puis recréer la règleOpen‑NetGPO, Remove‑NetFirewallRule, New‑NetFirewallRule, Save‑NetGPOQuand 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‑NetFirewallAddressFilterQuand 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 par Save‑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). Notez Name et InstanceID 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ômeCause probableCorrectif
La commande Set‑NetFirewallRule -GPOSession échoueParamètre -GPOSession non pris en charge par cette cmdletUtiliser la méthode « recréer » ou « modifier le filtre d’adresse »
Règle non trouvée-DisplayName ambigu ou orthographeFiltrer avec -Name ou inspecter Name/InstanceID avant ciblage
Aucun effet sur postesGPO non lié / filtrage de sécurité / filtre WMIVérifier le lien, la sécurité, le WMI, et l’ordre des GPO
Résultats incohérents entre sitesRéplication SYSVOL/AD en coursAttendre la convergence, vérifier l’état DFSR/NTFRS
Perte d’un paramètre après recréationParamètre oublié lors du New‑NetFirewallRuleScript de capture préalable des filtres (ports, service, programme, interface)
Blocage inattenduConflit 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

ÉtapeCommande typeObjectif
Ouvrir une session GPO$gpo = Open-NetGPO -PolicyStore 'domain.local\GPO'Regrouper les modifications avant commit
Lister les règlesGet-NetFirewallRule -GPOSession $gpo | Select DisplayName, NameIdentifier précisément la cible
Voir le filtre d’adresseGet-NetFirewallRule -GPOSession $gpo -DisplayName 'MaRègle' | Get-NetFirewallAddressFilterConfirmer l’état initial
Mettre à jour l’adresseSet-NetFirewallAddressFilter -GPOSession $gpo -RemoteAddress '192.168.1.100'Changer uniquement ce qui doit l’être
Sauvegarder la sessionSave-NetGPO -GPOSession $gpoÉcrire dans le GPO
Valider côté postegpupdate /forceAppliquer 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 des try/catch/finally pour garantir Save‑NetGPO ou Undo (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).
  • Bonnes pratiques : session GPO, sauvegarde GPO, ciblage fiable par Name/InstanceID, validations gpupdate / 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.

Sommaire