のんべんだらりぃ~ プログラム実行回数
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の一部を出力させてみた |
元々のアルファベットを13文字ずらして表記する方法で、アルファベットは全26文字のため、同じ変換式で簡単にエンコード・デーコードが可能というのが特徴。
Wikipedia ROT13
http://ja.wikipedia.org/wiki/ROT13
ということで、ROT13変換し、"\"から右側部分のみを出力するという func 関数を作成している。
以下、実際に使用すると以下のようなプログラム名が表示される
func関数で変換したもの |
スポンサーリンク