我有一个可执行文件,它使用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下的环境似乎更具限制性,这会阻止创建新的密钥容器。为什么会这样,以及如何解决它的任何建议?
答案 0 :(得分:1)
Win32_Process.CreateProcess下的环境禁止使用交互操作。事实证明,使用CryptAcquireContext访问特定于用户的(而不是机器范围的)密钥容器在非交互式环境中不起作用(例如,请参阅http://social.msdn.microsoft.com/Forums/uk/clr/thread/2033c171-0809-4e14-aa50-1b9287389cb3)。