Lecture et interprétation des données d'un processus
-
dimanche 23 décembre 2012 09:22
Bonjour,
Je suis actuellement en train de coder un logiciel qui me permettra de lancer Bitlocker sur des potes à distance via le réseau.
Pour ce faire je doit simplement lancer un processus cmd.exe et y injecter des commandes dos, c'est assez simple à faire mais là ou cela se complique c'est quand je veut utiliser les données de sortie du processus et les utiliser afin de créer des boucles et autres trucs.
Ce que j'aimerais faire pour l'instant c'est réussir à faire un bout de code qui va lancer une requête ping via mon processus cmd.exe et si le ping réussi lancer une seconde commande, si le ping ne réussi pas je recommence jusqu'à que cela fonctionne.
Le code que j'utilise actuellement pour lancer le processus en tâche de fond est le suivant :Public Class Form1 Dim P As New Process Dim SW As System.IO.StreamWriter Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load P = New Process AddHandler P.OutputDataReceived, AddressOf DisplayOutput AddHandler P.ErrorDataReceived, AddressOf DisplayOutput P.StartInfo.CreateNoWindow() = True P.StartInfo.UseShellExecute = False P.StartInfo.RedirectStandardInput = True P.StartInfo.RedirectStandardOutput = True P.StartInfo.RedirectStandardError = True P.StartInfo.StandardOutputEncoding = System.Text.Encoding.GetEncoding(850) P.StartInfo.FileName = "cmd.exe" P.StartInfo.WorkingDirectory = "C:\Windows\System32" P.Start() P.SynchronizingObject = TextBox1 P.BeginOutputReadLine() P.BeginErrorReadLine() SW = P.StandardInput SW.WriteLine() End Sub Private Sub DisplayOutput(ByVal sendingProcess As Object, ByVal output As DataReceivedEventArgs) TextBox1.AppendText(output.Data() & vbCrLf) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click SW.WriteLine("ping " & TextBox2.Text) End Sub End Class
La TextBox1 est une fenêtre qui m'affiche la fenêtre cmd.exe afin de vérifier les commandes injectées et les erreurs (c'est juste pour les essais, cette fenêtre est menée à disparaître dans le futur)
La TextBox2 est un champ dans lequel j'entre l'adresse IP du poste que je souhaite "pinger/bitlocker".
Merci d'avance pour vos réponses.
Jihem_B- Type modifié Aurel BeraMicrosoft Contingent Staff, Owner mercredi 9 janvier 2013 11:52 Discussion
Toutes les réponses
-
lundi 7 janvier 2013 09:02Propriétaire
Bonjour
Pourquoi exécuter CMD et pas directement ping ?
Si vous voulez rester avec CMD vous devez exécuter « cmd /C "ping ip_ordi"»
Et maintenant une problème :
Pour exécuter le Ping, vous exécutes une commande sur le poste local.
Pour démarrer bitlocker, si j’ai bien compris, vous devez démarrer un processus sur un autre ordi. Et ça c’est un peu plus difficile. Vous devez utiliser WMI, comme décrit ici :
http://windows.microsoft.com/fr-fr/windows-vista/How-do-I-enable-BitLocker-Drive-Encryption-remotely
Cordialement,
Bonjour
-
mercredi 9 janvier 2013 11:52Propriétaire
Bonjour,
Merci pour tenir la communauté informée sur la suite de vos démarches.
Bonne journée,
-
jeudi 10 janvier 2013 10:41
Bonjour,
donc j'avance dans la réalisation de mon programme, j'ai résolu quelques problèmes mais j'en ai d'autres qui se confrontent à moi.
En ce qui concerne les requêtes ping je passe directement par la commande :
My.Computer.Network.Ping(IP.Text)
Ce qui me permet de l'intégrer dans une petite boucle qui me permet de vérifier si le poste distant est joignable avant de lancer les commandes à distance de Bitlocker :
'Boucle de Ping Do Until My.Computer.Network.Ping(IP.Text) LoopUn autre problème se confronte maintenant à moi, je doit envoyer des commandes dos vers le poste distant pour lancer Bitlocker à distance, par exemple pour connaitre le status du chiffrement d'un poste je doit envoyer comme commande :
"%windir%\sysnative\manage-bde.exe -cn " & IP.Text & " -status"
ça je sais faire en envoyant la commande dans mon processus cmd que j'ai lancé auparavant avec la commande
SW.WriteLine("%windir%\sysnative\manage-bde.exe -cn " & IP.Text & " -status")en utilisant le StreamWriter, le problème c'est que je ne sais pas comment faire pour lire les résultats que me sortent ces commandes, je sais les afficher dans une textbox mais je ne sais pas les utiliser afin de faire du contrôle d'erreur par exemple.
Avez vous des idées ?
Merci d'avance
-
jeudi 10 janvier 2013 12:16Propriétaire
Bonjour
J’ai testée et même l’erreur n’est pas envoyée vers le stream d’erreur, mais vers le stream normale.
Donc, dans ce cas, la seule solution que je vois c’est c’est de vérifier si le Output Stream contient le mot ERROR
Donc j’ai modifiée
Private Sub DisplayOutput(ByVal sendingProcess As Object, ByVal output As DataReceivedEventArgs)
If (output.Data().Contains("ERROR")) Then
MessageBox.Show("Error!!!")
End If
TextBox1.AppendText(output.Data() & vbCrLf)
End Sub
Mais attention, le texte sera reçu ligne par linge. Une seule ligne va contenir « ERROR » donc, sera plus complique de traiter ça.
De l’autre cote, si vous exécutez directement
P.StartInfo.FileName = "%windir%\sysnative\manage-bde.exe -cn " & "10.165.xxx.xxx" & " -status"
A la fin d’exécution vous pouvez recevoir tout le message et traiter le cas d’erreur.
Cordialement,
-
jeudi 10 janvier 2013 12:56
Merci beaucoup, je peux maintenant faire du contrôle d'erreur sur les résultats de mes commandes.
J'ai encore un petit soucis, la version finale de mon programme exécuteras tout seul le programme Bitlocker à distance et j'ai besoin de faire des pauses entre certaines commandes (par exemple faire une pause en attendant qu'un ordinateur redémarre)
J'ai trouvé la commande "Sleep" mais elle me bloque entièrement tout le programme et ça ne m'arrange pas du tout, existe-t-il une alternative a "Sleep" ou peut être il faut faire autre chose pour ne pas bloquer le programme.
Merci d'avance.
-
vendredi 1 février 2013 11:40Propriétaire
Continue ici:
http://social.msdn.microsoft.com/Forums/fr-FR/vstudiofr/thread/0205dcd6-9967-4131-ba74-505e8aeb0a60
Cordialement,

