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