簡體   English   中英

如何可靠地檢查工作站上當前用戶的Windows域ID

[英]How to reliably check the windows domain id of current user on a workstation

我正在使用C#和.Net Framework 4。

我正在尋找一種萬無一失的方法來獲取當前登錄的Windows用戶的登錄ID,該用戶不會受到冒充或黑客攻擊。 我正在尋找以下形式:DOMAINNAME \\ USERNAME

例如SOMEDOMAIN \\ JohnDoe

目前我所擁有的最好的是:

var identity = System.Security.Principal.WindowsIdentity.GetCurrent();
var currentLoginId = identity.Name;

這是否可以模仿(在知道用戶名和密碼的人之外),如果是這樣,有更好的方法嗎?

此時可能至少涉及四種不同的身份:

  1. 分配給線程的標識
  2. 分配給流程的標識
  3. 啟動該過程的用戶的帳戶
  4. 登錄PC的用戶的帳戶

在你的代碼中你得到(1)。 這通常很好,通常與(2)相同。

要檢索(2),您可以:

  1. 調用WindowsIdentity.GetCurrent以獲取模擬身份
  2. 通過調用Win32 RevertToSelf函數撤消模擬
  3. 查看WindowsIdentity.GetCurrent以獲取基礎進程標識
  4. 通過模擬步驟(1)中的標識重置線程標識

除非您編寫了更改進程標識的非托管代碼,否則(2)和(3)將是相同的。 正如@Daniel所指出的那樣,(3)和(4)在Windows“run as”命令存在時可能合法地不同。

編輯:您可以相信當前的WindowsIdentity就是它所說的那樣,只要您可以信任應用程序中的任何給定數據。

您可以通過將調試器附加到您的進程並偽造此調用的返回值來欺騙它,但是如果您要這樣做,您也可以偽造將您的用戶名傳遞給數據庫的代碼段。

100%安全的方法是使用集成身份驗證/ SSPI連接到數據庫。

只有部分答案:

我相信System.Security.Principal.WindowsIdentity.GetCurrent(); 將返回與當前正在執行的線程關聯的Windows用戶帳戶。 如果線程或應用程序是在與登錄用戶不同的用戶帳戶下啟動的,那么在使用它之后您將無法獲得所需的內容。

如果您可以確定您的應用程序沒有使用“run-as”功能(或編程方式)開​​始,並且您沒有在線程的身份內部做任何事情,您可能可以確定這是登錄用戶的帳戶,但我不是100%。

通過使用ADSI可以找到與運行應用程序的窗口“session”相關聯的用戶帳戶(請參閱System.DirectoryServices)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM