Question
Surveiller évènement Systeme
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 10 ans 1 semaine #21819
par Steve
Réponse de Steve sur le sujet Re:Surveiller évènement Systeme
Bonjour,
Le script touche bientôt à sa fin.
Je rencontre un obstacle sur l'optimisation du script.
Mon script initial faisait appel à un autre. Ceci n'était pas très propre et ne me dérangeait pas outre mesure .. Cependant, je compte faire de mon script un exe qui sera lancé sur les machines distante via task manager ou simplement un service windows.
La convertion en exe pose un problème dans mon cas, l'exe n'appelle pas mon deuxieme script ( qui coupe les carte ou les réup)
J'ai donc décidé de tout regrouper en un seul et unique script, ce qui est assez logique :
J'ai créé une fonction qui up ou down les cartes réseaux.
[code:1]
$action = { 1network } # 1network est la fonction dont je parle plus haut
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action $action
[/code:1]
Cela ne marche tout simplement pas. Je suis tombé sur des posts qui parle d'utiliser invoke-command mais dans mon cas je suis assez bloqué.
Avez-vous une idée ?
Merci d'avance,
Le script touche bientôt à sa fin.
Je rencontre un obstacle sur l'optimisation du script.
Mon script initial faisait appel à un autre. Ceci n'était pas très propre et ne me dérangeait pas outre mesure .. Cependant, je compte faire de mon script un exe qui sera lancé sur les machines distante via task manager ou simplement un service windows.
La convertion en exe pose un problème dans mon cas, l'exe n'appelle pas mon deuxieme script ( qui coupe les carte ou les réup)
J'ai donc décidé de tout regrouper en un seul et unique script, ce qui est assez logique :
J'ai créé une fonction qui up ou down les cartes réseaux.
[code:1]
$action = { 1network } # 1network est la fonction dont je parle plus haut
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action $action
[/code:1]
Cela ne marche tout simplement pas. Je suis tombé sur des posts qui parle d'utiliser invoke-command mais dans mon cas je suis assez bloqué.
Avez-vous une idée ?
Merci d'avance,
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 1 jour #21843
par Philippe
Réponse de Philippe sur le sujet Re:Surveiller évènement Systeme
salut Anoskar
je pense que la variable $action doit contenir le code de ta fonction et non le nom de la fonction qui appel le code
sinon il y a peu de change que Register-WmiEvent puisse retrouvé la fonction dans la mémoire
exemple :
[code:1]$action = {
$carte = gwmi -Class win32_networkAdapter | where-object { $_.deviceID -eq 7 }
.
.
.
}
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action $action[/code:1]
je pense que la variable $action doit contenir le code de ta fonction et non le nom de la fonction qui appel le code
sinon il y a peu de change que Register-WmiEvent puisse retrouvé la fonction dans la mémoire
exemple :
[code:1]$action = {
$carte = gwmi -Class win32_networkAdapter | where-object { $_.deviceID -eq 7 }
.
.
.
}
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action $action[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 9 ans 11 mois #21947
par Steve
Réponse de Steve sur le sujet Re:Surveiller évènement Systeme
Bonjour @ toutes / tous,
Merci @ toi 6ratgus. J'ai effectivement un peu compris le truc
A l'heure où je vous écris, le script est fonctionnel.
Cependant, il fonctionne en deux parties.
Le code gérant l'event :
[code:1]
echo \"POST event ok\" >> Prems.txt
$eventName = \"EcouteLan\" # Sera tout simplement le nom de mon event, il sera visible via Get-EventSubscriber
$message = \"Pas d'ETH up\"
$path = \"HKCU:\\"
$nA = \"IdN\"
$nB = \"IdNull\"
$full = $path + $nA
$carteLanConf = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.DNSDomain -match \"mon.domainei\"«») }
$id = $carteLanConf | ForEach-Object { $_.index }
echo $id >> id.txt
if ($id -ne $null)
{
if (Get-Item -path $full) # Si la cle existe déja, on ne touche pas
{
#Set-ItemProperty -path $full -Name index -Value $id
echo \"id existe dans registry\" >> id.txt
}
else
{
New-Item -Path $path -name $nA # elle n existe pas encore, go la creer
New-ItemProperty -Path HKCU:\IdN -Name index -PropertyType String -Value $id
echo \"Creation de lid dans la registry\" >> id.txt
}
}
else
{
if (Get-Item -path $full) # On va rechercher la cle
{
$id = (Get-ItemProperty $full).index # On va lire le contenu de la cle de registre et l utiliser
echo \"ID reprit via la registry \" >> id.txt
$id >> id.txt
}
else # On a pas d id, le script apprendra lorsque connecte au lan prov
{
New-Item -Path $path -name $nB # Me servira pour le debug, pas d id de carte.
New-ItemProperty -Path HKCU:\IdNull -Name index -PropertyType String -Value \"EMPTY\"
}
}
$lan = gwmi -class win32_networkAdapter | Where-Object { $_.deviceID -eq $id }
$lan.deviceID >> lan.txt
<# ******************************************************
# Requete WQL
# On va checker l'instance de la carte reseau
# qui nous interesse. Ici on s interesse au LAN filaire
# *******************************************************
#>
$query = \"SELECT * FROM __InstanceModificationEvent
WITHIN 3
WHERE TargetInstance ISA 'Win32_NetworkAdapter'
AND TargetInstance.DeviceID = \" + $lan.deviceID +
\"\"
echo \"POST event ok\" >> POSTevent.txt
if ($lan.deviceID -ne $null)
{
echo \"yes\" >> yes.txt
powershell.exe .\1networkProv_PWS2.ps1 # Pour le tout premier lancement uniquement.
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action{
powershell.exe .\1networkProv_PWS2.ps1
echo \"event ok\" >> event.txt
}
Get-EventSubscriber
}
else
{
echo \"RIEN\" > rien.txt # Si aucun deviceID n a ete definit, on arrive ici
}
[/code:1]
Et le code invoqué par l'event. ( il active ou désactive les cartes réseaux.)
[code:1]
$carte = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.DNSDomain -notmatch \"mon.domaine\"«») -and ($_.description -notmatch \"virtual\"«») -and ($_.description -notmatch \"bluetooth\"«») -and ($_.description -notmatch \"juniper\"«»)}
$juniper = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.description -match \"juniper\"«»)}
if ($carte -ne $null)
{
if ((Test-Connection -Cn 192.168.199.201 -BufferSize 16 -Count 3 -ea 0 -quiet) -and $juniper.ipaddress -eq $null)
{
$index = $carte | ForEach-Object { $_.index }
foreach ($id in $index)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { $_.deviceID -eq $id }
if ($wifi)
{
$wifi.disable()
}
}
}
else
{
$index = $carte | ForEach-Object { $_.index } # Pour powerShell V2 qui ne gère pas --> $index = $carte.index
foreach ($id in $index)
{
$wifi = gwmi -class win32_networkadapter | Where-Object { $_.deviceID -eq $id }
if ($wifi)
{
$wifi.enable()
}
}
}
}
else
{
echo \"Pas de carte reseau\"
}
[/code:1]
Il me reste encore un dernier rampart à franchir.
J'ai deux possibilité ( toutes les deux se concluant par un échec cuisant... ) :
1] Déployer en tache planifiée qui lanceront le script de l'event au démarrage. :
J'ai créé la tâche avec les bon droits ( pour l'instant les miens afin d'éviter des problèmes liés aux permissions user.
Les arguments -executionPolicy et -noExit ont été mis.
Cela ne marchant pas, j'ai tenté de passer par un .bat qui lance le powershell, cela ne marche pas non plus.
[code:1]
powershell.exe -file \"c:\scripts\eventLan.ps1\" -noExit
pause
[/code:1]
Dans les deux cas l'event semble passer à la trappe et rien ne passe.
Cependant, si je le lance manuelle à partir d'un shell, la pas de soucis....
2] Faire un seul script et en faire un service ( pour ma part, c'est la solution la plus \"propre\"
J'ai du passer via deux script distinct. L'event gère très bien l'appel d'un autre script qui fait son job mais très mal lorsque l'on lui copie et colle le contenu de ce dernier dans le scriptblock.
Ma théorie après une super journée à chercher :
Certaines carte réseaux sont nulles, lorsque je passe sur un .enable() ou disable(), cela génère des erreurs. ( logique, comment couper ou activer une carte vide.)
Si c'est lancé en dehors d'un scriptblock pas de problème, les erreurs sont affichées mais les cartes sont dans l'état voulu.
Dans le scriptblock c'est une autre histoire, j'ai mis quelques log afin de voir où il s'arrêtait et il le fait à la première carte réseaux...
J'ai tenté d'éviter les carte nulles mais rien n'y fait.
Dans les deux cas je suis cuit, visiblement, la gestion des event dans certains cas n'est pas si évidente.
Si vous avez une solution dans un de mes deux cas je suis preneur et désespéré ...
Bonne soirée @vous et merci pour vos réponses précédentes<br><br>Message édité par: Anoskar, à: 16/06/16 20:56
Merci @ toi 6ratgus. J'ai effectivement un peu compris le truc
A l'heure où je vous écris, le script est fonctionnel.
Cependant, il fonctionne en deux parties.
Le code gérant l'event :
[code:1]
echo \"POST event ok\" >> Prems.txt
$eventName = \"EcouteLan\" # Sera tout simplement le nom de mon event, il sera visible via Get-EventSubscriber
$message = \"Pas d'ETH up\"
$path = \"HKCU:\\"
$nA = \"IdN\"
$nB = \"IdNull\"
$full = $path + $nA
$carteLanConf = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.DNSDomain -match \"mon.domainei\"«») }
$id = $carteLanConf | ForEach-Object { $_.index }
echo $id >> id.txt
if ($id -ne $null)
{
if (Get-Item -path $full) # Si la cle existe déja, on ne touche pas
{
#Set-ItemProperty -path $full -Name index -Value $id
echo \"id existe dans registry\" >> id.txt
}
else
{
New-Item -Path $path -name $nA # elle n existe pas encore, go la creer
New-ItemProperty -Path HKCU:\IdN -Name index -PropertyType String -Value $id
echo \"Creation de lid dans la registry\" >> id.txt
}
}
else
{
if (Get-Item -path $full) # On va rechercher la cle
{
$id = (Get-ItemProperty $full).index # On va lire le contenu de la cle de registre et l utiliser
echo \"ID reprit via la registry \" >> id.txt
$id >> id.txt
}
else # On a pas d id, le script apprendra lorsque connecte au lan prov
{
New-Item -Path $path -name $nB # Me servira pour le debug, pas d id de carte.
New-ItemProperty -Path HKCU:\IdNull -Name index -PropertyType String -Value \"EMPTY\"
}
}
$lan = gwmi -class win32_networkAdapter | Where-Object { $_.deviceID -eq $id }
$lan.deviceID >> lan.txt
<# ******************************************************
# Requete WQL
# On va checker l'instance de la carte reseau
# qui nous interesse. Ici on s interesse au LAN filaire
# *******************************************************
#>
$query = \"SELECT * FROM __InstanceModificationEvent
WITHIN 3
WHERE TargetInstance ISA 'Win32_NetworkAdapter'
AND TargetInstance.DeviceID = \" + $lan.deviceID +
\"\"
echo \"POST event ok\" >> POSTevent.txt
if ($lan.deviceID -ne $null)
{
echo \"yes\" >> yes.txt
powershell.exe .\1networkProv_PWS2.ps1 # Pour le tout premier lancement uniquement.
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action{
powershell.exe .\1networkProv_PWS2.ps1
echo \"event ok\" >> event.txt
}
Get-EventSubscriber
}
else
{
echo \"RIEN\" > rien.txt # Si aucun deviceID n a ete definit, on arrive ici
}
[/code:1]
Et le code invoqué par l'event. ( il active ou désactive les cartes réseaux.)
[code:1]
$carte = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.DNSDomain -notmatch \"mon.domaine\"«») -and ($_.description -notmatch \"virtual\"«») -and ($_.description -notmatch \"bluetooth\"«») -and ($_.description -notmatch \"juniper\"«»)}
$juniper = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.description -match \"juniper\"«»)}
if ($carte -ne $null)
{
if ((Test-Connection -Cn 192.168.199.201 -BufferSize 16 -Count 3 -ea 0 -quiet) -and $juniper.ipaddress -eq $null)
{
$index = $carte | ForEach-Object { $_.index }
foreach ($id in $index)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { $_.deviceID -eq $id }
if ($wifi)
{
$wifi.disable()
}
}
}
else
{
$index = $carte | ForEach-Object { $_.index } # Pour powerShell V2 qui ne gère pas --> $index = $carte.index
foreach ($id in $index)
{
$wifi = gwmi -class win32_networkadapter | Where-Object { $_.deviceID -eq $id }
if ($wifi)
{
$wifi.enable()
}
}
}
}
else
{
echo \"Pas de carte reseau\"
}
[/code:1]
Il me reste encore un dernier rampart à franchir.
J'ai deux possibilité ( toutes les deux se concluant par un échec cuisant... ) :
1] Déployer en tache planifiée qui lanceront le script de l'event au démarrage. :
J'ai créé la tâche avec les bon droits ( pour l'instant les miens afin d'éviter des problèmes liés aux permissions user.
Les arguments -executionPolicy et -noExit ont été mis.
Cela ne marchant pas, j'ai tenté de passer par un .bat qui lance le powershell, cela ne marche pas non plus.
[code:1]
powershell.exe -file \"c:\scripts\eventLan.ps1\" -noExit
pause
[/code:1]
Dans les deux cas l'event semble passer à la trappe et rien ne passe.
Cependant, si je le lance manuelle à partir d'un shell, la pas de soucis....
2] Faire un seul script et en faire un service ( pour ma part, c'est la solution la plus \"propre\"
J'ai du passer via deux script distinct. L'event gère très bien l'appel d'un autre script qui fait son job mais très mal lorsque l'on lui copie et colle le contenu de ce dernier dans le scriptblock.
Ma théorie après une super journée à chercher :
Certaines carte réseaux sont nulles, lorsque je passe sur un .enable() ou disable(), cela génère des erreurs. ( logique, comment couper ou activer une carte vide.)
Si c'est lancé en dehors d'un scriptblock pas de problème, les erreurs sont affichées mais les cartes sont dans l'état voulu.
Dans le scriptblock c'est une autre histoire, j'ai mis quelques log afin de voir où il s'arrêtait et il le fait à la première carte réseaux...
J'ai tenté d'éviter les carte nulles mais rien n'y fait.
Dans les deux cas je suis cuit, visiblement, la gestion des event dans certains cas n'est pas si évidente.
Si vous avez une solution dans un de mes deux cas je suis preneur et désespéré ...
Bonne soirée @vous et merci pour vos réponses précédentes<br><br>Message édité par: Anoskar, à: 16/06/16 20:56
Connexion ou Créer un compte pour participer à la conversation.
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 9 ans 3 mois #23156
par Steve
Réponse de Steve sur le sujet Re:Surveiller évènement Systeme
Bonsoir bonsoir.
Cela fait un moment maintenant que je souhaitais cloturer ce post mais je voulais vous fournir une solution fonctionnelle.
Actuellement j'ai solutionné les derniers problèmes auxquels je faisais face et ai testé ce script sur +- 1000 machines. Le script fait son job avec de rares problème via connexion VPN.
Voici l'approche qui a été prise :
Une tache planifiée qui lance le script mis en local sur la machine sous l'user \"System\".
Le script est protégé en écriture mais dans la suite de mon apprentissage de padawan, la mise en place d'un certificat verra sans doute le jour ( avec de nouvelles questions sur ce forum
)
La liste des cartes wifi étant connues, j'ai opté pour un tableau les contenant tous. Ce qui ne m'enchante pas du tout. A voir pour une nouvelle MAJ.
Pour le déploiement de la tache planifiée, les GPO ont fait l'affaire. Cependant, un SCCM aurait pu faire remplir le contrat.
NB :
Ce script a été créé pour un environnement assez disparate tant au niveau OS qu'au niveau hardware. Cerise sur le gateau: ces machines ne sont pas toujours connectée au lan de l'entreprise. ( donc on peut un peu oublier les maj powershell par exemple).
Afin de ne pas avoir de conflit avec powershell; j'ai du me brider délibérer sur la version 2.
Si vous possédez une infrastructure plus récente ( ex. : du windows 10, powershell 5), je vous invites à vérifier car de nouvelles cmdlets ont vu le jour niveau réseau. Celles ci vous faciliteront grandement la vie.
Trêve de blabla on veut voir la bête :
[code:1]
<#
.NOTES
===========================================================================
Created with: My brain :«»)
Created on: 23/06/2016 15:10
Created by: Anoskar
Organization: Pour le forum powershell-scripting.com/
Filename: OneNetwork
===========================================================================
.DESCRIPTION
Votre machine est dans votre LAN ? --> la carte wifi sera desactivee. Cette derniere n y est plus ? la carte WIFI se reactive.
#>
#
#Definition des variables
#
#>
#Set-Location C:\Windows\System32\script # Si on schedule et qu'on utilise un fichier externe pour la liste des cartes wifi.
$ErrorActionPreference = 'SilentlyContinue'
$eventName = \"Ecoute LAN filaire\" # Sera tout simplement le nom de mon event, il sera visible via Get-EventSubscriber
$message = \"Pas d'ETH up\"
$path = \"HKCU:\\"
$nA = \"IdEth\"
$nB = \"IdNull\"
$full = $path + $nA
$carteLanConf = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.DNSDomain -match \"myNetwork\"«») -and ($_.description -notmatch \"virtual\"«») }
if ($carteLanConf -eq $null)
{
# Nous avons une carte qui est potentiellement en ip fixe, nous allons la detecter
$carteLanConf = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.ipenabled -eq $true) -and ($_.dhcpEnabled -eq $false) -and ($_.description -notmatch \"virtual\"«») }
}
$id = $carteLanConf | ForEach-Object { $_.index } # recuperation de l id de la carte
#On va verifier si l id n existe pas dans la base de registre, dans ce cas nous pourrons simplement recuperer l id en variable
# sans passer par la case requete.
#si ce n est pas le cas nous allons l y inserer pour plus tard.
if ($id -ne $null)
{
if (Get-Item -path $full) # Si la cle existe déja, on ne touche pas
{
#Set-ItemProperty -path $full -Name index -Value $id
# echo \"id existe dans registry\" >> id.txt
}
else
{
New-Item -Path $path -name $nA # elle n existe pas encore, go la creer
New-ItemProperty -Path HKCU:\IdEth -Name index -PropertyType String -Value $id
# echo \"Creation de lid dans la registry\" + $id >> id.txt
}
}
else
{
if (Get-Item -path $full) # On va rechercher la cle
{
$id = (Get-ItemProperty $full).index # On va lire le contenu de la cle de registre et l utiliser
# echo \"ID reprit via la registry \" >> id.txt
# $id >> id.txt
}
else # On a pas d id, le script apprendra lorsque connecte au lan prov
{
New-Item -Path $path -name $nB # Me servira pour le debug, pas d id de carte.
New-ItemProperty -Path HKCU:\IdNull -Name index -PropertyType String -Value \"EMPTY\"
}
}
$lan = gwmi -class win32_networkAdapter | Where-Object { $_.deviceID -eq $id } # Nous avons notre carte lan, ENFIN :«»)
#$lan.deviceID >> lan.txt
<# ******************************************************
# Requete WQL
# On va checker l'instance de la carte reseau
# qui nous interesse. Ici on s interesse au LAN filaire
# *******************************************************
#>
$query = \"SELECT * FROM __InstanceModificationEvent
WITHIN 3
WHERE TargetInstance ISA 'Win32_NetworkAdapter'
AND TargetInstance.DeviceID = \" + $lan.deviceID +
\"\"
<#
# ********************************************************************************
# Definition de l action qui sera effectuee
# Je prends le status de la carte LAN
# En fonction de ce status ( il me retourne un code NetConnectionStatus de 0 @ 10
# ) --> 2 connecte et 7 --> deconnecte
# En fonction de l etat, nous desactivons ou non toute les carte sauf le LAN
# via l appel du script oneNetwork.ps1
# *********************************************************************************
#>
if ($lan.deviceID -ne $null)
{
#Déclaration du tableau contenant les cartes wifi.
$wireless = @(\"carte 1\",\"carte 2\",\"carte 3\",\"carte 4\",) #ex. : atheros machin truc....
# Je souhaite retrouver une occurence dans ce cas que je vais matcher avec mon tableau de carte wifi
$network = gwmi -class win32_networkadapter
$netw = $network | ForEach-Object { $_.name } # Powershell v2 . Sinon $network.name pour v4 donne le meme resultat
$wirelessHost = Compare-Object $wireless $netw -IncludeEqual | Where-Object { $_.sideIndicator -eq \"==\" } # on ne garde que la/les occurence(s)
$wHost = $wirelessHost | ForEach-Object { $_.InputObject } # powershell v2 si vous n avez pas de chance ...
$myVpnName = $network | Where-Object { ($_.description -match \"myVpnName\"«») }
if ((Test-Connection -Cn 10.20.30.40 -Count 4 -ea 0 -quiet) -and $myVpnName.ipaddress -eq $null)
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.disable()
}
}
else
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.enable()
}
}
<#
# ************************
# On va s abonner @ levenement qui nous interesse a travers la query definie plus haut
# Une fois l'event cree --> j affiche l event afin de definir si tout est ok.
# !!!!!! l event n est valable que POUR LA SESSION PS LANCEE, une fois close --> OVER!!!!!!
# ************************
#>
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action {
#Déclaration du tableau contenant les cartes wifi.
$wireless = @(\"carte 1\",\"carte 2\",\"carte 3\",\"carte 4\",)
$network = gwmi -class win32_networkadapter
$netw = $network | ForEach-Object { $_.name } # Powershell v2 . Sinon $network.name pour v4 donne le meme resultat
$wirelessHost = Compare-Object $wireless $netw -IncludeEqual | Where-Object { $_.sideIndicator -eq \"==\" } # on ne garde que la/les occurence(s)
$wHost = $wirelessHost | ForEach-Object { $_.InputObject } # powershell v2
$myVpnName = $network | Where-Object { ($_.description -match \"myVpnName\"«») }
if ((Test-Connection -Cn 10.20.30.40 -Count 4 -ea 0 -quiet) -and $myVpnName.ipaddress -eq $null)
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.disable()
}
}
else
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.enable()
}
}
}
Get-EventSubscriber
}
else
{
echo \"RIEN\" > nothing.txt #pas bon pas bon pas bon ... oO
}
[/code:1]
Etant débutant, vous verrez sans doute des erreurs ou autres, faites moi en part svp, cela m'aiderait beaucoup à progresser.
Encore merci à ceux qui ont prit le temps de me lire et de répondre. J'espère un jour aider des gens comme vous
Passez une bonne soirée
Cela fait un moment maintenant que je souhaitais cloturer ce post mais je voulais vous fournir une solution fonctionnelle.
Actuellement j'ai solutionné les derniers problèmes auxquels je faisais face et ai testé ce script sur +- 1000 machines. Le script fait son job avec de rares problème via connexion VPN.
Voici l'approche qui a été prise :
Une tache planifiée qui lance le script mis en local sur la machine sous l'user \"System\".
Le script est protégé en écriture mais dans la suite de mon apprentissage de padawan, la mise en place d'un certificat verra sans doute le jour ( avec de nouvelles questions sur ce forum
La liste des cartes wifi étant connues, j'ai opté pour un tableau les contenant tous. Ce qui ne m'enchante pas du tout. A voir pour une nouvelle MAJ.
Pour le déploiement de la tache planifiée, les GPO ont fait l'affaire. Cependant, un SCCM aurait pu faire remplir le contrat.
NB :
Ce script a été créé pour un environnement assez disparate tant au niveau OS qu'au niveau hardware. Cerise sur le gateau: ces machines ne sont pas toujours connectée au lan de l'entreprise. ( donc on peut un peu oublier les maj powershell par exemple).
Afin de ne pas avoir de conflit avec powershell; j'ai du me brider délibérer sur la version 2.
Si vous possédez une infrastructure plus récente ( ex. : du windows 10, powershell 5), je vous invites à vérifier car de nouvelles cmdlets ont vu le jour niveau réseau. Celles ci vous faciliteront grandement la vie.
Trêve de blabla on veut voir la bête :
[code:1]
<#
.NOTES
===========================================================================
Created with: My brain :«»)
Created on: 23/06/2016 15:10
Created by: Anoskar
Organization: Pour le forum powershell-scripting.com/
Filename: OneNetwork
===========================================================================
.DESCRIPTION
Votre machine est dans votre LAN ? --> la carte wifi sera desactivee. Cette derniere n y est plus ? la carte WIFI se reactive.
#>
#
#Definition des variables
#
#>
#Set-Location C:\Windows\System32\script # Si on schedule et qu'on utilise un fichier externe pour la liste des cartes wifi.
$ErrorActionPreference = 'SilentlyContinue'
$eventName = \"Ecoute LAN filaire\" # Sera tout simplement le nom de mon event, il sera visible via Get-EventSubscriber
$message = \"Pas d'ETH up\"
$path = \"HKCU:\\"
$nA = \"IdEth\"
$nB = \"IdNull\"
$full = $path + $nA
$carteLanConf = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.DNSDomain -match \"myNetwork\"«») -and ($_.description -notmatch \"virtual\"«») }
if ($carteLanConf -eq $null)
{
# Nous avons une carte qui est potentiellement en ip fixe, nous allons la detecter
$carteLanConf = gwmi -Class win32_networkAdapterConfiguration | Where-Object { ($_.ipenabled -eq $true) -and ($_.dhcpEnabled -eq $false) -and ($_.description -notmatch \"virtual\"«») }
}
$id = $carteLanConf | ForEach-Object { $_.index } # recuperation de l id de la carte
#On va verifier si l id n existe pas dans la base de registre, dans ce cas nous pourrons simplement recuperer l id en variable
# sans passer par la case requete.
#si ce n est pas le cas nous allons l y inserer pour plus tard.
if ($id -ne $null)
{
if (Get-Item -path $full) # Si la cle existe déja, on ne touche pas
{
#Set-ItemProperty -path $full -Name index -Value $id
# echo \"id existe dans registry\" >> id.txt
}
else
{
New-Item -Path $path -name $nA # elle n existe pas encore, go la creer
New-ItemProperty -Path HKCU:\IdEth -Name index -PropertyType String -Value $id
# echo \"Creation de lid dans la registry\" + $id >> id.txt
}
}
else
{
if (Get-Item -path $full) # On va rechercher la cle
{
$id = (Get-ItemProperty $full).index # On va lire le contenu de la cle de registre et l utiliser
# echo \"ID reprit via la registry \" >> id.txt
# $id >> id.txt
}
else # On a pas d id, le script apprendra lorsque connecte au lan prov
{
New-Item -Path $path -name $nB # Me servira pour le debug, pas d id de carte.
New-ItemProperty -Path HKCU:\IdNull -Name index -PropertyType String -Value \"EMPTY\"
}
}
$lan = gwmi -class win32_networkAdapter | Where-Object { $_.deviceID -eq $id } # Nous avons notre carte lan, ENFIN :«»)
#$lan.deviceID >> lan.txt
<# ******************************************************
# Requete WQL
# On va checker l'instance de la carte reseau
# qui nous interesse. Ici on s interesse au LAN filaire
# *******************************************************
#>
$query = \"SELECT * FROM __InstanceModificationEvent
WITHIN 3
WHERE TargetInstance ISA 'Win32_NetworkAdapter'
AND TargetInstance.DeviceID = \" + $lan.deviceID +
\"\"
<#
# ********************************************************************************
# Definition de l action qui sera effectuee
# Je prends le status de la carte LAN
# En fonction de ce status ( il me retourne un code NetConnectionStatus de 0 @ 10
# ) --> 2 connecte et 7 --> deconnecte
# En fonction de l etat, nous desactivons ou non toute les carte sauf le LAN
# via l appel du script oneNetwork.ps1
# *********************************************************************************
#>
if ($lan.deviceID -ne $null)
{
#Déclaration du tableau contenant les cartes wifi.
$wireless = @(\"carte 1\",\"carte 2\",\"carte 3\",\"carte 4\",) #ex. : atheros machin truc....
# Je souhaite retrouver une occurence dans ce cas que je vais matcher avec mon tableau de carte wifi
$network = gwmi -class win32_networkadapter
$netw = $network | ForEach-Object { $_.name } # Powershell v2 . Sinon $network.name pour v4 donne le meme resultat
$wirelessHost = Compare-Object $wireless $netw -IncludeEqual | Where-Object { $_.sideIndicator -eq \"==\" } # on ne garde que la/les occurence(s)
$wHost = $wirelessHost | ForEach-Object { $_.InputObject } # powershell v2 si vous n avez pas de chance ...
$myVpnName = $network | Where-Object { ($_.description -match \"myVpnName\"«») }
if ((Test-Connection -Cn 10.20.30.40 -Count 4 -ea 0 -quiet) -and $myVpnName.ipaddress -eq $null)
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.disable()
}
}
else
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.enable()
}
}
<#
# ************************
# On va s abonner @ levenement qui nous interesse a travers la query definie plus haut
# Une fois l'event cree --> j affiche l event afin de definir si tout est ok.
# !!!!!! l event n est valable que POUR LA SESSION PS LANCEE, une fois close --> OVER!!!!!!
# ************************
#>
Register-WmiEvent -Query $query -SourceIdentifier $eventName -Action {
#Déclaration du tableau contenant les cartes wifi.
$wireless = @(\"carte 1\",\"carte 2\",\"carte 3\",\"carte 4\",)
$network = gwmi -class win32_networkadapter
$netw = $network | ForEach-Object { $_.name } # Powershell v2 . Sinon $network.name pour v4 donne le meme resultat
$wirelessHost = Compare-Object $wireless $netw -IncludeEqual | Where-Object { $_.sideIndicator -eq \"==\" } # on ne garde que la/les occurence(s)
$wHost = $wirelessHost | ForEach-Object { $_.InputObject } # powershell v2
$myVpnName = $network | Where-Object { ($_.description -match \"myVpnName\"«») }
if ((Test-Connection -Cn 10.20.30.40 -Count 4 -ea 0 -quiet) -and $myVpnName.ipaddress -eq $null)
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.disable()
}
}
else
{
foreach ($w in $wHost)
{
$wifi = gwmi -class win32_networkAdapter | Where-Object { ($_.Name -eq $w) }
$wifi.enable()
}
}
}
Get-EventSubscriber
}
else
{
echo \"RIEN\" > nothing.txt #pas bon pas bon pas bon ... oO
}
[/code:1]
Etant débutant, vous verrez sans doute des erreurs ou autres, faites moi en part svp, cela m'aiderait beaucoup à progresser.
Encore merci à ceux qui ont prit le temps de me lire et de répondre. J'espère un jour aider des gens comme vous
Passez une bonne soirée
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 9 ans 3 mois #23161
par Philippe
Réponse de Philippe sur le sujet Re:Surveiller évènement Systeme
merci de ton retour sur ce sujet

il y a plusieurs demande sur le sujet ces jours ci
il y a plusieurs demande sur le sujet ces jours ci
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.041 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Surveiller évènement Systeme