2010-10-26 41 views
0

créer un objet COM dans Powershell comme ceci:salpingite du serveur COM

$application = new-object -ComObject "word.application" 

Y at-il un moyen d'obtenir le PID (ou un autre identifiant unique) de l'instance lancée MS Word?

Je veux vérifier si le programme est bloqué, par ex. par des boîtes de dialogue modales demandant des mots de passe, et je ne peux pas le faire à partir de PowerShell.

Répondre

1

Ok, j'ai appris comment le faire, nous avons besoin d'appeler l'API Windows. L'astuce consiste à obtenir le HWND, qui est exposé dans Excel et Powerpoint, mais pas dans Word. La seule façon de l'obtenir est de changer le nom de la fenêtre de l'application en quelque chose d'unique et de le trouver en utilisant "FindWindow". Ensuite, on peut obtenir le PID en utilisant la fonction "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 
0

vous pourrez peut-être utiliser

get-process -InputObject <Process[]> 
+0

qui ne fonctionne pas: Get-Process: ne peut pas lier le paramètre 'InputObject'. Impossible de convertir la valeur "System .__ ComObject" du type "System .__ ComO bject # {000208d5-0000-0000-c000-000000000046}" pour saisir "System.Diagnostics.Process". –