我的应用程序需要将大量PSID
转换为友好域\用户名字符串。
可以使用LookupAccountSid
完成此操作。不幸的是,这个API需要在许多地方嗅探以解决SID,包括可能的网络调用。因此,我想缓存以前见过的SID。
我目前正在使用哈希表(CMap)执行此操作,该表由SID的字符串表示键入,即ConvertSidToStringSid
的结果。这工作正常,但我想知道是否有一个众所周知,高效,可靠的SID哈希例程,所以我不必转换为字符串?
可能将SID复制到字节缓冲区并散列缓冲区?或者通过其他API遍历SID本身的结构?
答案 0 :(得分:0)
可以存储SID结构的字节。 SID结构的长度是可变的,因此您必须首先使用GetLengthSid函数检索它。
以下是我使用的Qt中的一个实现,用于将值存储在QByteArray。
中PSID sid = ...
// retreive the length in bytes of the sid structure
DWORD sidSize = GetLengthSid(sid);
// check that sidSize fits into QByteArray::fromRawData
Q_ASSERT(sidSize <= INT_MAX);
QByteArray baSid = QByteArray::fromRawData((char *) sid, sidSize);
QByteArray::fromRawData
仅包装数据而不进行复制。如果需要副本,请使用构造函数QByteArray::QByteArray(const char *data, int size = -1)
。
然后,您可以将字节数组存储在任何Qt容器中,例如QSet。
请注意GetLengthSid
返回DWORD
(在我的系统中定义为unsigned long
),fromRawData
接受int
。我从未对该对话产生任何问题,但我在测试中包含了值不是太大的问题,INT_MAX
宏来自climits
标题。
如果构造PSID
,则可以使用constData
轻松将字节数组转换回fromRawData
。
PSID sid = (PSID) baSid.constData();
我没有在未构造constData
时测试fromRawData
,但文档指出:
除非创建了QByteArray对象,否则数据将被'\ 0'终止 来自原始数据。
不幸的是,此代码依赖于Qt框架,但它也应该与其他容器一起使用,例如std::vector
。