Wie kann ich einen bestimmten Thread in Windows beenden?

4954
Anixx

Der Prozess explorer.exe hat einen Thread mit "Startadresse", der mit "windows.immersiveshell.serviceprovider.dll" beginnt. Das kostet viel Rechenleistung. Außerdem werden nach dem Aufwachen drei Fenster der Klasse "MetroGhostWindow" erzeugt, die im Dialogfeld Alt + Tab ausgeführt werden.

Den Thread mit Process Hacker zu töten funktioniert hervorragend und setzt Ressourcen frei. Aber gibt es ein Kommandozeilen-Tool, um dasselbe zu tun?

1
Sie können leicht eine kleine Anwendung erstellen, die von einer Befehlszeile aus aufgerufen werden kann. Sie müssen lediglich ein Argument aufrufen und die Funktion [TerminateThread] aufrufen (https://msdn.microsoft.com/de-de/library/windows) /desktop/ms686717(v=vs.85).aspx). Ramhound vor 8 Jahren 0
@ Ramhound Ich weiß nicht, wie es geht. Es muss auch als Argument die Teilzeichenfolge des Einstiegspunktnamens anstelle von TID erhalten. PS Warum ist das Downvote? Es ist keine Programmierseite, oder? Anixx vor 8 Jahren 0
Wenn Sie diese Funktion nutzen möchten, lernen Sie, wie Sie dies tun. Das Problem mit der von mir bereitgestellten Funktion besteht darin, dass sie einen Thread für den Thread benötigt. Es ist besser, den Prozess zu beenden, zu dem der Thread gehört, viel einfacher, als zu versuchen, den Handle zu einem Thread für eine Anwendung zu bekommen, die bereits ausgeführt wird. Das letzte Mal habe ich überprüft, dass das Abstimmen ** annymous ** ist. Ich bin schockiert, dass sie die Möglichkeit geben, den Abstimmungsverlauf einer Frage an neue Benutzer zu sehen. Ramhound vor 8 Jahren 0
Sie möchten eine kleine Befehlskonsolenanwendung oder zumindest ein [Powershell-Skript] schreiben. (Https://technet.microsoft.com/de-de/library/ee177004.aspx?f=255&MSPPError=- 2147217396) Ramhound vor 8 Jahren 0
@Ramhound "Es ist besser, wenn Sie den Prozess beenden, zu dem der Thread gehört" - unmöglich, es ist Explorer.exe, wie in der Frage erwähnt. Beim Neustart des Explorers wird der Thread neu erstellt. "Für das, was Sie möchten, müssen Sie eine kleine Befehlskonsolenanwendung oder zumindest ein Powershell-Skript schreiben." - Ich kenne die PowerShell-Sprache nicht. Wenn jemand eine Lösung anbieten kann, wäre das großartig. Wenn bereits ein ähnliches Dienstprogramm vorhanden ist, wäre es auch großartig. Anixx vor 8 Jahren 0
Ihre Anfrage ist für den Superuser ausgeschlossen. Wir können Ihnen helfen **, Ihr Ziel zu erreichen, wir werden das Skript oder das Programm nicht für Sie schreiben, Ihre Anfrage für uns, das Skript für Sie zu schreiben, ist nicht zumutbar. [Handle v4.0] (https://technet.microsoft.com/en-us/sysinternals/handle) scheint das zu tun, was Sie möchten. Ramhound vor 8 Jahren 0
Sysinternals '[pslist] (https://technet.microsoft.com/de-de/sysinternals/bb896649) zeigt die Threads in einem Programm an, aber die Liste ermöglicht es Ihnen nicht, den problematischen Thread leicht zu identifizieren. Ich würde empfehlen, den Thread auszusetzen, anstatt ihn zu töten, obwohl ich für beide keine Befehlszeilenprogramme gefunden habe. Ich hätte vorgeschlagen, es zu deaktivieren, aber siehe [diese Empfehlung] (http://www.fileinspect.com/fileinfo/windows.immersiveshell.serviceprovider-dll/). Sie können die Auswirkungen von beidem mit [procexp] (https://technet.microsoft.com/en-us/sysinternals/bb896653) ausprobieren. Versuchen Sie dies, bevor Sie fortfahren. AFH vor 8 Jahren 0
@Ramhound Ich dachte, dafür gibt es ein Kommandozeilen-Dienstprogramm, da Process Hacker dies tun kann. Anixx vor 8 Jahren 0
Process Explroer kann das, weil jemand es geschrieben hat. Was Sie wollen, ist möglich, aber es existiert möglicherweise nicht, so dass Sie es einfacher selbst machen können. Sie sollten also erst einmal erforschen, wie es geht, damit Sie dieses Programm schreiben und dieses Problem für Millionen von Menschen lösen können. Ramhound vor 8 Jahren 0
@AFH Wie gesagt, ich habe es schon mit Process Hacker gemacht (ein anderer Name für Process Explorer). Es läuft gut. Anixx vor 8 Jahren 0
@Ramhound Nun, ich bezeichne Process Hacker kann einen Thread durch die Thread-ID beenden: https://wj32.org/processhacker/forums/viewtopic.php?t=75 Die Frage ist, wie man den Namen des Einstiegspunkts erhält. Anixx vor 8 Jahren 0
@Anixx - Sie sollten herausfinden, welche Einstiegspunkte für diese DLL vorhanden sind. Basierend auf diesem Wissen können Sie jeden ausprobieren, bis Sie das gewünschte Ergebnis erhalten. Ramhound vor 8 Jahren 0
@Ramhound Ich kenne die Startadresse als Teilstring. Wie erhalte ich die TID über die Befehlszeile? Anixx vor 8 Jahren 0
Ich habe Ihnen einen hervorragenden Vorschlag gemacht, wie Sie das bestimmen können. Ramhound vor 8 Jahren 0
@Ramhound wo? Die TID ist bei jedem Neustart des Prozesses unterschiedlich. Anixx vor 8 Jahren 0
Analysieren Sie besser, was der Thread tut, anstatt ihn zu töten. Teilen Sie eine WPR-Kurve, damit ich Ihnen sagen kann, was sie tut. Installieren Sie das WPT (Teil des Win10-SDK: https://dev.windows.com/en-us/downloads/windows-10-sdk, das auch unter 8.1 funktioniert), führen Sie WPRUI.exe aus, wählen Sie "First Level" aus Wählen Sie ** CPU-Auslastung ** und klicken Sie auf ** Start **. Erfassen Sie jetzt 1 Minute CPU-Auslastung. Nach 1 Minute klicken Sie auf ** Speichern **. Zippen Sie die große ETL-Datei (+ NGENPDB-Ordner) in eine ZIP-Datei, laden Sie die ZIP-Datei (OneDrive, Dropbox, Google-Laufwerk) hoch und veröffentlichen Sie den Freigabe-Link hier. magicandre1981 vor 8 Jahren 2

2 Antworten auf die Frage

1
Anixx

Nun, dieses VBS-Skript erledigt das für mich.

Legen Sie eine Verknüpfung in den Autostart-Ordner. Legen Sie im selben Ordner wie die Skript-Dienstprogramme noopey und processhacker ab.

Set objShell = CreateObject("WScript.Shell") Set objWshScriptExec = objShell.Exec("nopey.exe list threads Explorer.exe") Set objStdOut = objWshScriptExec.StdOut  Do  strLine = objStdOut.ReadLine pos=Instr(strLine, "00000000") If pos<>0 And Op=0 Then Exit Do Op=Instr(strline, "TID") Loop  Tid=CLng("&H" & (Mid(strLine, 4,4)))  'WScript.Echo Tid  objShell.Run "ProcessHacker.exe -c -ctype thread -cobject " & Tid & " -caction terminate", 0 

Es deaktiviert auch das gesamte Metro-Material, bis der Explorer neu gestartet wird.

PS Hier ist das Zip-Archiv mit allem nötigen Material. Einfach auspacken und losfahren.

http://www.eightforums.com/attachments/customization/67840d1462474574-there-way-disable-metro-interface-metrokill.zip

Teilen Sie wieder eine Spur, damit ich Ihnen sagen kann, was der Thread tut, anstatt ihn einfach zu töten. magicandre1981 vor 8 Jahren 0
Wenn dieses Skript für Sie funktioniert, haben Sie Glück. Es gibt keine Verbindung zwischen dem gefundenen Thread und `windows.immersiveshell.serviceprovider.dll`: Ich würde sie nicht verwenden (vor allem nicht beim Start), es sei denn, ich könnte diese Verknüpfung herstellen, und ich muss noch einen Befehl finden. Line-Tool, das dies tut. Bei der Bestellung in meinem `ProcessHacker`-Listing findet es einen völlig anderen Thread. AFH vor 8 Jahren 0
@AFH du hast recht, es ist eine schlechte Lösung, aber ich habe keine bessere. Anixx vor 8 Jahren 0
0
Bitten Fleax

Sie können ein Befehlszeilenargument für PH (Process Hacker) erstellen.

Du kannst tun ProcessHacker.exe -c -ctype thread -cobject 1424 -caction terminate

Sie können die ID abrufen, indem Sie Process Explorer verwenden, um die TID (Thread-ID) des Threads zu ermitteln, den Sie beenden möchten. Klicken Sie dazu mit der rechten Maustaste auf Prozess> Eigenschaften und sehen Sie den Thread, den Sie beenden möchten.

Beispiel für mich ist die TID 7924

Showing TID of the thread you want to end

Ich frage nach einem Befehlszeilentool, das einen Thread durch den Teilstring "start address" beendet, der bei jedem Start des Computers ausgeführt wird. Ohne GUI zu verwenden. Das Beenden des Threads über die GUI ist mit Process Hacker möglich, wie ich bereits in der Frage erwähnt habe. Diese Antwort wiederholt nur die Informationen in meiner Frage. Anixx vor 8 Jahren 0
Außer diese Antwort kann innerhalb eines Skripts oder einer Befehlszeile verwendet werden. Ramhound vor 8 Jahren 0
@Ramhound kann es nicht. Es ist erforderlich, Process Explorer in der GUI zu starten, um eine TID zu erhalten. Es enthält auch alle Informationen aus meinem Kommentar zu der Frage, von dem Link, den ich bereits bereitgestellt habe: https://wj32.org/processhacker/forums/viewtopic.php?t=75 Anixx vor 8 Jahren 0
Ah, ich verstehe dich. Ich bin mir ziemlich sicher, dass Powershell die TID eines Prozesses erhalten kann. Es wird nur nach dem Prozessnamen herausgefiltert. Ich werde einen Blick darauf werfen und sehen. Bitten Fleax vor 8 Jahren 1
@Bitten Fleax aber erlaubt es TID von der Startadresse zu bekommen? Anixx vor 8 Jahren 0