Question
[Surveillance] Evénements Windows
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- TimCruz
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
J'ai toujours, malgré tout, un problème. Voici en préambule mon code :
[code:1]$Computer =\"MONSERVEUR\"
$query = New-Object System.Management.WQleventquery \"SELECT * FROM __InstanceCreationEvent
WITHIN 600
WHERE TargetInstance ISA 'Win32_NTLogEvent'
AND TargetInstance.EventCode= '540'\"
$Scope = new-object System.Management.ManagementScope(\"\\$Computer\root\cimv2\"«»)
$watcher = New-Object System.Management.ManagementEventWatcher $scope,$query
$watcher.PSbase.Scope.Options.EnablePrivileges = $true
$watcher.start()
$compteur=0
$info
while ($true)
{
$event = $watcher.WaitForNextEvent()
If ($event -ne $null)
{
$info=$info+\"`n`n $($event.TargetInstance.Message) `n`n\"
$compteur=$compteur+1
If ($compteur -ge '15')
{
$expediteur = 'ADDRESSEMAIL'
$destinataire = 'ADDRESSEMAIL'
$serveur = 'MONSERVEUREXCHANGE'
$objet = 'ALERTE JOURNAL EVENEMENT ' + [System.DateTime]::Now
$texte = \"Nouvel evenement Server Administrator dans le journal de log Ms Windows `n`n $info\"
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$client = new-object System.Net.Mail.SmtpClient $serveur
$client.Credentials = [System.Net.CredentialCache]::«»DefaultNetworkCredentials
$client.Send($message)
$info=\"\"
$compteur=0
}
}
}
[/code:1]
L'objectif est de rassembler par paquet de 15 les alertes de Server Administrator (service de surveillance matériel de DELL) dans l'observateur d'événement et de me les envoyer par mail. Le script s'exécute sans encombres mais les mails ne partent pas. Par contre, quand j'arrête le script, mes mails me sont tous envoyés d'un coup!
Pourtant si au lieu de l'envoie de mail dans ma boucle je mets par ex. un write-host \"toto\" mon shell va bien m'indiquer \"toto\". Sauriez vous me dire pourquoi?
Merci d'avance.
\\"Il n\'y a pas de problème, il n\'y a que des solutions\\"
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
TimCruz écrit:
Je pencherais pour un pb de blocage de thread, mais j'ai peu d'éléments à faire valoir :Sauriez vous me dire pourquoi?
C'est à dire, enfin je suppose, qu'en fin d'exécution le mail a bien été remis au serveur.Cette méthode bloque l'exécution pendant la transmission du message électronique.
1-Vérifie si le message est bien présent sur le serveur.
2-Envoi le mail avec les infos telles qu'elles sont dans ton dernier message, c'est à dire avec des valeurs erronées pour le send, dans ce cas tu devrais avoir une exception.
3-En test, place un sleep 1 juste après le send.
Sinon il y a l'envoi en asynchrone , mais je ne suis pas sûr que ce soit judicieux. De plus on ne connait pas la source du pb existant.
Je pensais également à un verrouillage de ressource(s) mais je ne vois pas laquelle.
Je suppose que ce traitement, en commentant la boucle While, fonctionne correctement ?
Avec quelles versions de PS ce script doit fonctionner ? v1 ? v1+V2? v2 uniquement ?
Pas facile à debugger ton problème
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- TimCruz
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
Voici le script fini, si vous avez des commentaires (comme je suis débutant) je suis preneur.
[code:1]#On se connecte à la WMI de $computer pour analyser l'observateur d'événements
$Computer =\".\"
$query = New-Object System.Management.WQleventquery \"SELECT * FROM __InstanceCreationEvent
WITHIN 600
WHERE TargetInstance ISA 'Win32_NTLogEvent'
AND TargetInstance.SourceName= 'Server Administrator'\"
$Scope = new-object System.Management.ManagementScope(\"\\$Computer\root\cimv2\"«»)
$watcher = New-Object System.Management.ManagementEventWatcher $scope,$query
$watcher.PSbase.Scope.Options.EnablePrivileges = $true
$watcher.start() #ouverture de la connexion / du watcher
$compteur=0 #On initialise le compteur pour calculer le nombre d'entrées dans le log d'événements
$info
while ($true)
{
$event = $watcher.WaitForNextEvent()
If ($event -ne $null) #La boucle ne se déclanche que s'il y a des événements
{
#remplissage des fichiers tampons et compteur pour log et contenu du mail
$info=$info+\"`n`n $($event.TargetInstance.Message) `n`n\"
$compteur=$compteur+1
If ($compteur -ge '15') #On envoie un mail d'alerte avec les événements du journal quand un lot de 15 éxiste
{
$expediteur = 'ADRESSEMAIL'
$destinataire = 'ADRESSEMAIL'
$serveur = 'SERVEUREXCHANGE'
$dateev=[System.DateTime]::Now
$objet = \"[$(get-wmiobject win32_computersystem).name] ALERTE JOURNAL EVENEMENT $dateev\"
$texte = \"Nouvelle(s) entrée(s) Server Administrator dans le journal de log Ms Windows `n`n $info\"
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$client = new-object System.Net.Mail.SmtpClient $serveur
$client.Credentials = [System.Net.CredentialCache]::«»DefaultNetworkCredentials
$client.Send($message)
#Réinitialisation des variables de compteur, de date et de contenu de mail après chaque envoie de mail
$info=\"\"
$compteur=0
$event=$null
}
}
}
[/code:1]<br><br>Message édité par: TimCruz, à: 25/01/10 16:55
\\"Il n\'y a pas de problème, il n\'y a que des solutions\\"
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Merci, j'ai testé ton code sur mon poste, mais je n'ai pas rencontré ce pb.J'ai préféré attendre quelques jours et rebooot pour m'en assurer avant de te répondre.
TimCruz écrit:
PourVoici le script fini, si vous avez des commentaires
[code:1]$info[/code:1]
Il n'en manque pas un bout $Info=\"\" ?
Pour les adresses m'est avis qu'il mieux les modifier dans le post précédent, afin d'éviter les robots de spam.
[code:1]$compteur=$compteur+1[/code:1]
faire
[code:1]$compteur++[/code:1]
C'est pareil, mais il y a moins de saisie.
[code:1]
If ($compteur -ge '15')
[/code:1]
ça c'est comme l'ammoniac, \"ça pique les yeux\".
C'est LE truc à éviter. Soit tu manipules un entier soit une chaîne de caractères, la confusion se situe dans le choix du type de la valeur à tester.
A priori la notion de compteur référence un entier, ceci est donc préférable :
[code:1]
If ($compteur -ge 15)
[/code:1]
Ainsi tu évites des conversions de type inutiles, dans ton cas cela ne change pas grand chose, mais ce n'est pas une raison pour le faire
Le pb se situe à la relecture, car du coup on ne sait pas trop ce que $compteur référence, ni quel est le rôle de cette conversion.
C'est tout à fait possible de procéder ainsi, MAIS dans ce cas il faut le documenter, sinon c'est un peu comme dans le film Alien, « dans l'openspace, tout le monde vous entendra crier »
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- TimCruz
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
Merci beaucoup de tes conseils et désolé de la douleur que je t'ai infligé aux noeils!!ça c'est comme l'ammoniac, \"ça pique les yeux\".
Pour les adresses m'est avis qu'il mieux les modifier dans le post précédent, afin d'éviter les robots de spam.
Encore une fois Laurent, je te tire mon chapeau, tu réponds toujours vite et bien à mes demandes, c'est un plaisir de bénéficier de ton aide!!
\\"Il n\'y a pas de problème, il n\'y a que des solutions\\"
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Surveillance] Evénements Windows