Ressourcenmonitor mit (Powershell-?)Script bedienen
Der Resourcenmonitor von Windows 10 (resmon oder perfmon /res) gibt mir mit einem Rechtsklick auf einen Prozess die Möglichkeit diesen Prozess anzuhalten und auch wieder weiter laufen zu lassen. Ich möchte dies nun in einem Script nachbilden. In Powershell ist mir dies bis jetzt nicht gelungen. Die Cdmlets Kill-Process und Wait-Process entsprechen nicht dem Anhalten im Ressourcenmonitor. Wer kann mir helfen?
Gruß klausilein
Gruß klausilein
Please also mark the comments that contributed to the solution of the article
Content-Key: 665723
Url: https://administrator.de/contentid/665723
Printed on: April 27, 2024 at 02:04 o'clock
8 Comments
Latest comment
Aloa,
schau dir mal pssuspend(Teil der sysinternals suite) an:
https://docs.microsoft.com/de-de/sysinternals/downloads/pssuspend
VG
schau dir mal pssuspend(Teil der sysinternals suite) an:
https://docs.microsoft.com/de-de/sysinternals/downloads/pssuspend
VG
Servus @klausilein
Oder wenn's mit Bordmitteln sein soll, zwei Methoden (Einmal über's die Debugging-Function oder NtSuspendProcess der ntdll)
Grüße Uwe
Oder wenn's mit Bordmitteln sein soll, zwei Methoden (Einmal über's die Debugging-Function oder NtSuspendProcess der ntdll)
Add-Type –MemberDefinition '
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool DebugActiveProcess(int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool DebugActiveProcessStop(int dwProcessId);
[DllImport("ntdll.dll", SetLastError = true)] public static extern bool NtSuspendProcess(IntPtr processHandle);
[DllImport("ntdll.dll", SetLastError = true)] public static extern bool NtResumeProcess(IntPtr processHandle);
' -name debug -namespace W32
# start notepad
start notepad
sleep 1
# get pid of "notepad" process (example)
$proc = gps notepad
# enable process debugging (suspend)
[W32.debug]::DebugActiveProcess($proc.id)
# or via NTSuspendProcess
# [W32.debug]::NtSuspendProcess($proc.handle)
sleep 5
# disable process debugging (resume)
[W32.debug]::DebugActiveProcessStop($proc.id)
# or via NTResumeProcess
# [W32.debug]::NtResumeProcess($proc.handle)
Zitat von @klausilein:
Uwe, ich bin Powershell-Neuling, ich verstehe an Deinem Script einiges nicht. Zu was sind die Zeilen 1 bis 6?
Diese Zeilen laden die benötigten Win32 Funktionen aus den entsprechenden Windows DLLs in einen Custom Namespace mit dem Namen "W32.debug", über diesen mache ich 4 statische Funktionen in der PowerShell praktisch nutzbar.Uwe, ich bin Powershell-Neuling, ich verstehe an Deinem Script einiges nicht. Zu was sind die Zeilen 1 bis 6?
Die Zeilen 11 und 21 sind wohl nicht relevant
Doch das sind sie davon brauchen tust du Zeile 14 welche sich das Process Object des entsprechenden Prozesses holt. Davon brauchen wir später die ProcessID bzw. die Property "Handle" für die alternative Variante die ich auskommentiert habe.Was macht die Zeile 17 bzw. 24?
Zeile 17 hält den Prozess der in Zeile 14 angegeben ist an und 24 gibt ihn wieder frei, genau das was du ja wolltest 😉.Unter den beiden Zeilen steht eine alternative Variante über die ntdll um Prozesse zu "suspenden" und wieder zu "resumen".
Beide Methoden sind von der Funktionsweise her ähnlich.
Hth
Uwe
Hallo Uwe, danke, daß Du Dir die Zeit genommen hast! Ist nicht selbstverständlich!
Kein Thema, dafür ist ein Forum ja da .Zitat von @klausilein:
Das habe ich in der Powershell-Hife gefunden.
Wenn ich das richtig verstehe, dann hält sleep 1 das Script für 1 mS an. Ist das richtig? Wenn ja, dann verstehe ich Deine Antwort nicht,
Das habe ich in der Powershell-Hife gefunden.
PS C:\Users\Klaus von Jan> help sleep
> NAME
> Start-Sleep
> ÜBERSICHT
> Suspends the activity in a script or session for the specified period of time.
> SYNTAX
> Start-Sleep -Milliseconds <System.Int32> [<CommonParameters>]
> Start-Sleep [-Seconds] <System.Int32> [<CommonParameters>]
Das ist natürlich nur für das Beispiel im Code damit du es selbst ausprobieren kannst, das wartet kurz bis Notepad gestartet ist da es ansonsten keinen Prozess notepad gibt. In deinen Scripts brauchst du das natürlich nicht aber eben die Zeile mit der Variablen $proc die ist ja wichtig weil wir die ProcessID bzw. das Handle des Prozesses an die Methode anschließend als Parameter übergeben.
Bezüglich der Zeilen 17 und 24 habe ich mich falsch ausgedrückt, deren Sinn habe ich schon verstanden. Nur mit dem Schnipselkann ich nichts anfangen.
Warum steht das in [ ] und was bedeuten die beiden : ?
Gruß klausilein
> [W32.debug]::
>
Warum steht das in [ ] und was bedeuten die beiden : ?
Gruß klausilein
Das begrenzt die Klasse den ich oben ja mit dem Add-Type importiert habe. "W32" ist der Namespace und "debug" der Name der erstellten Klasse.
Der Doppelpunkt leitet dann den Aufruf einer "statischen" Methode dieser Klasse ein, da die Member ja als "static" im Add-Type markiert wurden. Statische Methoden lassen sich im Gegensatz zu anderen Methoden direkt ohne Erstellen einer Instanz einer Klasse aufrufen.
Das verstehst du jetzt aber nur wenn du etwas tiefer ins objektorientierte Programmieren einsteigst.
Hier mal etwas Lektüre dazu
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes ...
Und wie immer erst mal für die PS-Grundlagen empfehle ich der Reihe nach:
Powershell Leitfaden für Anfänger
Pflichtlektüre
- Kapitel 1: Erste Schritte mit PowerShell
- Kapitel 2: Das Hilfesystem
- Kapitel 3: Entdecken von Objekten, Eigenschaften und Methoden
- Kapitel 4: Einzeiler und die Pipeline
- Kapitel 5: Formatierung, Aliase, Anbieter, Vergleich
- Kapitel 6: Flusssteuerung
- Kapitel 7: Arbeiten mit WMI
- Kapitel 8: PowerShell-Remoting
- Kapitel 9: Funktionen
- Kapitel 10: Skriptmodule
- Anhang A: Hilfesyntax
Erweiterte Grundlagen
- Alles, was Sie schon immer über Arrays wissen wollten
- Alles, was Sie schon immer über Hashtabellen wissen wollten
- Was Sie schon immer über PSCustomObject wissen wollten
- Alles, was Sie schon immer über die Variablenersetzung in Zeichenfolgen wissen wollten
- Alles, was Sie schon immer über die IF-Anweisung wissen wollten
- Alles, was Sie schon immer über die switch-Anweisung wissen wollten
- Alles, was Sie schon immer über Ausnahmen wissen wollten
- Alles, was Sie schon immer über $null wissen wollten
- Alles, was Sie schon immer über ShouldProcess wissen wollten
- Verwenden von Erweiterung mit der TAB-TASTE
Zusätzliche Ressourcen
Hallo Klausilein,
das ist jetzt doch langsam ziemlich Offtopic. Ich bitte dich für neue Fragen einen neuen Thread auf zu machen. Aber um das mal kurz und knackig zu beantworten: Die Vorgehensweise ist Murks. Vor dem Start der jeweiligen Backup-Anwendung und dem Start des Backups sollte man einfach prüfen ob das Laufwerk vorhanden ist oder nicht und das Programm nur starten lassen wenn das Laufwerk auch verfügbar ist (Oder gleich ein vernünftiges Backup-Programm verwenden welche solche Situationen im Normalfall problemlos handeln):
Das ganze dann in den Taskplaner gepackt, fertig.
Wenn du dazu noch was wissen willst bitte PN.
Grüße Uwe
das ist jetzt doch langsam ziemlich Offtopic. Ich bitte dich für neue Fragen einen neuen Thread auf zu machen. Aber um das mal kurz und knackig zu beantworten: Die Vorgehensweise ist Murks. Vor dem Start der jeweiligen Backup-Anwendung und dem Start des Backups sollte man einfach prüfen ob das Laufwerk vorhanden ist oder nicht und das Programm nur starten lassen wenn das Laufwerk auch verfügbar ist (Oder gleich ein vernünftiges Backup-Programm verwenden welche solche Situationen im Normalfall problemlos handeln):
If (!(Test-Path Z:)){
write-host "Laufwerk Z: ist nicht verfügbar" -F Yellow
# hier jetzt entweder eine Prozedur starten um das Laufwerk zu verbinden , oder nachfragen das der User das eben tut oder eben das Skript zu beenden
exit 1
}
start 'C:\Whatever\Program.exe'
Wenn du dazu noch was wissen willst bitte PN.
Grüße Uwe