0

我有一个使用 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 下的环境在某种程度上更具限制性,这会阻止创建新的密钥容器。关于为什么会这样以及如何解决它的任何建议?

4

1 回答 1

1

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

于 2012-12-27T11:11:48.683 回答