如果我使用 service-account (SA1) 启动一个 Windows 服务,但是在服务代码中如果我想使用 gMSA 或 sMSA 访问网络中的某些外部服务,是否可能?
windows操作系统是否允许使用一个帐户旋转的进程(应用程序/服务)在网络调用过程中使用其他帐户完成NTLM或Kerberos身份验证?
如果我想使用 MSA,我相信不需要密码,但如果我想使用一些不同的用户帐户,服务将如何接收密码?
正在运行的线程的身份存储在线程令牌中。 您可以使用
LogonUser
和其他函数创建令牌,并使用 SetThreadToken
使用该令牌。 WindowsIdentity.RunImpersonated
是一个包装器,可让您轻松执行“设置-运行-恢复”步骤。 Elastic 很好地概述了 Windows 令牌的工作原理。
网络连接基于缓存的凭据。 模拟允许网络访问,但如果没有本地资源并且您对执行 ACL 检查不感兴趣,则可能没有必要。 对于“仅网络”访问,您可以使用
WNetAddConnection*
(或包装器)直接添加缓存凭据。 这类似于跑步net use ...
。 在无法进行身份验证的情况下(从工作组计算机或没有到 DC 的视线时),也可以使用缓存的凭据。
正如您在有关 MSA 的其他问题中提到的,MSA 大多是普通帐户,并且确实有密码。 密码未加密地存储在 LDAP 中,并会不时自动更改。 然后,
msDS-ManagedPassword
属性会被 ACL 控制,因此只有某些计算机/调用者可以访问它。 要让系统在调用 LogonUser
期间自动检索它,请指定 SERVICE_ACCOUNT_PASSWORD
然后模拟。 否则通过任何方式找回密码,然后拨打WNetAddConnection*
。