4

レジストリのHKLM部分の下にいくつかのレジストリキーを書き込もうとしています。私は、これまでに見たいくつかのMSDNの例と同様の方法で、RegCreateKeyEx()とRegSetValueEx()を使用しています。

ただし、RegSetValueEx()呼び出しはエラー5で失敗し、FormatMessage()は「アクセスが拒否されました」と表示します。

昇格された権限をリクエストする必要があると思いますが、これを行うために必要なAPI呼び出しを認識していませんか?

これが私のコードです:

HKEY hk;
DWORD dwDisp;
LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\MyApp"), 0, NULL,
    REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hk, &dwDisp);
if(result == ERROR_SUCCESS)
{       
    BYTE value[] = "Hello world!";

    result = RegSetValueEx(hk, _T("MyValue"), 0, REG_EXPAND_SZ, value, strlen((char*)value)+1);
    if(result != ERROR_SUCCESS)
    {
        DBG_PRINT2("RegSetValueEx failed with code: %d\n", result);
    }

    RegCloseKey(hk);
}
4

1 に答える 1

8

HKLM への書き込みアクセス権を得るには、プロセスを管理者権限を持つユーザーとして実行する必要があります。さらに、UAC (Vista 以降) を含むシステムでは、プロセスを管理者特権で実行する必要があります。これを実現するには、アプリケーション マニフェストで指定requireAdministratorします。

厳密に必要な場合を除き、昇格された権限でアプリケーションを実行しないことが重要です。書き込みが必要なアプリケーションの部分を、HKLMインストール プログラムなどの 1 回限りの操作に移動できます。または、アプリケーションを 2 つの部分に分割することもできます。通常の権限で実行される大きな部分と、昇格が必要な小さな部分です。

アプリケーションを小さな部分に分割する必要がある場合がある理由は、プロセスの起動時にユーザー トークンが割り当てられ、プロセスの存続期間中は変更できないためです。したがって、アプリケーションの一部を昇格させ、他の部分を昇格させたくない場合は、2 つの異なるプロセスが必要です。

于 2012-11-18T13:46:16.730 に答える