1

現在、リモート マシンでユーザーの Outlook プロファイルをリセットする小さな PowerShell スクリプトに取り組んでいます。

必要なプロファイル処理を行う前に、リモート マシンで Outlook が既に実行されているかどうかを確認し、実行されている場合は正常に停止します。必要なクリーンアップと同期を実行できるように、プロセスを強制終了したくありません。

管理ユーザーでマシンに接続し、次のコマンドを実行すると:

Enter-PSSession $remoteMachine
$outlookProcess = Get-Process outlook
$outlookProcess.CloseMainWindow()

私は得るだけ

False

「戻り値」として

次の方法でプロセスを強制終了します。

Stop-Process $outlookProcess

動作します。

閉じようとしているプロセスは、接続している管理ユーザーによって開始されていないため、最初は、このユーザーのコンテキストで操作することは許可されていないのではないかと思いましたが、ローカルマシンで同じことを行うと (プロセスの開始「通常の」ユーザーで、次に管理ユーザーで CloseMainWindow() を使用すると、問題なくプロセスが閉じられます。

私の質問は、このリモート プロセスを適切に閉じるにはどうすればよいかということです。

4

1 に答える 1

3

Windows アプリケーションを適切に閉じるには、アプリに WM_CLOSE メッセージを送信します。これは、アプリが変更を保存するかどうかを尋ねる UI をポップする原因となる変更された状態をユーザーが持っていない限り、機能するはずです。これは、メモ帳アプリを閉じる方法を示す例です。これも、保存されていない変更がない限りです。

$src = @'
using System;
using System.Runtime.InteropServices;
public static class Win32 {
    public static uint WM_CLOSE = 0x10;

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}
'@

Add-Type -TypeDefinition $src
$zero = [IntPtr]::Zero
$p = @(Get-Process Notepad)[0]
[Win32]::SendMessage($p.MainWindowHandle, [Win32]::WM_CLOSE, $zero, $zero) > $null
于 2013-01-21T19:04:08.130 に答える