長月1.プログラムの実行回数を出力させる仕組みをみてみる
http://win-enikki.blogspot.com/2011/09/1.html
では、残りのスクリプトをみていきます。
$iName | %{ $count = $iProp.$_[4] if ($count -ne 0){ "{0}回 {1}" -f $count, (func $_) } }
プログラム名が記述されている$iName、
そのプログラムの実行回数を含む各種データが格納されてある$ipropを利用して、回数を表示させる。
では、そもそも$ipropに書かれているデータ構造はどうなっているのだろう?
$iPropに格納されているのは、以下のレジストリキーをカスタムオブジェクトとして取得し、
データを各プロパティ値として取得している。
HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count
レジストリエディターでキーをみたところ |
オブジェクトは、PSCustomObject
PS C:\Users\buso> $iProp.gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PSCustomObject System.Object
プロパティ値に各データが保存されてる
PS C:\Users\buso> $iProp | Get-Member -MemberType noteproperty | fl (略 TypeName : System.Management.Automation.PSCustomObject Name : {1NP14R77-02R7-4R5Q-O744-2RO1NR5198O7}\zfcnvag.rkr MemberType : NoteProperty Definition : System.Byte[] {1NP14R77-02R7-4R5Q-O744-2RO1NR5198O7}\zfcnvag.rkr= ystem.Byte[] TypeName : System.Management.Automation.PSCustomObject Name : {1NP14R77-02R7-4R5Q-O744-2RO1NR5198O7}\zzp.rkr MemberType : NoteProperty Definition : System.Byte[] {1NP14R77-02R7-4R5Q-O744-2RO1NR5198O7}\zzp.rkr=Syst m.Byte[] (略
では、各プロパティに格納されているバイナリデータ構造はどうなっているのでしょう。
どうやら、先頭4バイトの次の4バイトが回数、後ろの4バイトから前の8バイトが時間が記録されるらしい。
B-) の独り言
http://d.hatena.ne.jp/hideakii/20090907
例として、zfcnvag.rkr (mspaint.exe)をみてみよう。
青がプログラム回数、赤が実行時間 |
回数は255回までは5番目のバイト数のみをみればよいので、とりあえずそこだけを見る。
$iPropでは2進数で出力されるので、特に変換はいらない。
$iPropのzfcnvag.rkrプロパティの5番目の配列にあるデータを出力してみる。
PS C:\Users\buso> $iprop."{1NP14R77-02R7-4R5Q-O744-2RO1NR5198O7}\zfcnvag.rkr"[4] 3
あとは、実行回数があるものだけを整形して、出力し完成である。
さて、ひと通りスクリプトを見たので、せっかくなのでソートして出力するよう、スクリプトを以下のように変更してみた。
$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count" $iProp = Get-ItemProperty $regPath $iName = (Get-Item $regPath).Property Function func($x) { $conv13 = $x.ToCharArray() | %{ if ( $_ -match "[a-m]") { [char]([byte][char]$_+13) }elseif ( $_ -match "[n-z]") { [char]([byte][char]$_-13) }else{ $_ } } Split-Path -Leaf ([String]$conv13 -replace " ") } #レジストリプロパティを入力、時間を出力 function convtime($x) { $LittleEndianTime=$x[60..67] | % { $_.tostring("x2") } $BigEndianTime=$null $($LittleEndianTime.count-1)..0 | % { $BigEndianTime += $LittleEndianTime[$_] } $filetime=[convert]::ToInt64("$BigEndianTime", 16) [datetime]::fromfiletime($filetime) } #オブジェクトに各データを入れデータ格納 $result = $iname | % { $count = $iProp.$_[4] if ($count -ne 0){ $output = New-Object psobject $output | Add-Member noteproperty pcount $iProp.$_[4] $output | Add-Member noteproperty pname $(func $_) $output | Add-Member noteproperty ptime $(convtime $iprop.$_) $output } } #お好みでオブジェクト整形 $result | sort-Object -Property ptime -Descending
追加部分の解説は次回以降にまわすとして、、ひとつ疑問。
だれか、知っている人います・・?
この設定場所がわかれば、一週間単位で実行したプログラムと回数を記録し、
ログとして出力・・、みたいなのができそうなんだけどなぁ。
スポンサーリンク