如何获取当前 Windows 用户的 *网络* 标识,而不是其交互式登录标识?



>问题

获取用于连接到经过 SSPI 身份验证的网络服务(如 SQL Server)的当前进程的网络标识的 .NET(或对非托管 Windows API 的 p/invoke)方法调用是什么?


我想到的特定用例是,可以在未加入域的计算机上工作,并使用runas /noprofile /netonly /USER:DOMAINusername启动一个进程,该进程使用该DOMAINusername标识进行网络身份验证,而不是其本地MACHINEusername登录标识。

我希望将给我DOMAINusername身份的方法调用传递给RUNAS这里。

谢谢!


需要明确的是,我不是在寻找方法调用来获取当前用户的本地登录身份(可能与网络身份不同)。这排除System.Security.Principal.WindowsIdentity.GetCurrent().NameEnvironment.UserName,可能System.Threading.Thread.CurrentPrincipal.Identity.Name被接受的答案。我会否决任何错误地表明其中任何一个是解决方案的答案,除非我在这里被证明是错误的。:)

这将打印出站连接的用户(格式为"user@domain")。 这是C++。

CredHandle credHandle;
TimeStamp timeStamp;
SECURITY_STATUS status = AcquireCredentialsHandle(0, L"Negotiate", SECPKG_CRED_OUTBOUND, 0, 0, 0, 0, &credHandle, &timeStamp);
if (status == SEC_E_OK)
{
SecPkgCredentials_Names names;
status = QueryCredentialsAttributes(&credHandle, SECPKG_CRED_ATTR_NAMES, &names);
if (status == SEC_E_OK)
{
wprintf(L"%sn", names.sUserName);
status = FreeContextBuffer(names.sUserName);
}
status = FreeCredentialsHandle(&credHandle);
}

其他一些信息:我猜runas正在使用带有LOGON_NETCREDENTIALS_ONLY标志的CreateProcessWithLogonW。 这将基于现有登录会话创建新的登录会话,其中隐藏了网络凭据。 GetTokenInformation 和 LsaGetLogonSessionData 返回有关原始用户的信息,而不是网络用户的信息。 必须知道的有关网络用户的一点 Windows 是 SSPI,以便它可以将用户名和域发送到远程服务器。 因此,上面的代码。

最新更新