У меня есть исполняемый файл, который вызывает CryptAcquireContext с CRYPT_NEWKEYSET:
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 более ограничена, что останавливает создание нового контейнера ключей. Любые предложения о том, почему это может быть, и как обойти это?
Среда под Win32_Process.CreateProcess запрещает использование интерактивных операций. и выясняется, что использование CryptAcquireContext для доступа к пользовательским (а не по всей машине) контейнерам ключей не работает в неинтерактивных средах (см. http://social.msdn.microsoft.com/Forums/uk/clr/thread/2033c171-0809-4e14-aa50-1b9287389cb3, например).
Других решений пока нет …