klausilein
Goto Top

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

Content-Key: 665723

Url: https://administrator.de/contentid/665723

Printed on: April 26, 2024 at 09:04 o'clock

Member: H41mSh1C0R
Solution H41mSh1C0R Apr 14, 2021 at 10:03:24 (UTC)
Goto Top
Aloa,

schau dir mal pssuspend(Teil der sysinternals suite) an:

https://docs.microsoft.com/de-de/sysinternals/downloads/pssuspend

VG
Member: colinardo
Solution colinardo Apr 14, 2021 updated at 10:50:45 (UTC)
Goto Top
Servus @klausilein
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)
Grüße Uwe
Member: klausilein
klausilein Apr 14, 2021 at 19:34:33 (UTC)
Goto Top
Hallo Ihr Zwei! Danke für Euere Antworten. Das mit pssuspend werde ich probieren. ich daenke, es löst mein problem.
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? Was macht die Zeile 17 bzw. 24?
Gruß klausilein
Member: colinardo
colinardo Apr 14, 2021 updated at 20:33:41 (UTC)
Goto Top
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.

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
Member: klausilein
klausilein Apr 15, 2021 at 10:01:37 (UTC)
Goto Top
Hallo Uwe, danke, daß Du Dir die Zeit genommen hast! Ist nicht selbstverständlich!
Nun zu Zeile 11 und 21
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>]
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,
Bezüglich der Zeilen 17 und 24 habe ich mich falsch ausgedrückt, deren Sinn habe ich schon verstanden. Nur mit dem Schnipsel
[W32.debug]::
kann ich nichts anfangen.
Warum steht das in [ ] und was bedeuten die beiden : ?
Gruß klausilein
Member: colinardo
colinardo Apr 15, 2021 updated at 10:16:37 (UTC)
Goto Top
Hallo Uwe, danke, daß Du Dir die Zeit genommen hast! Ist nicht selbstverständlich!
Kein Thema, dafür ist ein Forum ja da face-smile.
Zitat von @klausilein:
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>]
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 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 Schnipsel
> [W32.debug]::
> 
kann ich nichts anfangen.
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:

back-to-topPowershell Leitfaden für Anfänger

back-to-topPflichtlektüre
back-to-topErweiterte Grundlagen
back-to-topZusätzliche Ressourcen
Member: klausilein
klausilein Apr 15, 2021 at 12:27:28 (UTC)
Goto Top
Hallo Uwe! Danke!
Langsam sehe ich Licht am Ende des Tunnels. Einen Teil der von Dir genannten Literatur habe ich mir schon zu Gemüte geführt.
Ich gehöre zu den Menschen für die ein PC nur ein Werkzeug ist, wie eine Bohrmaschine in die man nur den richtigen Bohrer einspannt und die richtige Drehzahl wählt, alles andere ist in der Bohrmaschine inbegriffen, so viel wie von Bohrmaschine verstehe ich vom (Windows-)PC. Ich schreibe Texte, verwalte meine Bankkonten und bearbeite meine Bilder mit Photoshop und daneben probiere ich immer wieder allerlei Dinge aus, die mir häufig mein Windows zerschießen. Das Neuaufsetzen von Windows mit all meinen Programmen ist sehr zeitaufwendig. Häufig lösche ich auch Dateien, die ich noch brauche. Ich habe mir deshalb ein Backup-Programm (im Augenblick Ashampoo Backup Pro 15) zugelegt, mit dem ich jeden Freitag 13.00 Uhr automatisch das komplette Laufwerk C: und meine Daten auf das externe Laufwerk Z: sichere. Wenn die Sicherung nicht statt findet, weil der PC nicht an ist, dann wird die Sicherung automatisch nachgeholt. Das Laufwerk Z: schalte ich mit einer Wlan-Steckdose am Freitag über eine Zeitsteuerung ein und aus. Z: ist also im Normalbetrieb nicht verfügbar. Wenn das Backup-Programm nun eine verpasste Sicherung nachholen will, dann ist Z: nicht verfügbar und das Programm gibt eine Fehlermeldung aus. Schalte ich nun Z: ein, dann wird die Sicherung leider nicht nachgeholt. Ich muß bis zum nächsten Freitag warten oder die Sicherung manuell anstoßen. Das möchte ich nun automatisieren.
$Endless = 1
$Process = "Programm-Updateprogramm"            # Processname Updateprogramm  
$Program = "Updateprogramm.exe"                 # zum Process gehörige Exe-Datei  
$Start = ""  
Do
{
$Start = get-process | where-object {$_.Processname -eq $Process}
If($Start -ne $Null){
start $Program
$Endless = 0
}
}
While($Endless -eq 1
Damit (stammt nicht von mir!) soll der Beginn der Sicherung erfaßt werden. Muß mit dem Einschalten des PCs gestartet werden und läuft dauernd mit bis $Endless =0, d.h. im Regelfall immer!?
Dann muß das Backup-Programm vor der Fehlermeldung, Z: nicht verfügbar, angehalten werden. Danach wird Z: eingeschaltet und nach einer Pause das Backup-Programm wieder gestartet.
Gruß klausilein
Member: colinardo
colinardo Apr 15, 2021 updated at 14:50:44 (UTC)
Goto Top
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):
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'  
Das ganze dann in den Taskplaner gepackt, fertig.

Wenn du dazu noch was wissen willst bitte PN.

Grüße Uwe