2016-11-08 77 views
0

Win32API函數LookupAccountSID()允許解析與SID對應的名稱。根據文檔: LookupAccountSid function僅使用本地信息解析SID中的用戶名

的功能執行LookupAccountSid嘗試通過第一檢查衆所周知的SID列表中找到名稱爲指定的SID。如果提供的SID與衆所周知的SID不一致,則該功能會檢查內置和管理定義的本地帳戶。接下來,該函數檢查主域。根據與其SID前綴相對應的受信任域來檢查主域未識別的安全標識符。

有什麼方法只在本地查找名稱?也就是說,如果在調用函數的PC中找不到該名稱,則該函數將失敗,而不是檢查主域。

編輯:要清楚,我想解決非本地用戶的名稱,而無需訪問主域(如果該信息已被存儲在本地只檢查)

+1

您可以反轉該問題:確定SID是否爲域SID,如果是,則不要查找它。域SID是以S-1-5-21開頭,然後*不*使用[機器SID](http://stackoverflow.com/questions/14113558/)作爲其域值的域。還有什麼是內置帳戶和本地帳戶。免責聲明:未經測試。 –

+0

問題是我想查找有關本地存儲的域用戶的信息。如果某位非本地用戶已登錄,則即使計算機處於脫機狀態,LookupAccountSid也會返回正確的名稱。 – ggarcia24

+0

這由LSA緩存管理。沒有官方的界面。有些工具可以轉儲它(比如mimikatz),但這些工具往往是爲了黑客的目的,而且大多數網絡管理員都不願意用張開雙臂歡迎。您對於查詢域名信息的確切關注點 - 網絡流量發生的事實,查詢可能需要很長時間的事實,還有其他的事實?您可以簡單地通過在一段時間之後取消查找來處理超時,本地查找永遠不會超過。 –

回答

0

不知道這是否就是你」重新但值得一後射門:

byte[] sid = // your SID byte array 
// Convert SID byte array to readable SID string 
var sidString = (new SecurityIdentifier(sid, 0)).Value; 
var securityIdentifier = new SecurityIdentifier(sidString); 
var identity = securityIdentifier.Translate(typeof(NTAccount)).Value; 
// ... identity should be domain\user (string) 
+0

不使用,當使用本地PC中不存在的域用戶的SID時,上面的代碼查找主域中的信息。理想情況下,當使用本地不知道的SID時,代碼不應連接到外部資源。 – ggarcia24

+0

對不起,我出來的想法:( – peteski

0

你可以查詢Win32_UserAccount WMI class本地帳戶與有問題的SID - 如果返回任何內容,帳戶沒有在本地計算機上存在:

$SID = 'S-1-5-21-510807130-1270608819-2073245338-500' 
if($user = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True' AND SID = '$SID'") 
{ 
    $user.Name 
} 
+0

事情是我想要的非本地帳戶的信息。調用LookUpAccountSid()與SID的某個點上登錄的域用戶,即使計算機是成功返回離線,這表明它存儲在緩存中。 – ggarcia24