質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

4回答

783閲覧

【C#】【WPF】直近起動したすべてのexeのフルパスを取得する方法はありますか

OXamarin

総合スコア59

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/08/12 12:25

編集2019/08/12 12:37

##前提
環境:VS2019
言語:C# WPF
フレームワーク:MVVM

##達成したい事
直近で使用したファイルを見れるプログラムを作成しています。
その一覧に、直近で使用したexeも見れるようにしたいです。

##悩んでいる事
直近で自分が起動したexe のフルパスを取得する事は可能でしょうか。
直近で使用したファイルに関しては Recentフォルダ を見れば履歴が残っていますが、exeに関しては実行してもRecentフォルダに履歴が残りません。

そもそも、自分が起動したexeの一覧を見る事自体可能でしょうか?

追記---------------------------------------------------------------
すみません、書き方がよくありませんでした。
「直近で自分が起動したexe 」は
実行しているexeのパスではなく、最近実行した.exe 全てを指しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
OXamarin

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C:\Windows\Prefetchを解析すればどうにかなりそうですが、私はフォルダやファイルの仕様を知りません。
このあたりの情報を検索してみてはどうでしょうか?

投稿2019/08/12 12:42

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C:\Windows\Prefetch を見てみたらどうでしょうか。

投稿2019/08/12 12:39

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/08/12 14:00

その他では、実行ログを取るように Windows の設定を変えるか、またはサービスを作って独自にログを取る必要があるのではないかと思います。
guest

0

WindowsFormであれば、コマンド引数のargs[0]にフルパスが入ってますが、WPFではどーなんでしょう

投稿2019/08/12 12:27

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OXamarin

2019/08/12 12:36 編集

すみません、書き方がよくありませんでした。 「直近で自分が起動したexe 」は 実行しているexeのパスではなく、最近実行した.exe 全てを指しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問