Obtener PID del servidor COM
-
26-09-2019 - |
Pregunta
crear un objeto COM en PowerShell, así:
$application = new-object -ComObject "word.application"
¿Hay una manera de obtener el PID (o algún otro identificador único) de la instancia de MS Word en marcha?
Quiero comprobar si el programa se bloquea, por ejemplo, por cuadros de diálogo modales pidiendo contraseñas, y no puedo hacerlo desde whithin PowerShell.
Solución
Bueno, he encontrado la manera de hacerlo, tenemos que llamar a la API de Windows. El truco es conseguir que el HWND, que se expone en Excel y Powerpoint, pero no en Word. La única manera de conseguirlo es cambiar el nombre de la ventana de la aplicación a algo único y encontrar que el uso de "FindWindow". Entonces, podemos obtener el PID usando la función "GetWindowThreadProcessId":
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public static class Win32Api
{
[System.Runtime.InteropServices.DllImportAttribute( "User32.dll", EntryPoint = "GetWindowThreadProcessId" )]
public static extern int GetWindowThreadProcessId ( [System.Runtime.InteropServices.InAttribute()] System.IntPtr hWnd, out int lpdwProcessId );
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
}
"@
$application = new-object -ComObject "word.application"
# word does not expose its HWND, so get it this way
$caption = [guid]::NewGuid()
$application.Caption = $caption
$HWND = [Win32Api]::FindWindow( "OpusApp", $caption )
# print pid
$myPid = [IntPtr]::Zero
[Win32Api]::GetWindowThreadProcessId( $HWND, [ref] $myPid );
"PID=" + $myPid | write-host
Otros consejos
que puede ser capaz de utilizar
get-process -InputObject <Process[]>