2013-05-06 8 views
0

.evt 파일 (이벤트 로그)에서 가져 오는 사용자 SID의 사용자 계정 이름을 가져 오려고합니다. 지금까지 파일을 성공적으로 읽었으며 이벤트가 기록 될 때 활성 사용자의 SID에 액세스 할 수 있습니다. 내가 로컬있는 .evt 파일을 시도하지만 내있는 .evt 파일의 많은에서 때.evt 파일의 WinAPI 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; 
     } 

이 잘 작동 :

내가 LookupAccountSid로 기능을 사용하고이 SID에서 사용자 이름을 얻으려면 원격 컴퓨터, 그리고 이것이 문제가되는 곳입니다. 실제로 원격 컴퓨터 이름을 사용하려고하면 ERROR_NONE_MAPPED 코드가 표시됩니다.
많은 연구 후에, 나는 여전히 문제를 해결할 수없는 (그리고 이것은 성가신 일 시작)

:
내가 문제를 수정하기 위해 임의의 잘못된 컴퓨터 이름으로 시도하고 나는 오류 1722 : rpc 서버를 사용할 수 없습니다 마녀 예상, 그래서 내가 rpc 연결할 수 있어요 (내가 올바른 이름을 줄 때). 당신은 인/아웃 매개 변수에 여러 개의 동일한 size 변수를 사용하는

+1

의 SID는이 생성 된 도메인에서만 유효합니다. 해당 "원격"시스템이 도메인의 일부가 아닌 경우 번호에서 아무 것도 검색 할 수 없습니다. 가짜 사용자 이름을 선택하여 생성하는 출력이 읽기 쉽도록합니다. –

+0

@HansPassant 맞습니다. 문제는 내가받는 SID가 실제로 ** Active Directory ** SID라는 것입니다. 그래서 그들은 원격 머신에 등록되어 있지 않고 ldap 서버에 등록되어 있습니다. 나는 LDAP 요청 및 SID 조사에 집중하려고 노력할 것입니다. – Bastien

답변

2

는, 사전에 감사합니다. 그러지 마. 대신 별도의 변수를 사용하십시오. 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