WinAPI LookupAccountSid из файла.evt
Я пытаюсь получить имя учетной записи пользователя SID получить из файла.evt (журнал событий). До сих пор я успешно прочитал файл, и у меня есть доступ к SID активного пользователя во время регистрации события.
Чтобы получить имя пользователя из этого 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 ответ
Вы используете тот же 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"";
}