我以为我在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。
任何?
答案 0 :(得分:2)
cchName [in,out]
在输入时,指定lpName缓冲区的大小(以TCHAR为单位)。如果函数因缓冲区太小或cchName为零而失败,则cchName会收到所需的缓冲区大小,包括终止空字符。
cchReferencedDomainName [in,out]
在输入时,指定lpReferencedDomainName缓冲区的大小(以TCHAR为单位)。如果函数因缓冲区太小或cchReferencedDomainName为零而失败,则cchReferencedDomainName会收到所需的缓冲区大小,包括终止空字符。
在调用UsernameBufferSize
之前,您需要将数组大小分配给DomainBufferSize
和LookupAccountSid()
。或者,或者将它们设置为零,然后动态分配UsernameBuffer
和DomainBuffer
,然后再次调用LookupAccountSid()
。