LookupAccountSid()

时间:2016-08-11 02:13:03

标签: c++ winapi

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

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

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

  

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

然后要转换此sid,我们使用LookupAccountSid() API。

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;

修改

在做了一些调试之后,我发现StringsOffset和UserSidOffset包含相同的值。所以看起来偏移指向不正确...这就是为什么我无法将有效的SID传递给API。

任何?

1 个答案:

答案 0 :(得分:2)

  

cchName [in,out]

     
    

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

  
     

cchReferencedDomainName [in,out]

     
    

在输入时,指定lpReferencedDomainName缓冲区的大小(以TCHAR为单位)。如果函数因缓冲区太小或cchReferencedDomainName为零而失败,则cchReferencedDomainName会收到所需的缓冲区大小,包括终止空字符。

  

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