问题:
什么是.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().Name
和Environment.UserName
以及可能System.Threading.Thread.CurrentPrincipal.Identity.Name
被接受的答案。我会低估任何错误地表明这些都是解决方案的答案,除非我在这里被证明是错的。 :)
答案 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,因此它可以将用户名和域发送到远程服务器。因此上面的代码。