如何获取当前Windows用户的* network *身份,而不是他们的交互式登录身份?

时间:2012-10-26 20:41:34

标签: .net windows winapi windows-identity

问题

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


我想到的具体用例是,可以在非域加入的计算机上工作,并使用runas /noprofile /netonly /USER:DOMAIN\username启动使用DOMAIN\username身份进行网络身份验证的进程,而不是他们的本地MACHINE\username登录身份。

我希望方法调用能够在此处将DOMAIN\username身份传递给RUNAS

谢谢!


要清楚,我 NOT 正在寻找方法调用以获取当前用户的本地登录身份(可能与网络身份不同)。此排除了 System.Security.Principal.WindowsIdentity.GetCurrent().NameEnvironment.UserName以及可能System.Threading.Thread.CurrentPrincipal.Identity.Name被接受的答案。我会低估任何错误地表明这些都是解决方案的答案,除非我在这里被证明是错的。 :)

1 个答案:

答案 0 :(得分:2)

这将打印用户(格式为“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"%s\n", names.sUserName);
        status = FreeContextBuffer(names.sUserName);
    }
    status = FreeCredentialsHandle(&credHandle);
}

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