4

问题

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


我想到的特定用例是可以在未加入域的机器上工作并用于runas /noprofile /netonly /USER:DOMAIN\username启动使用该DOMAIN\username身份进行网络身份验证的进程,而不是使用本地MACHINE\username登录身份。

DOMAIN\username我想要给我传递给RUNAS这里的身份的方法调用。

谢谢!


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

4

1 回答 1

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,以便它可以将用户名和域发送到远程服务器。因此上面的代码。

于 2012-10-28T17:29:50.683 回答