2011/09/01

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

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

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

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

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



$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count"
#▼ $regPathのプロパティ
$iProp = Get-ItemProperty $regPath
#▼ $regPathの名前んとこ全部
$iName = (Get-Item $regPath).Property

HKEY_CURRENT_USERの UserAssist 配下にプログラム回数が記述されるキーがある。

なお、これはタスクバーのプロパティにある、「最近開いたプログラムを[スタート]メニューに保存し表示する」にチェックをつけていないと記録されない。
OSのバージョンによって少しUserAssistの仕様が違うみたいで、今回のはWindows7ベースでのスクリプトとなっている。
ちなみに、{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} 配下にexeの実行回数
{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} 配下にショートカット(lnk)の実行回数が記録される模様

つづいて、$iPropには前述のキーのプロパティ、つまりバイナリの値を含むレジストリ値と各データを格納している。
$inameの方はレジストリキー名を格納している。
次に下記のような関数が続く。

#▼ ROT13変換
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 " ")
}

実は$inameの値(つまり、UserAssist下の該当キー)をみてもパッと見、なんだかよくわからない。
$iNameの一部を出力させてみた
これは、いわゆるROT13というシーザー暗号を使っているからである。
元々のアルファベットを13文字ずらして表記する方法で、アルファベットは全26文字のため、同じ変換式で簡単にエンコード・デーコードが可能というのが特徴。

Wikipedia ROT13
http://ja.wikipedia.org/wiki/ROT13

ということで、ROT13変換し、"\"から右側部分のみを出力するという func 関数を作成している。
以下、実際に使用すると以下のようなプログラム名が表示される
func関数で変換したもの
次回、残りをみていきたいと思います。

スポンサーリンク

スポンサーリンク