Repetir el recuento de objetos GDI en la línea de comando o archivo

Repetir el recuento de objetos GDI en la línea de comando o archivo

En última instancia, estoy buscando una manera de configurar una alerta automática que me advierta si el recuento de objetos GDI de un proceso se acerca al límite predeterminado de 10.000. Tengo un problema conocido con algún software que utiliza nuestra empresa y que hace que explorer.exe tenga el recuento acumulado hasta que falla sin previo aviso. Aparentemente hay una solución para esto en una versión posterior del software, pero no podemos actualizarlo por razones ajenas a mi control. Mi idea es crear un programa/script en segundo plano que mostrará una alerta cuando vea un recuento de GDI acercándose al límite de 10,000. Sin embargo, la única forma en que puedo ver el recuento de GDI es a través de una GUI, ya sea en el administrador de tareas o en Process Explorer; si de alguna manera pudiera volcar eso en un archivo de texto automáticamente, estaría configurado, pero no sé si eso es posible.

Probé el software GDIView, pero nuestra empresa Antivirus lo marca y eso está fuera de mi control.

Descargué sysinterals, pero no encuentro ninguna manera de hacer que una de las herramientas de línea de comandos haga eco del recuento de GDI que puedo obtener en Process Explorer. También probé la lista de tareas, pero tampoco puedo encontrar una manera de eliminar el recuento de GDI.

Como referencia, estoy en una máquina con Windows 10 aquí. También tengo habilitado el subsistema Linux y tengo la capacidad de ejecutar Ubuntu a través de él. Estoy abierto a hacer algo en lotes o Python si eso es de alguna utilidad, aunque parece que PowerShell no puede ejecutar scripts (aunque es posible que pueda solucionarlo).

Respuesta1

Encontré una pequeña sección del código de Powershell que le dará el recuento por proceso de Rudolf enObtener el recuento de objetos GDI por proceso en 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()

Debería ser posible modificar los comandos dentro de la instrucción try... Catch para agregar unsi declaraciónque coincide con el nombre de su explorador y publica un cuadro de mensaje.

información relacionada