如何正确调用LsaLookupSids2函数将安全描述符SID转换为文本名称
你调用LsaLookupSids2报错的核心原因有两处:
- 参数格式不符合要求:函数第四个参数需要传入PSID类型的数组首地址,你直接传入
&sd->Owner不符合规范,SECURITY_DESCRIPTOR的Owner字段本身就是PSID类型,需要先将其放入PSID数组再传参。 - LSA策略权限不足:
LsaOpenPolicy需要申请POLICY_LOOKUP_NAMES权限才能执行SID查找操作,你使用的POLICY_EXECUTE权限不满足要求。
修正方案1:调整原有LSA调用代码
首先修改LsaOpenPolicy的权限参数:
res2 = LsaOpenPolicy(NULL, &polAttrs, POLICY_LOOKUP_NAMES, &polHandle);
再修改LsaLookupSids2的传参逻辑:
// 构造PSID数组 PSID sid_arr[] = {sd->Owner}; res2 = LsaLookupSids2(polHandle, 0, 1, sid_arr, &domains, &names);
修正方案2:使用更简化的LookupAccountSid接口
如果只需要转换单个SID,不需要批量处理的话,无需调用复杂的LSA系列接口,使用LookupAccountSid更简单,也不需要额外打开LSA策略句柄:
WCHAR acc_name[256] = {0}; DWORD acc_len = 256; WCHAR dom_name[256] = {0}; DWORD dom_len = 256; SID_NAME_USE sid_type; if (!LookupAccountSidW( NULL, sd->Owner, acc_name, &acc_len, dom_name, &dom_len, &sid_type )) { fprintf(stderr, "LookupAccountSid failed with error %d\n", GetLastError()); exit(EXIT_FAILURE); } // 输出转换结果示例 wprintf(L"所有者账户:%s\\%s\n", dom_name, acc_name);
额外注意事项
你当前的代码漏掉了NetShareGetInfo返回结构体的内存释放逻辑,处理完数据后需要调用NetApiBufferFree(info)释放内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者eciii
相关产品推荐
相关产品推荐

