2016-07-07 5 views
0

Irgendwann muss ich die Ereignisse von msiexec Prozessstart und seine Fertigstellung abfangen. Mein Code arbeitet mit den üblichen Benutzerberechtigungen. Der Prozess msiexec wird von Windows mit Systemprivilegien gestartet, daher kann ich Refresh() nicht ausführen und die HasExited Eigenschaft dieses Prozesses überprüfen.Warum der Process.GetProcessesByName ("msiexec") falsches Ergebnis zeigt?

while (true) { 
    Process[] msi = Process 
     .GetProcessesByName("msiexec"); 

    if (msi.Length > 0) break; 
} 

// The `msiexec` is launched. Now to wait its finishing... 

while (true) { 
    Process[] msi = Process 
     .GetProcessesByName("msiexec"); 

    if (msi.Length == 0) break; // Here is `false` always! 
} 

// Components was installed. 

Aber zweite while Schleife zeigt immer msi.Length == 1 auch nach msiexec abgeschlossen sein wird. Warum passiert das? Wie kann ich es lösen?

+0

Also schauen Sie in allen Systemprozessen und es gibt * NO * msiexec Prozesse laufen? Du bist dir 100% sicher? Wenn ja, dann haben Sie gerade einen Fehler in .NET gefunden. – aquinas

+0

Anstatt eine Schleife zu verwenden, können Sie nicht einfach die 'WaitForExit()' Methode aufrufen, nachdem Sie den Prozess gefunden haben? –

+0

@ChrisDunaway, nein, es funktioniert nicht. Ich habe es versucht, bevor ich dieses Thema erstellt habe. Das Problem ist, dass 'msiexec' mit Systemrechten arbeitet. –

Antwort

0

Beachten Sie, dass mehrere Prozesse mit demselben Namen gleichzeitig ausgeführt werden können. So kann msi.Length> 1 sein. Es könnte auch> 0 sein, bevor Sie msiexec starten. Wenn Sie den msiexec-Prozess gefunden haben, statt GetProcessesByName erneut aufzurufen, können Sie die HasExited-Eigenschaft des Prozesses testen.

Wenn msi.Length war> 1 ist, dann warten, bis die Anzahl der nicht verlassen Prozesse sinkt um 1.

+0

Nein, kann ich nicht. Ich habe die Ausnahme mit der Meldung über Ich habe keine notwendigen Rechte um den 'HasExited' Wert zu bekommen. Windows kann nicht mehrere Anwendungen gleichzeitig installieren. Deshalb wird 'msiexec' immer eins sein (meiner Meinung nach). –

+1

Ich habe bereits Setups gesehen, die Child-Setups gestartet haben, was zu mehr als einem msiexec im Task-Manager geführt hat. Siehe (zufälliges Bild, das mehrere msiexecs zeigt): https://williamsitblog.files.wordpress.com/2015/12/image3.png –

+0

Stellen Sie auch sicher, dass Ihre App in 64 Bit läuft. Ein 64-Bit-Prozess kann auf einen 32-Prozess zugreifen, aber nicht umgekehrt: Informationen finden Sie hier: https://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx (zweite Anmerkung). Außerdem benötigen Sie eine vollständige Vertrauenswürdigkeit (3. Hinweis in demselben Link). –