来自 LookupAccountSid() 的"The parameter is incorrect"错误
"The parameter is incorrect" error from LookupAccountSid()
我以为我在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()
之前,您需要为UsernameBufferSize
和DomainBufferSize
分配数组大小。或者将它们设置为零,然后动态分配UsernameBuffer
和DomainBuffer
,然后再次调用LookupAccountSid()
。
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- Is !NaN not a NaN?
- Directx 11 - CompileFromFile() is not compiling
- Centos7 g++ "to_string is not in a member of std"
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- Where is std::hardware_destructive_interference_size?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 修复"-Wunused-parameter"取决于预处理器条件的警告
- What is unordered_set in C++
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- C++ is calculating wrong
- CUDA 内核"Only a single pack parameter is allowed"解决方法?
- "useinbandfec is a unidirectional receive-only parameter"作品中是什么意思?
- 在 C++ 中从 WMI(Win32_LogicalDisk 类)调用 Chkdsk -> 'Parameter is not valid'
- 来自 LookupAccountSid() 的"The parameter is incorrect"错误