2

handle.exe を使用して、どのプロセスがファイルを所有しているかを調べようとしています。コマンドラインから独自にハンドルを実行すると、期待どおりに動作します。ただし、コード内から実行すると、ファイルをロックしているプロセスがないことが常に返されます。

Handle.exe を実行する私のコード:

Process tool = new Process();
tool.StartInfo.FileName = "handle.exe";
tool.StartInfo.Arguments = theFileName;
tool.StartInfo.UseShellExecute = false;
tool.StartInfo.RedirectStandardOutput = true;
tool.Start();
tool.WaitForExit();
string outputTool = tool.StandardOutput.ReadToEnd();

string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
foreach (System.Text.RegularExpressions.Match match in 
         System.Text.RegularExpressions.Regex.Matches(outputTool, matchPattern)) {
    Process p = Process.GetProcessById(int.Parse(match.Value));
    Console.WriteLine("Holding Process: " + p.Id);
}

また、この SO の質問で提案されているファイルの所有権を見つけるための他の方法をいくつか試しまし た。 ファイルを制御できるものは何もないとまだ報告しています。

このことをテストするために、基本的にこれを実行するだけの別のテストプログラムがあります。

    using (FileStream theStream = new FileStream(theFileName, FileMode.Open, FileAccess.Read, FileShare.None)) {
        while (true) ;
    }

編集: Visual Studio を管理者として実行しているため、コードから開始するすべてのプロセスが同じ権限を取得します。もちろん、これはデバッグ中のみですが、他の環境を心配する前に、少なくとも 1 つの環境で動作させる必要があります。

ハンドルが実行された後、outputTool は

ハンドル v3.5
Copyright (C) 1997-2012 マーク・ルシノビッチ
Sysinternals - www.sysinternals.com

一致するハンドルが見つかりません。
4

2 に答える 2

4

Handle.exe を機能させるには、管理者特権で実行する必要があります。の内容をダンプするとoutputTool、「初期化エラー: 管理者であることを確認してください」と表示されると思います。

独自のアプリを管理者特権で実行すると、handle.exe も管理者特権で自動的に起動され、問題が解決されます。残念ながら、handle.exe を昇格して起動するようにアプリを単純に変更することはできません。それには を使用する必要があり、これtool.StartInfo.Verb = "runas";には が必要でありtool.StartInfo.UseShellExecute = true;、競合するtool.StartInfo.RedirectStandardOutput = true;

requestedExecutionLevelを設定してアプリケーション マニフェストを追加requireAdministratorし、アプリが常に昇格して起動されるようにすることができます。

于 2012-10-19T19:25:36.043 に答える
1

私はそれを理解しました。ファイル パスに余分な「\」がありました。どうやらこれはハンドルを混乱させますが、そうではありませんFile.Open(...)

theFileName = "C:\ProgramData\MyApp\\imagefile.tiff"

Windows コマンドで handle.exe を実行しようとするたびに、余分な「\」を含めませんでした。

私の質問にファイルパスを含めたことがないので、他の人がそれを理解することは不可能だったと思います. 申し訳ありませんがSOユーザー。

于 2012-10-20T00:01:43.800 に答える