2011/09/09

長月3.プログラムの実行回数を出力させる仕組みをみてみる3

前回の続きです。

長月1.プログラムの実行回数を出力させる仕組みをみてみる
http://win-enikki.blogspot.com/2011/09/1.html
長月2.プログラムの実行回数を出力させる仕組みをみてみる2
http://win-enikki.blogspot.com/2011/09/1_05.html

前回、最後にスクリプト付け加えました。
これは最終実行時間と、できたデータをオブジェクトに入れる処理です。

#レジストリプロパティを入力、時間を出力
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

この処理はだいたい以下のような動きをさせている

2011/09/05

長月2.プログラムの実行回数を出力させる仕組みをみてみる2

前回の続き

長月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

レジストリエディターでキーをみたところ

2011/09/01

長月1.プログラムの実行回数を出力させる仕組みをみてみる

とっても面白いPowerShellスクリプトが掲載されていたので ご紹介

のんべんだらりぃ~ プログラム実行回数
http://d.hatena.ne.jp/chiaki1220jp/20110831

Windowsのレジストリにはプログラムの実行回数が記録されているところがあるので、
それを利用してどのプログラムを何回実行したかというのを出力するというもの。
一時、Winny防止の為 本当に起動してないかどうかを確かめるためのソフトが話題になったけど
そのソフトもどうやらここのレジストリを見ているみたい。
とはいえ、プロファイルに記載されるレジストリ値であり、 ユーザーによっていくらでも書き換えができてしまうので、
どちらかといえば 使用頻度とかをリサーチする 統計的な目的で利用するのが正しいのかな。

実際に実行してみたところ。回数とプログラムが出力される
では、動作をひとつずつ見ていくことにする。