Echo der GDI-Objektanzahl in Befehlszeile oder Datei

Echo der GDI-Objektanzahl in Befehlszeile oder Datei

Ich suche letztendlich nach einer Möglichkeit, einen automatischen Alarm einzurichten, der mich warnt, wenn sich die GDI-Objektanzahl eines Prozesses dem Standardlimit von 10.000 nähert. Ich habe ein bekanntes Problem mit einer Software, die unser Unternehmen verwendet, das dazu führt, dass explorer.exe die Anzahl aufbaut, bis es ohne Warnung abstürzt – dafür gibt es anscheinend eine Lösung in einer späteren Version der Software, aber wir können aus Gründen, die außerhalb meiner Kontrolle liegen, kein Upgrade durchführen. Meine Idee ist, ein Hintergrundprogramm/-skript zu erstellen, das einen Alarm anzeigt, wenn es feststellt, dass sich die GDI-Anzahl dem Limit von 10.000 nähert. Die einzige Möglichkeit, die GDI-Anzahl anzuzeigen, scheint jedoch über eine GUI entweder im Task-Manager oder im Process Explorer zu sein – wenn ich das irgendwie automatisch in eine Textdatei schreiben könnte, wäre ich fertig, aber ich weiß nicht, ob das möglich ist.

Ich habe die GDIView-Software ausprobiert, aber der Antivirus unseres Unternehmens kennzeichnet sie und darauf habe ich keinen Einfluss.

Ich habe Sysinterals heruntergeladen, aber ich kann nicht herausfinden, wie ich eines der Befehlszeilentools dazu bringen kann, die GDI-Anzahl auszugeben, die ich im Process Explorer abrufen kann. Ich habe es auch mit der Taskliste versucht, aber ich kann auch dort keine Möglichkeit finden, die GDI-Anzahl abzurufen.

Zur Information: Ich verwende hier eine Windows 10-Maschine. Ich habe auch das Linux-Subsystem aktiviert und kann Ubuntu darüber ausführen. Ich bin offen dafür, etwas im Batch oder mit Python zu tun, wenn das von Nutzen ist – allerdings scheint es, als ob Powershell daran gehindert ist, Skripte auszuführen (das kann ich aber vielleicht umgehen).

Antwort1

Ich habe einen kleinen Abschnitt des Powershell-Codes gefunden, der Ihnen die Anzahl der Prozesse von Rudolf angibt unterAbrufen der GDI-Objektanzahl pro Prozess in Powershell

"Number of GUI handles per process"
$sig = @'
[DllImport("User32.dll")]
public static extern int GetGuiResources(IntPtr hProcess, int uiFlags);
'@

Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32

$processes = [System.Diagnostics.Process]::GetProcesses()
[int]$gdiHandleCount = 0
ForEach ($p in $processes)
{
    try{
        $gdiHandles = [Win32.NativeMethods]::GetGuiResources($p.Handle, 0)
        $gdiHandleCount += $gdiHandles
        $p.Name + " : " + $gdiHandles.ToString()   
    }
    catch {
        #"Error accessing " + $p.Name
    }
}
"Total number of GDI handles " + $gdiHandleCount.ToString()

Es sollte möglich sein, die Befehle innerhalb der try ... Catch-Anweisung zu ändern, um eineif-Anweisungdas mit Ihrem Explorer-Namen übereinstimmt und ein Meldungsfeld öffnet.

verwandte Informationen