##前提
環境:VS2019
言語:C# WPF
フレームワーク:MVVM
##達成したい事
直近で使用したファイルを見れるプログラムを作成しています。
その一覧に、直近で使用したexeも見れるようにしたいです。
##悩んでいる事
直近で自分が起動したexe のフルパスを取得する事は可能でしょうか。
直近で使用したファイルに関しては Recentフォルダ を見れば履歴が残っていますが、exeに関しては実行してもRecentフォルダに履歴が残りません。
そもそも、自分が起動したexeの一覧を見る事自体可能でしょうか?
追記---------------------------------------------------------------
すみません、書き方がよくありませんでした。
「直近で自分が起動したexe 」は
実行しているexeのパスではなく、最近実行した.exe 全てを指しています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
皆様回答をありがとうございます。
プリフェッチファイルを最初に示して頂いたZuishinさんをBAとさせて頂きました。
色々調べてみた結果、Windows10だとバイナリでは解析できませんでした。
簡易解析入門 プログラム実行の痕跡の調査 (1)Prefetch
また、更に調べを進めていくと以下のツールが管理者権限(おそらく)不要でプリフェッチファイルを解析してくれることがわかりました。
GitHub - PEcmd
ソースもC#だったので追ってみると、以下を実行すれば求めている答えに近い出力結果が得られましたので共有いたします。
C#
1//Prefetch.dllが .NET 4.6以上をターゲットとしているので注意 2var prefetcFullPath = @"C:\windows\prefetch\SCREEN.EXE-63A051E2.pf"; 3 4var pf = PrefetchFile.Open(prefetcFullPath); 5 6foreach (var filename in pf.Filenames) 7{ 8 if (filename.Contains(pf.Header.ExecutableFilename)) 9 { 10 Console.WriteLine(filename); 11 } 12}
出力結果:\VOLUME{01d1e631699b3e2a-486a06d0}\ツール一覧\SCREENTOGIF\SCREEN.EXE
プリフェッチファイルの解析に関しては以下のツールが速くて高機能でしたがソースが見当たらなかったのと起動時に管理者権限を毎回求めてくるので深くは調べませんでした。
WinPrefetchView v1.35
ファイルがどこのドライブに属しているかを調査していましたが分かったので追記します。
上記のプログラムの出力結果の
「\VOLUME{01d1e631699b3e2a-486a06d0}\ツール一覧\SCREENTOGIF\SCREEN.EXE」
でアクセスできると思っていましたが、できませんでした。
コマンドプロンプト上で「mountvol」と入力すると、以下のような結果が出ます。
「?\Volume{475a217f-53d2-4e99-a909-6482929b2582}\」をエクスプローラー上で検索すると、確かにCドライブに飛べました。ただVolumeの後のGuid値がどのドライブとも異なっているので何か別のCドライブを表現しているのだと思いました。
もう少し調べてみると、各ドライブは製造時に一意のGuidが振られているとのことでした。
コマンドプロンプトで「vol」と検索すれば出てきます。
私のCドライブのシリアル番号はこれのようです。(48始まりはNTFSみたいですね。)
私のCドライブのVolumuInfoのシリアル番号と一致するデバイス名が出力結果と同じでした。
ここまで分かれば後はもう組むだけですね。
C#
1//各ドライブのシリアル番号を取得 2var drives = DriveInfo.GetDrives(); 3var driveDictionary = new ConcurrentDictionary<string, string>(); 4foreach (var drive in drives) 5{ 6 var driveName = drive.Name[0] + ":"; 7 using (var disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + driveName + "\"")) 8 { 9 disk.Get(); 10 var serialNumber = disk["VolumeSerialNumber"]; 11 if (serialNumber != null) 12 { 13 driveDictionary.TryAdd(serialNumber.ToString(), driveName); 14 } 15 } 16} 17 18var prefetchFullPath = @"C:\windows\prefetch\SCREEN.EXE-63A051E2.pf"; 19var pf = PrefetchFile.Open(prefetchFullPath); 20 21foreach (var filename in pf.ExeFileNames) 22{ 23 //置換対象文字列の抽出 24 var volumeInfo = pf.VolumeInformation 25 .FirstOrDefault(x => filename.StartsWith(x.DeviceName)); 26 if (volumeInfo == null) return null; 27 28 //置換対象文字列の置換 29 var serialNumber = volumeInfo.SerialNumber; 30 string driveName; 31 _driveVolumeSerialNumberDictionary.TryGetValue(serialNumber, out driveName); 32 return driveName + filename.Replace(volumeInfo.DeviceName, string.Empty); 33}
出力結果: C:\ツール一覧\SCREENTOGIF\SCREEN.EXE
投稿2019/08/13 00:11
編集2019/08/16 22:45総合スコア59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。