1月 03

正月休み中に調べようと思っていた件を最終日にやっと調査。

PowerShellでは.net Frameworkのオブジェクトがそのまま扱えます。

win32apiを呼ぶこともできますが、せっかくなので、.netでウィンドウハンドルとメインウィンドウのタイトルを取得してみます。

ちなみにPowerShellから.netのメソッドを呼び出す方法は「[クラス]::メソッド名(引数)」とすることで、呼び出せます。

$psArray = [System.Diagnostics.Process]::GetProcesses()

foreach ($ps in $psArray){
[String]$ps.Handles + " : " + $ps.MainWindowTitle
}

重要なところは1行目だけSystem.Diagnostics.ProcessクラスのGetProcesses()メソッドを呼び出します。

あとはとりあえず画面に出すための文。

こんな感じでほかのクラスも呼び出せる。



1月 02

原因判明!!

PowerShellで使うメッセージファイルの記述方法によってうまく出ないことが判明。。。

↓メッセージファイルをこんな風に書くと、ダメ。

LanguageNames = (Japanese=0x411:MSG00411)

MessageId = 0x1
Severity = Informational
Facility = Application
SymbolicName = MSG_0
Language = Japanese
%1
.

↓こんな風に書けばOK

LanguageNames = (Japanese=0x411:MSG00411)

MessageId = 0x1
Facility = Application
SymbolicName = MSG_0
Language = Japanese
%1
.

どこが違うかというと、「Severity = Informational」があるか、ないかの違いです。

ResourceHackerで見てみたところ、左のメッセージIDがちょっと変。(左がSeverityを書いている、右はSeverityがない)

画面の右のようになるようにDLLを作れば「Write-EventLog」の-EventIDにメッセージIDを指定すればちゃんと出てきます。

ちなみに「Write-EventLog」に-EntryTypeがあるのでここでError、Warning、Information、SuccessAudit、FailureAuditを設定すればメッセージファイルでSeverityを書かなくてもEntryTypeの設定どおりイベントログに記録されました。




デル株式会社
ウイルスバスター公式トレンドマイクロ・オンラインショップ