Вывести количество объектов GDI в командную строку или файл

Вывести количество объектов GDI в командную строку или файл

В конечном итоге я ищу способ настроить автоматическое оповещение, которое будет предупреждать меня, если количество объектов GDI процесса приближается к пределу по умолчанию в 10 000. У меня есть известная проблема с некоторым программным обеспечением, используемым нашей компанией, из-за которой explorer.exe накапливает количество, пока не падает без предупреждения — по-видимому, в более поздней версии программного обеспечения есть исправление для этого, но мы не можем обновиться по не зависящим от меня причинам. Моя идея заключается в создании фоновой программы/скрипта, который будет выводить оповещение, когда увидит, что количество объектов GDI приближается к пределу в 10 000. Однако, единственный способ, которым я могу просмотреть количество объектов GDI, — это через графический интерфейс либо в диспетчере задач, либо в Process Explorer — если бы я мог как-то автоматически сбрасывать это в текстовый файл, я бы был готов, но я не знаю, возможно ли это.

Я пробовал программу GDIView, но антивирус нашей компании помечает ее, и это вне моего контроля.

Я скачал sysinterals, но не могу найти способ заставить один из инструментов командной строки вывести счетчик GDI, который я могу получить в Process Explorer. Я также пробовал tasklist, но также не могу найти способ получить счетчик GDI из него.

Для справки, у меня здесь машина с Windows 10. У меня также включена подсистема Linux, и я могу запускать Ubuntu через нее. Я открыт для выполнения чего-либо в пакетном режиме или Python, если это будет полезно, хотя, похоже, PowerShell заблокирован для запуска скриптов (хотя, возможно, я смогу это обойти).

решение1

Я нашел небольшой фрагмент кода Powershell, который покажет вам количество процессов, созданный Рудольфом.Получение количества объектов GDI на процесс в 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()

Должна быть возможность изменять команды внутри оператора try ... Catch, чтобы добавитьесли утверждениекоторый соответствует вашему имени исследователя и публикует окно сообщения.

Связанный контент