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"";
}
Другие вопросы по тегам