为什么CryptAcquireContext在从通过WMI启动的进程调用时返回ERROR_ACCESS_DENIED?

时间:2012-12-21 13:47:55

标签: c++ wmi cryptoapi

我有一个可执行文件,它使用CRYPT_NEWKEYSET调用CryptAcquireContext

BOOL b_result;
HCRYPTPROV prov;

b_result = CryptAcquireContext(&prov, L"testcontext6", MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);

if(!b_result) {
    int err = GetLastError();
    fprintf(stderr, "Error acquiring context: %#x\n", err);
    return 1;
}
return 0;

如果我在本地运行它,它可以正常工作。如果我通过WMI运行它,如下所示,它返回错误0x5(ERROR_ACCESS_DENIED):

using (var processClass = new ManagementClass(m_scope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
    var inParams = processClass.GetMethodParameters("Create");
    inParams["commandLine"] = @"cmd.exe /c C:\CppTest.exe 2>C:\test.log";
    var outParams = processClass.InvokeMethod("Create", inParams, null);
    return outParams["ProcessId"];
}

WMI下的环境似乎更具限制性,这会阻止创建新的密钥容器。为什么会这样,以及如何解决它的任何建议?

1 个答案:

答案 0 :(得分:1)

Win32_Process.CreateProcess下的环境禁止使用交互操作。事实证明,使用CryptAcquireContext访问特定于用户的(而不是机器范围的)密钥容器在非交互式环境中不起作用(例如,请参阅http://social.msdn.microsoft.com/Forums/uk/clr/thread/2033c171-0809-4e14-aa50-1b9287389cb3)。