2012-10-26 67 views
4

問題如何獲取當前Windows用戶的*網絡*身份,而不是他們的交互式登錄身份?

什麼是.NET(或P/Invoke的非託管的Windows API)方法調用來獲取當前進程的網絡身份用來連接到SSPI認證的網絡服務,如作爲SQL Server?


具體使用情況我心目中就是一個可以在非加入域的機器上工作,並使用runas /noprofile /netonly /USER:DOMAIN\username推出它使用DOMAIN\username身份進行網絡身份驗證,而不是他們的地方MACHINE\username記錄過程 - 身份。

我想要的方法調用讓我在這裏傳遞給RUNASDOMAIN\username標識。

謝謝!


要清楚,我不尋找的方法調用來獲取當前用戶的本地登錄的身份(這可能比網絡標識不同)。這不包括System.Security.Principal.WindowsIdentity.GetCurrent().NameEnvironment.UserName和可能System.Threading.Thread.CurrentPrincipal.Identity.Name被接受的答案。除非我在這裏顯示錯誤,否則我會對任何錯誤地指出這些解決方案的答案進行倒退。 :)

+0

你的問題有點混亂。您是否試圖從啓動的流程中獲取用戶名? –

+0

是的。這個代碼應該被執行的過程是'runas'ed –

+0

它*可能*排除他們?你有沒有試過它們?而你最後一點聽起來有點對抗,因爲你在尋求別人的幫助。如果你已經嘗試了一些事情(就像你聽到的那樣),那麼你當然應該透露一下,以幫助你更輕鬆地解決你的問題,但是IMO沒有必要走得太遠。 –

回答

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使用CreateProcessWithLogonW與LOGON_NETCREDENTIALS_ONLY標誌。這會基於現有的登錄會話創建一個新的登錄會話,並將淨憑證隱藏在其中。 GetTokenInformation和LsaGetLogonSessionData返回有關原始用戶的信息,而不是網絡用戶。必須瞭解網絡用戶的Windows的一點是SSPI,以便它可以將用戶名和域發送到遠程服務器。因此上面的代碼。

相關問題