You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确调用LsaLookupSids2函数将安全描述符SID转换为文本名称

你调用LsaLookupSids2报错的核心原因有两处:

  1. 参数格式不符合要求:函数第四个参数需要传入PSID类型的数组首地址,你直接传入&sd->Owner不符合规范,SECURITY_DESCRIPTOR的Owner字段本身就是PSID类型,需要先将其放入PSID数组再传参。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:36:03