来自 LookupAccountSid() 的"The parameter is incorrect"错误

"The parameter is incorrect" error from LookupAccountSid()

本文关键字:parameter is incorrect 错误 The 来自 LookupAccountSid      更新时间:2023-10-16

我以为我在MSDN上正确阅读了文档,但显然我没有?我不完全确定我到底做错了什么,我准备把我的头发拔出来。

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

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363646 (v = vs.85) . aspx

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

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

https://msdn.microsoft.com/en-us/library/windows/desktop/aa379166 (v = vs.85) . aspx

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;

编辑

经过一些调试后,我发现stringsofset和UserSidOffset包含相同的值。所以看起来偏移量指向不正确…这就是为什么我不能传递一个有效的SID到API。

有人知道吗?

cchName [in, out]

在输入时,指定lpName缓冲区的大小(以TCHARs为单位)。如果由于缓冲区太小或cchName为零导致函数失败,cchName接收所需的缓冲区大小,包括结束的null字符。

cchReferencedDomainName [in, out]

在输入时,以TCHARs的形式指定lpReferencedDomainName缓冲区的大小。如果由于缓冲区太小或cchReferencedDomainName为零而导致函数失败,则cchReferencedDomainName接收所需的缓冲区大小,包括结束的空字符。

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