Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;参数不正确";LookupAccountSid()中的错误_C++_Winapi - Fatal编程技术网

C++ &引用;参数不正确";LookupAccountSid()中的错误

C++ &引用;参数不正确";LookupAccountSid()中的错误,c++,winapi,C++,Winapi,我以为我在MSDN上正确地阅读了文档,但显然我没有?我不完全确定我到底做错了什么,我已经准备好洗刷我的头发了 EVENTLOGRECORD结构的文档提供了到SID的偏移量 UserSidOffset 此事件日志记录中安全标识符(SID)的偏移量。要获取此SID的用户名,请使用LookupAccountSid函数 然后,为了转换这个sid,我们使用LookupAccountSid()API lpSid[in] 指向要查找的SID的指针 我搜索了无数次,找到了与我的实现非常相似但结果相同的示例。

我以为我在MSDN上正确地阅读了文档,但显然我没有?我不完全确定我到底做错了什么,我已经准备好洗刷我的头发了

EVENTLOGRECORD
结构的文档提供了到SID的偏移量

UserSidOffset
此事件日志记录中安全标识符(SID)的偏移量。要获取此SID的用户名,请使用LookupAccountSid函数

然后,为了转换这个sid,我们使用
LookupAccountSid()
API

lpSid[in]
指向要查找的SID的指针

我搜索了无数次,找到了与我的实现非常相似但结果相同的示例。我对Windows API已经生疏了,所以如果我忽视了这个问题,我也不会感到惊讶

最后,这里是我的代码:

size_t BytesRemaining = 0;

while (BytesRemaining < BytesInBuffer)
{
    EVENTLOGRECORD *Record = reinterpret_cast<EVENTLOGRECORD *>(buffer + BytesRemaining);

    char UsernameBuffer[256], DomainBuffer[256];
    DWORD UsernameBufferSize = 256, DomainBufferSize = 256;
    SID_NAME_USE SidType;

    PSID SID = (PSID)((LPBYTE)Record + Record->UserSidOffset);

    if (!LookupAccountSid(NULL, SID, UsernameBuffer, &UsernameBufferSize, DomainBuffer, &DomainBufferSize, &SidType))
    {
        std::cout << "Failed reading SID (" << SID << "): " << GetLastErrorMessage().c_str();
    }
    else {
        std::cout << "I didn't shit on the SID.\n";
    }


    BytesRemaining += Record->Length;
}

bytesInBuffer = 0;
size\u t字节剩余=0;
while(字节剩余用户SidOffset);
if(!LookupAccountSid(NULL、SID、UsernameBuffer和UsernameBufferSize、DomainBuffer和DomainBufferSize和SidType))
{
标准::cout
cchName[输入,输出]

在输入时,以TCHARs为单位指定lpName缓冲区的大小。如果函数因缓冲区太小或cchName为零而失败,cchName将接收所需的缓冲区大小,包括终止的空字符

cchReferencedDomainName[输入,输出]

在输入时,以TCHARs为单位指定lpReferencedDomainName缓冲区的大小。如果函数因缓冲区太小而失败,或者如果CChrereferencedDomainName为零,CChrereferencedDomainName将接收所需的缓冲区大小,包括终止的空字符

在调用
LookupAccountSid()
之前,需要将数组大小分配给
UsernameBufferSize
DomainBufferSize
。或者,将它们设置为零,然后动态分配
UsernameBuffer
DomainBuffer
,然后再次调用
LookupAccountSid()

cchName[输入,输出]

在输入时,以TCHARs为单位指定lpName缓冲区的大小。如果函数因缓冲区太小或cchName为零而失败,cchName将接收所需的缓冲区大小,包括终止的空字符

cchReferencedDomainName[输入,输出]

在输入时,以TCHARs为单位指定lpReferencedDomainName缓冲区的大小。如果函数因缓冲区太小而失败,或者如果CChrereferencedDomainName为零,CChrereferencedDomainName将接收所需的缓冲区大小,包括终止的空字符


在调用
LookupAccountSid()
之前,需要将数组大小分配给
UsernameBufferSize
DomainBufferSize
。或者,将它们设置为零,然后动态分配
UsernameBuffer
DomainBuffer
,然后调用
LookupAccountSid()再次。

在该代码中有很多重新解释的转换。如果可能的话,我会避免。@阿尔夫。在代码< >事件日志> /Code >结构中,指责微软使用可变长度结构和字节偏移量;我不确定如何在C++中以更安全的方式编写这个循环……也可以是<代码> GETLASTReRoMeMeX()。
返回一个
std::string
或相关的字符串,当用iostreams打印它时,你不需要调用
.c_str()
。@andlabs:好的,我想API是基于重新解释的,然后大概事情的对齐是可以的。你不是在检查
记录->用户sidLength
是否为零(在这种情况下,记录中没有SID)也许这就是你的问题了。在这个代码中有很多重新解释的转换。如果可能的话,我会避免。@阿尔夫。在代码< >事件日志> <代码>结构中,我谴责微软使用可变长度结构和字节偏移量;我不确定你如何在C++中以更安全的方式写这个循环……也如果<代码> GETLASTReRoMeMeX()
返回一个
std::string
或相关的字符串,当用iostreams打印它时,你不需要调用
.c_str()
。@andlabs:好的,我想API是基于重新解释的,然后大概事情的对齐是可以的。你不是在检查
记录->用户sidLength
是否为零(在这种情况下,记录中没有SID)因此,这可能是您的问题?即使在设置数组大小之后,我仍然得到
参数不正确。
我尝试动态分配缓冲区,调用API两次,并且..相同的错误:|即使在设置数组大小之后,我仍然得到
参数不正确。
我尝试动态分配缓冲区s、 调用API两次,出现相同错误:|