当用户未登录Windows 8.1时,CryptAcquireContext失败,出现错误“未找到文件”(2L) 我很难将基于当前Windows Server 2008上运行的C++加密程序迁移到Windows 8.1。情况是:
此应用程序最终由WatchDog.exe触发,而WatchDog.exe则在Windows的任务计划程序启动计算机时触发 任务计划程序使用以下规则启动WatchDog.exe:当用户未登录Windows 8.1时,CryptAcquireContext失败,出现错误“未找到文件”(2L) 我很难将基于当前Windows Server 2008上运行的C++加密程序迁移到Windows 8.1。情况是:,c++,authentication,windows-8.1,impersonation,cryptoapi,C++,Authentication,Windows 8.1,Impersonation,Cryptoapi,此应用程序最终由WatchDog.exe触发,而WatchDog.exe则在Windows的任务计划程序启动计算机时触发 任务计划程序使用以下规则启动WatchDog.exe: 管理员用户帐户 无论用户是否登录都要运行 未选中:不存储密码。该任务将只能访问 当地资源 以最高权限运行 配置Win8.1 在系统启动时触发 在给定的场景中,WatchDog.exe启动应用程序之前,服务器一直在那里,没有人登录。应用程序日志确认进程的所有者(GetUserName)与用于触发WatchDog.exe
- 管理员用户帐户李>
- 无论用户是否登录都要运行李>
- 未选中:不存储密码。该任务将只能访问 当地资源李>
- 以最高权限运行李>
- 配置Win8.1李>
- 在系统启动时触发
...
HANDLE hToken;
if (! LogonUser(L"admin", L".", L"XXXXXXXX", LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &hToken))
{
logger->log (_T("Error logging on."));
}
else
{
logger->log (PMLOG_LEVEL_TRACE, _T("Logged on."));
if (! ImpersonateLoggedOnUser(hToken))
{
logger->log (_T("Error impersonating."));
}
else
{
logger->log (_T("Impersonated."));
err = XXXXXXXXX(); // calls function which will execute CryptAcquireContext
if (! RevertToSelf())
{
logger->log (_T("Error reverting."));
}
else
{
logger->log (_T("Reverted."));
}
}
}
...
调用CryptAcquireContext的摘录:
...
//---------------------------------------------------------------
// Get the handle to the default provider.
if(! CryptAcquireContext(&hCryptProv, cryptContainerName, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
{
DWORD e = GetLastError();
_stprintf_s (logMsg, 1000, _T("Error %ld acquiring cryptographic provider."), e);
cRSALogger->log (logMsg);
return ERR_CCRYPT_NO_KEY_CONTAINER;
}
cRSALogger->log (_T("Cryptographic provider acquired."));
...
结果,我得到了日志:
...
[2015/01/08 20:53:25-TRACE] Logged on.
[2015/01/08 20:53:25-TRACE] Impersonated.
...
[2015/01/08 20:53:26-ERROR] Error 2 acquiring cryptographic provider.
...
[2015/01/08 20:53:26-TRACE] Reverted.
...
这似乎表明模拟工作正常,但仍然在CryptAcquireContext上出现错误2(错误\u文件\u未找到)
摘要:
- 在Windows Server 2008上,相同的应用程序甚至可以正常运行 没有对LogonUser/Impersonate/Revert的调用
- 在Windows 8.1上,应用程序,无论是否调用 LogonUser/Impersonate/Revert仅在用户登录时才能正常工作(这是不可接受的)
丹@2501你好,2501。使用默认的pszProvider(NULL)以完全相同的行为呈现应用程序:当admin登录时,代码工作,但如果admin注销,则代码不工作,无论是否使用非音素化。老样子。其他想法?