سؤال

أقوم بإنشاء كائن com في PowerShell مثل:

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

هل هناك طريقة للحصول على PID (أو بعض المعرفات الفريدة الأخرى) لمثيل MS Word الذي تم إطلاقه؟

أرغب في التحقق مما إذا كان البرنامج محظورًا على سبيل المثال بواسطة مربعات حوار وسيط يطلب كلمات المرور ، ولا يمكنني القيام بذلك من Whithin PowerShell.

هل كانت مفيدة؟

المحلول

حسنًا ، اكتشفت كيفية القيام بذلك ، نحتاج إلى استدعاء Windows API. الحيلة هي الحصول على HWND ، الذي يتعرض في Excel و PowerPoint ، ولكن ليس في الكلمة. الطريقة الوحيدة للحصول عليها هي تغيير اسم نافذة التطبيق إلى شيء فريد والعثور عليه باستخدام "FindWindow". بعد ذلك ، يمكننا الحصول على PID باستخدام وظيفة "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

نصائح أخرى

قد تكون قادرًا على الاستخدام

 get-process -InputObject <Process[]>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top