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

Cygwin下ConvertStringSidToSidA解析S-1-22-1-1报ERROR_INVALID_SID求解决

问题分析与解决方案:Cygwin自定义SID无法被Windows原生API识别

报错原因

  • Windows原生的ConvertStringSidToSidA API仅支持微软官方定义的SID命名空间(比如S-1-5对应NT AUTHORITY、S-1-1对应World等),而S-1-22-*是Cygwin为映射Unix用户/组到Windows环境自定义的SID范围,不属于Windows原生支持的SID体系,因此原生API会返回ERROR_INVALID_SID。
  • Cygwin自身工具(如getent、ls)能识别这类SID,是因为它们依赖Cygwin内部库函数处理自定义SID映射,而非直接调用Windows原生API。

解决方案

根据程序运行环境,选择以下处理方式:

1. 程序基于Cygwin编译运行(推荐)

放弃使用Windows原生的ConvertStringSidToSidA,改用Cygwin提供的工具或内部函数:

  • 直接解析getent passwd输出:你已能通过bash -c 'getent passwd "Unix_User+1"'拿到完整条目,可提取其中的UID(4278190081)或SID字符串,自行处理用户信息。
  • 使用Cygwin内部API:调用cygwin_internal系列函数(如CW_GETSIDFROMNAME)获取对应用户的SID,或CW_GETNAMEFROMSID反向解析,这些函数能识别Cygwin自定义的SID格式。示例代码片段:
    #include <cygwin/version.h>
    #include <sys/cygwin.h>
    
    char sid_str[256];
    if (cygwin_internal(CW_GETSIDFROMNAME, "Unix_User+1", sid_str, sizeof(sid_str)) == 0) {
        // sid_str 会被填充为 "S-1-22-1-1",可用于Cygwin环境内的后续处理
    }
    

2. 程序为原生Windows程序(如MSVC编译)

如果必须依赖Windows原生API处理,需手动实现S-1-22-*格式SID的解析与构造:

  • 明确Cygwin的SID规则:S-1-22-1-N对应Unix用户UID=N,S-1-22-2-N对应Unix组GID=N。
  • 手动构造SID结构体:拆分SID字符串字段,填充SID结构体的各个成员(权威机构标识符设为22,子权限数组添加对应数值),绕过ConvertStringSidToSidA的格式校验。

补充说明

Cygwin的自定义SID是为在Windows环境中模拟Unix用户/组权限体系设计的,仅在Cygwin生态内有效。跨环境处理时,优先使用Cygwin提供的工具链或API,避免直接依赖Windows原生的SID处理函数。

内容的提问来源于stack exchange,提问作者Cedric Blancher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:15