WinAPI LookupAccountSid from an .evt file

WinAPI LookupAccountSid from an .evt file

本文关键字:evt file an from LookupAccountSid WinAPI      更新时间:2023-10-16

我试图从.evt文件(事件日志)中获取用户SID的用户帐户名称。到目前为止,我已经成功地读取了该文件,并且在记录事件时可以访问活动用户的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(当我给出正确的名称时)。

提前感谢,

您正在为多个输入/输出参数使用相同的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"";
}