2013-05-06 50 views
0

我試圖從.evt文件(事件日誌)中獲取用戶SID的用戶帳戶名。到現在爲止,我已經成功讀取了該文件,並且可以在事件記錄時訪問活動用戶的SID。從.evt文件中獲取WinAPI LookupAccountSid

要想從本SID我使用執行LookupAccountSid功能的用戶名:

wstring userNameFromSid(SID userSid,wstring computerName) 
     { 
      DWORD size = 256; 
      wchar_t * buff = (wchar_t*)malloc(sizeof(wchar_t)*size); 
      wchar_t * buffDomain = (wchar_t*)malloc(sizeof(wchar_t)*size); 
      SID_NAME_USE SidType; 
      wstring result; 
      SID tmpSid = userSid; 

      if(LookupAccountSid(computerName.c_str(), &tmpSid, buff, &size, buffDomain, &size, &SidType)){ 
       result= buff; 
      } 
      else 
      { 
       /*Here some code to print error in a Message box*/ 
      } 

      free(buff); 
      free(buffDomain); 
      return result; 
     } 

當我嘗試在本地.EVT文件,但我的許多.EVT文件都來自這工作正常遠程計算機,這是問題所在。事實上,當我嘗試使用遠程計算機名稱時,我得到一個代碼爲的ERROR_NONE_MAPPED代碼。
大量的研究後,我仍然解決不了問題(這開始是討厭)


我用隨機假的計算機名稱試圖細化問題,我得到一個錯誤1722 :rpc服務器不可用女巫預計,所以我能夠連接rpc(當我給出正確的名稱)。

謝謝你在前進,

+1

的SID只是對他們所創建的域有效。如果那個「遠程」機器不是域的一部分,那麼就沒有機會從這個數字中找回任何東西。通過挑選虛假的用戶名來避免這種情況,所以你生成的輸出是可讀的。 – 2013-05-06 17:25:38

+0

@HansPassant你說得對,問題是我收到的SID實際上是** Active Directory ** SID,我想。所以他們沒有在遠程機器上註冊,而是在ldap服務器上註冊。我將嘗試關注ldap請求和SID研究。 – Bastien 2013-05-07 08:09:28

回答

2

您輸入/輸出參數使用相同的size變量多。不要這樣做。改爲使用單獨的變量。如果computerName爲空,您也不會考慮。

試試這個:

static const DWORD MAX_BUFF_SIZE = 256; 

wstring userNameFromSid(SID userSid, wstring computerName) 
{ 
    wchar_t buffName[MAX_BUFF_SIZE]; 
    DWORD buffNameSize = MAX_BUFF_SIZE; 
    wchar_t buffDomain[MAX_BUFF_SIZE]; 
    DWORD buffDomainSize = MAX_BUFF_SIZE; 
    SID_NAME_USE SidType; 

    if (LookupAccountSid(!computerName.empty() ? computerName.c_str() : NULL, &userSid, buffName, &buffNameSize, buffDomain, &buffDomainSize, &SidType)) 
    { 
     return buffName; 
    } 

    /*Here some code to print error in a Message box*/ 
    return L""; 
} 
+0

你的代碼絕對比我的代碼更可靠和乾淨。首次調用大小爲1的'LookupAccountSid()'並將「buffName」和「buffDomain」重新分配到合適的大小會更安全。 – Bastien 2013-05-07 08:17:22