本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/0b0605257ad39bc22895 |
はじめに
Windows に GUI アプリ「ABC.exe」がある とした場合、
この「ABC.exe」の置き場を特定する処理について記す.
実際の運用では、以下を検査するというものであった.
・「製品版の実行ファイルが使用されているか?」(== 誤ってデバッグ版を使っていないか)
参考にした情報は下記ページであり、本項ではこの中で挙げられているコードを補足する.
URL |
---|
it-swarm-ja.com ファイルをロックしているアプリケーションをチェックするためのPowerShellスクリプト? |
|
補足
Linux であれば、次のコマンドで実行ファイル置き場を特定することができる.
・realpath /proc/<プロセス番号>/exe
環境
Windows 10 Pro
PowerShell バージョン 6系
処理概要
次の 1〜5 の処理をする
1. 期待する実行ファイル置き場を定義する
2. 上記 1 のプロセス名を定義する
3. Get-Process (== psコマンド)を実行して、2 の名称を持つ「プロセス情報」を抽出する
4. 「プロセス情報」のメンバ Modules にアクセスして実行ファイルパスを得る
5. 上記 4 で得たパスが 上記 1 と一致するか判定する
詳細
# 期待する実行ファイル置き場 (🛑上記 1 に該当する)
$EXP = "C:\work\product\ABC.exe"
# プロセス名 (🛑上記 2 に該当する)
$N = "ABC"
# エラー有無. 初期値は "エラーあり". ($True, $False) = (エラーあり, なし)
$ERR = $True
# 「ps -ef |grep "ABC"」に相当する (🛑上記 3 に該当する)
Get-Process -Name $N | `
# 1プロセスずつ精査する
foreach {
# 「ある 1つのプロセス情報」を $processVar に格納する
$processVar = $_
# Modules メンバには実行ファイルの情報が格納されている. (🛑上記 4 に該当する)
$_.Modules | `
foreach {
# 実行ファイルのパスが「期待する実行ファイル置き場」と一致するか? (🛑上記 5 に該当する)
if($_.FileName -eq $EXP)
{
# 実行ファイルのパスが「期待する実行ファイル置き場」と一致したので "エラーなし" にする
$processVar.Name + " PID:" + $processVar.id
# 「エラーなし」にする
$ERR = $False
}
}
}
# 「期待する実行ファイル置き場」で実行されていたか?
if($ERR -eq $True)
{
# エラーあり. 「期待する実行ファイル置き場」では実行されてなかった
}
参考にしたサイト
URL |
---|
it-swarm-ja.com ファイルをロックしているアプリケーションをチェックするためのPowerShellスクリプト? |
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.modules?view=net-5.0 |