域用户调用AcquireCredentialsHandle(Schannel)(LocalMachine证书存储)所需权限咨询
问题描述
本地用户身份运行程序时,可成功通过Schannel创建连接,调用AcquireCredentialsHandle的代码如下:
credData.dwVersion = SCHANNEL_CRED_VERSION; credData.cCreds = 1; credData.paCred = &pSecLstr->serverCert; ss = AcquireCredentialsHandle(NULL, UNISP_NAME, SECPKG_CRED_INBOUND, NULL, &credData, NULL, NULL, &(pSecLstr->hCred), &Lifetime);
但通过RDP登录的域用户身份运行时,调用LocalMachine证书存储会返回0x00000520 (ERROR_NO_SUCH_LOGON_SESSION)。推测域账户缺少本地用户默认拥有的权限或安全策略,请问具体是哪些?
解决方案与权限说明
返回ERROR_NO_SUCH_LOGON_SESSION的核心原因是域用户的登录会话或安全上下文无法访问Schannel所需的证书/凭据资源,以下是必须配置的权限与策略:
1. Local Machine证书存储及私钥的读取权限
- 域用户需要对目标证书所在的
LocalMachine存储(通常是My/个人存储)拥有读取权限,同时必须能读取证书对应的私钥:- 打开
certlm.msc(本地计算机证书管理器),找到目标证书,右键→所有任务→管理私钥,添加域用户或其所属组,授予读取权限。 - 检查私钥文件的ACL:证书私钥存储在
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys目录下,通过证书的详细信息→私钥容器名称找到对应文件,右键→属性→安全,添加域用户并授予读取权限。
- 打开
2. 本地安全策略中的用户权限分配
通过secpol.msc打开本地安全策略,确保域用户或其所属组拥有以下权限:
- 允许通过远程桌面服务登录:保障RDP登录的会话合法性。
- 允许本地登录:部分Schannel操作依赖本地登录上下文的权限。
- 访问此计算机从网络:确保域用户能访问本地机器的网络凭据资源。
3. Schannel相关的安全策略配置
- 打开
secpol.msc→本地策略→安全选项,找到网络安全: 允许Schannel使用的加密类型,确保配置没有限制域用户的加密上下文访问(默认配置通常允许,但需确认未被自定义限制)。 - 确保域用户属于本地用户组或Remote Desktop Users组,这些组默认拥有访问本地凭据资源的基础权限。
4. 代码层面的补充检查
如果权限配置后仍有问题,可检查SCHANNEL_CRED结构体的参数是否完整:
- 若使用
LocalMachine证书,可尝试添加SCH_CRED_NO_SYSTEM_MAPPER标志到credData.dwFlags,避免Schannel尝试映射系统凭据时出现会话问题:credData.dwFlags = SCH_CRED_NO_SYSTEM_MAPPER;
内容的提问来源于stack exchange,提问作者Morag Hughson
相关产品推荐
相关产品推荐

