当用户未登录Windows 8.1时,CryptAcquireContext失败,出现错误“未找到文件”(2L) 我很难将基于当前Windows Server 2008上运行的C++加密程序迁移到Windows 8.1。情况是:

当用户未登录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

此应用程序最终由WatchDog.exe触发,而WatchDog.exe则在Windows的任务计划程序启动计算机时触发

任务计划程序使用以下规则启动WatchDog.exe:

  • 管理员用户帐户
  • 无论用户是否登录都要运行
  • 未选中:不存储密码。该任务将只能访问 当地资源
  • 以最高权限运行
  • 配置Win8.1
  • 在系统启动时触发
在给定的场景中,WatchDog.exe启动应用程序之前,服务器一直在那里,没有人登录。应用程序日志确认进程的所有者(GetUserName)与用于触发WatchDog.exe的用户任务计划程序完全相同

事实证明,该应用程序在Windows Server 2008中运行良好,但在Windows 8.1中,调用失败,返回代码错误\u未找到文件(2L)。奇怪的是,如果在启动时,用户实际登录到机器上,应用程序不会失败,尽管手动启动应用程序的不是用户

我看了一下,发现:

“未加载用户的配置文件,无法找到。此 当应用程序模拟用户时发生,例如 IUSR_计算机名帐户。”

我从来没有听说过非超声化,所以我做了一项研究,找到了API,并且。然后,我以以下方式更新了应用程序:

...
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仅在用户登录时才能正常工作(这是不可接受的)
为了让它在windows 8.1上运行,我可以跑到哪里去呢

提前感谢,


@2501你好,2501。使用默认的pszProvider(NULL)以完全相同的行为呈现应用程序:当admin登录时,代码工作,但如果admin注销,则代码不工作,无论是否使用非音素化。老样子。其他想法?