Teamviewer Taskkill

Ich bin mir nicht sicher, ob das lizenztechnisch erlaubt ist, was ich hier vorschlage. Gerade der Punkt mit dem Nachladen des Teamviewer-Prozesses. Bitte überprüft dies selbstständig, dieser Artikel ist nur Education.
Ebenfalls benötigen wir für das hier Admin-Rechte.

Man möchte mit einem Kunden eine Fernwartung über TeamViewer starten. Der Kunde lädt den QuickSupport von der eigenen Webseite herunter. Aber es läuft schon ein TeamViewer. Klar bekommt man den Kunden dazu, im Tray Rechtsklick auf das TeamViewer-Symbol zu machen („dann ist dort ein Pfeil nach oben, den noch mal klicken, und gucken, ob das Symbol da ist“) und es zu schließen („nein, da müsste ‚Teamviewer Beenden‘ ganz unten sein“), allerdings frisst das auch jedes mal ordentlich Zeit. Ideallösung wäre natürlich, wenn man einen Wrapper um den QuickSupport bastelt, der erst vorhandene TeamViewer-Prozesse abschließt, und dann erst den eigenen TeamViewer startet.

Batch

Hinweis zu diesem Code: hier senden wir erst freundlich den Hinweis, dass TeamViewer sich bitte schließen mag (SIGTERM). Im Anschluss warten wir drei Sekunden (Ping-Befehl, Batch kann das nicht wirklich zuverlässig) und killen ihn dann explizit. Alternativ gehen auch nur die letzten zwei Zeilen, aber das ist rude, das macht man i.d.R. nicht.

@taskkill /IM teamviewer.exe
@taskkill /IM teamviewer_service.exe

@ping -n 3 localhost

@taskkill /F /IM teamviewer.exe
@taskkill /F /IM teamviewer_service.exe

Bonus-Info: wollen wir keine Ausgabe in der CMD, können wir an jede Zeile 2> null anhängen.

C#

Hinweis: benötigtes Packet ist in System.Diagnostics. Ein SIGTERM ist hier (ohne Umwege, z.B. Invoken von taskkill in der CMD) nicht möglich, daher geht nur der unschöne Weg, direkt SIGKILL.

// In dieser Variable merken wir uns die Prozesse, die wir killen wollen
List<Process> toKill = new List<Process>();
// Auslesen aller Prozesse
Process[] allProcess = Process.GetProcesses();
for(int i = 0; i < allProcess.length; i++) {
	if(allProcess[i].ProcessName == 'teamviewer') toKill.Add(allProcess[i]);
	if(allProcess[i].ProcessName == 'teamviewer_service') toKill.Add(allProcess[i]);
}
// Killen der beiden Teamviewer-Prozesse. Das "true" killt auch ChildProcesses
for(Process s in allProcess) s.Kill(true);

Powershell

Hier gilt bzgl. SIGTERM und SIGKILL das gleiche wie für C# – nur SIGKILL ist möglich, wenn man nicht über taskkill geht. Das -Force ermöglicht es, den Prozess zu beenden, wenn er unter einem anderen User läuft; zum Beispiel dem lokalen Dienstkonto.

Get-Process -Name "teamviewer" | Stop-Process -Force
Get-Process -Name "teamviewer_service" | Stop-Process -Force

Kategorien: Batch, C#, Powershell

tino-ruge.de wird tino-kuptz.de

Im Laufe des Jahres 2024 wird dieser Blog umziehen. Alle Inhalte werden 1:1 weitergeleitet, nix geht verloren. Neue Domain, alter Autor, alter Inhalt.