6

pid でプロセス パスを取得しようとしていますが、Win32Exception (アクセス ID が拒否されました) が発生します。

コードは次のようになります。

string path = Process.GetProcessById(pid).MainModule.FileName

GetModuleFileNameEx で OpenProcess を使用しようとしましたが、OpenProcess は 0 を返しいます。

上記のコードはほとんどのプロセスで機能しますが、SynTPHelper.exe (Synaptics Pointing Device Helper) でエラーがスローされます。アプリケーションはコードと同じユーザー名で実行されています。アプリケーションとプロセスの両方が 64 ビットで実行されます。

アプリケーションを管理者として実行せずにパスを取得することはできますか?

編集

管理者として実行していなくても、タスク マネージャーは「ファイルの場所を開く」ことができます。

4

2 に答える 2

16

最後に、私はそれを解決することができました。判明したように、Vista 以降には、プロセス パスと新しいプロセス アクセスを取得するための新しい関数 (PROCESS_QUERY_LIMITED_INFORMATION) があります。

QueryFullProcessImageName

昇格されていないプロセスから機能するコードは次のとおりです。

    private static string GetExecutablePathAboveVista(UIntPtr dwProcessId)
    {
        StringBuilder buffer = new StringBuilder(1024);
        IntPtr hprocess = OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, dwProcessId);
        if (hprocess != IntPtr.Zero)
        {
            try
            {
                int size = buffer.Capacity;
                if (QueryFullProcessImageName(hprocess, 0, buff, out size))
                {
                    return buffer.ToString();
                }
            }
            finally
            {
                CloseHandle(hprocess);
            }
        }
        return string.Empty;
    }
于 2010-09-06T20:43:07.623 に答える
1

管理者でさえプロセスを開くことができないように、サービスがアクセス権を削除することは確かに前例のないことではありません。サービスにはそれを行うのに十分な権限があり、audiodg.exe などの DRM コンポーネントはすぐにそうします。マウス パッド ヘルパーは、そのような保護を必要とするものとは思えません。しかし、マウス パッド ヘルパーをいじる必要があるのはなぜでしょうか。

于 2010-08-03T19:35:39.993 に答える