Comment détecter en temps réel le statut d’une connexion réseau et y associer une tache?
Il peut arriver que l’on ai besoin de détecter le statut d’une connexion réseau d’une station de travail ou d’un serveur et d’y appliquer une tâche particulière en fonction de son état. |
Imaginez que vous décidiez de fournir une alternative à une perte de connexion momentanée en redirigeant les informations, stockées à l’origine sur le réseaux, localement sur le poste et que lors du retour de la dite connexion, vous décidiez de synchroniser votre cache local avec le réseaux.
Pour pouvoir réaliser cela, vous avez besoin d’un système de détection qui effectue son job en temps réel.
Bien entendu, il existe des solutions commerciales répondant à cette problématique, mais elles deviennent obsolète tellement les possibilités actuelles vous permettent d’en créer une très facilement.
Je vais vous présenter 2 approches très différentes pour y arriver:
- La première est uniquement orientée Windows Vista/7 et se base sur le Task Scheduler et l’Event Viewer. L’avantage de cette solution est qu’elle ne requiert aucune connaissance en développement.
- La seconde se base sur PowerShell v2 et fonctionne de Windows XP à 7. Au contraire de la première, quelques bases de programmations sont requises.
A. EventViewer + TaskScheduler (Windows Vista/7)
Pour cette première solution, nous allons nous baser sur la capacité de créer des triggers sur des événements présent dans l’Event Viewer.
Ces triggers seront les déclencheurs d’une tache présente dans le TaskScheduler.
– Pour ce faire, démarrez l’EventViewer
– Allez dans Application and Services Logs/Microsoft/Windows
– Positionnez vous dans NetworkProfile/Operationnal
Dans cette section, vous allez trouver quelques événements fort utiles qui nous serviront de triggers :
Event ID 10000 (Connecté)
Event ID 10000 (Connecté mais en tentative d’identification)
Event ID 10001 (déconnecté)
– Sélectionnez l’événement qui vous intéresse, dans notre cas ce sera l’événement 1000.
– Dans le panel de droite de la console MMC, sélectionnez Attach Task to this Event…
– Indiquez une déscription et cliquez sur Next
– Cliquez sur Next
– A ce stade, vous allez pouvoir choisir entre:
- Démarrer un programme ou un script (vbs, powershell, batch, …)
- Envoyer un mail
- Afficher un message
– Dans notre cas, nous afficherons simplement un message pour une question de simplicité. Sélectionnez donc Display a message.
– Indiquez le texte qui sera affiché dans votre message et cliquez sur Next
– Cliquez sur Next
– Cliquez sur Finish
Répétez ces opérations pour chaque événements décrits plus haut pour avoir une détection en temps réel de votre connexion réseaux.
D’autres sections peuvent également être utilisées comme la section relative au DHCP.
B. PowerShell
L’avantage de PowerShell est qu’il fonctionne également sous Windows XP, et donc, contrairement à la première solution, ici vous n’êtes pas limité aux derniers OS de Microsoft.
Nous allons nous baser sur les socles suivants pour construire notre script:
- WMI et plus précisément la Class Win32_NetworkAdapter avec sa propriété NetConnectionStatus
- Les abonnements aux Event en PowerShell v2
La class Win32_NetworkAdapter est intéressante car elle retourne un tableau contenant toutes les cartes de communications qui sont présentent sur le poste client. Pour identifier celle qui vous intéresse, utiliser ce petit script et retenez le DeviceID:
Maintenant que vous avez identifier l’id de la carte qui vous intéresse, il ne reste plus qu’à créer notre script de surveillance.
Dans un premier temps, nous allons avoir besoin d’interroger WMI en écrivant une query WQL:
WITHIN 3
WHERE TargetInstance ISA 'Win32_NetworkAdapter'
AND TargetInstance.DeviceID = 2
AND TargetInstance.NetConnectionStatus >= 0
Cette query WQL nous retourne les événements attachés la class Win32_NetworkAdapter qui sont lié à un DeviceID et à son état de connexion.
Les événements retournés sont du type __InstanceModificationEvent.
L’étape suivante consiste à nous abonner aux événements WMI grâce à la cmdlet: Register-WmiEvent
- Query: Reprend notre query WMI
- SourceIdentifier: Nom que l’on donne à l’abonnement. Il doit être unique pour la session active.
- Action: Spécifie un bloque de commandes qui seront exécutées dès qu’un événement WMI sera levé .
Le résultat de cette commande est la création d’un abonnement qui tournera en arrière plan qui agira dès qu’un événement du type définit dans notre query WMI se présentera.
Pour voir l’ensemble des abonnement, utilisez la cmdlet suivante: Get-EventSubscriber
Voici un exemple complet:
#
# NAME: PS_ConnEvtH
#
# AUTHOR: Malfroidt Olivier
# DATE: 14/06/2010
# Version: 1.0
# COMMENT: Create an event handler based on the network connection state
#
# ======================================================================
# ************************
# Variables
# ************************
$oNetId = $args[0]
$oMsgEvt = $args[1]
# ************************
# Help
# ***********************
Function HelpMsg(){
$message = @'
PS_ConnEvtH - v1.0
Usage:
PS_ConnEvtH [nicId] [jobName]
Option:
nicId: Specify the NIC id you would like to track
jobName: Specify a name for the Register Event
'@
Write-Host $message
}
# ************************
# WQL Query Definition
# ************************
$query = "SELECT * FROM __InstanceModificationEvent
WITHIN 3
WHERE TargetInstance ISA 'Win32_NetworkAdapter'
AND TargetInstance.DeviceID = " + $oNetId +
"AND TargetInstance.NetConnectionStatus >= 0"
# ************************
# Action Definition
# ************************
$action = {
#$e = $Event.SourceEventArgs.NewEvent
#$value = $e.NetConnectionStatus
$vConn = ($(Get-WmiObject Win32_NetworkAdapter) | Where-Object {$_.DeviceID -eq $oNetId}).NetConnectionStatus
switch ($vConn)
{
0 {Write-Host 'Disconnected' -ForegroundColor Green}
1 {Write-Host 'Connecting' -ForegroundColor Green}
2 {Write-Host 'Connected' -ForegroundColor Green}
3 {Write-Host 'Disconnecting' -ForegroundColor Green}
4 {Write-Host 'Hardware not present' -ForegroundColor Green}
5 {Write-Host 'Hardware disable' -ForegroundColor Green}
6 {Write-Host 'Hardware malfunction' -ForegroundColor Green}
7 {Write-Host 'Media disconnected' -ForegroundColor Green}
8 {Write-Host 'Authenticating' -ForegroundColor Green}
9 {Write-Host 'Authentication succeeded' -ForegroundColor Green}
10 {Write-Host 'Authentication failed' -ForegroundColor Green}
11 {Write-Host 'Invalid address' -ForegroundColor Green}
12 {Write-Host 'Credentials required' -ForegroundColor Green}
}
#Write-Host "connection states changed: $value $vConn"
}
# ************************
# Main
# ************************
if ($args.count -eq 2){
Register-WmiEvent -Query $query -SourceIdentifier $oMsgEvt -Action $action
}else{
HelpMsg
}
Enjoy !!!!