0

Windows プラットフォームで次のコードを実行します。目的は、特定のプロセス ID が既存のプロセスを参照しているかどうかを知ることです。

BOOL bProcessExists = FALSE;
HANDLE hProcHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcID);
if(hProcHandle)
{
    bProcessExists = TRUE;
    ::CloseHandle(hProcHandle);
}
else
{
    if(::GetLastError() == ERROR_ACCESS_DENIED)
    {
        bProcessExists = TRUE;
    }
}

上記のコードを実行するプロセスは管理者特権で実行されず、OpenProcess が一部のプロセス ID に対して拒否されたアクセスを返す可能性があることがわかりました。

上記のコードは有効ですか?

4

1 に答える 1

2

プロセスを開くことができるということは、プロセスが存在することを意味するというあなたの仮定についてもっと心配しています(「存在する」という非常に緩い定義を除いて)。

プロセスのエントリは、そのプロセスへのハンドルが少なくとも 1 つ開いている限り保持されます。たとえば、親がプロセスを生成し、子プロセスへのハンドルを保持している場合、そのプロセスが終了した後でも、子プロセスのエントリが残ります。そのような状況では、適切な権限を持っていると仮定すると、プロセスが既に終了していても、プロセスへのハンドルを開くことができます。

このケースを正しく処理するには、おそらく を呼び出して、プロセスのステータスとしてGetExitCodeProcess返された場合にのみ、プロセスが存在すると言う必要があります。STILL_ALIVE

他の部分に関しては、確実にうまくいくとは言えませんが、可能性は十分にあると思います。私は、ユーザーのパスワードを確認するために同様の手法を使用しました。提案されたユーザー名とパスワードを入力してもらいます。次に、NetUserChangePassword(パスワードを変更する権利なしで)使用します。次に、表示されるエラーを確認します。これはERROR_ACCESS_DENIED、入力したユーザー名とパスワードの組み合わせが有効であるERROR_INVALID_PASSWORDことを意味し、無効であることを意味します。

于 2012-07-01T06:44:12.800 に答える