如何将UNIX的nobody与nogroup映射到Win32账户/SID?
UNIX "nobody"/"nogroup" 到 Win32 SID/账户的映射方案
核心映射关系
- UNIX 的
nobody用户 → Windows 的 匿名登录账户(Anonymous Logon),固定SID为S-1-5-7 - UNIX 的
nogroup组 → Windows 的 Everyone 组,固定SID为S-1-1-0
不依赖Cygwin的Win32实现方法
1. 生成预定义SID(推荐用CreateWellKnownSid)
Windows原生API CreateWellKnownSid 可直接生成系统内置的标准SID,无需依赖外部配置文件:
- 生成
nobody对应SID:指定WinAnonymousSid参数 - 生成
nogroup对应SID:指定WinWorldSid参数
示例C代码:
#include <windows.h> #include <sddl.h> // 获取对应nobody的匿名用户SID BOOL GetNobodySID(PSID* pSid) { DWORD sidSize = SECURITY_MAX_SID_SIZE; *pSid = LocalAlloc(LPTR, sidSize); if (!*pSid) return FALSE; return CreateWellKnownSid(WinAnonymousSid, NULL, *pSid, &sidSize); } // 获取对应nogroup的Everyone组SID BOOL GetNoGroupSID(PSID* pSid) { DWORD sidSize = SECURITY_MAX_SID_SIZE; *pSid = LocalAlloc(LPTR, sidSize); if (!*pSid) return FALSE; return CreateWellKnownSid(WinWorldSid, NULL, *pSid, &sidSize); }
2. 将SID解析为账户名(用LookupAccountSid)
拿到SID后,可通过LookupAccountSid转换为可读的账户名:
#include <stdio.h> void PrintAccountName(PSID sid) { TCHAR name[256], domain[256]; DWORD nameSize = sizeof(name)/sizeof(TCHAR); DWORD domainSize = sizeof(domain)/sizeof(TCHAR); SID_NAME_USE sidType; if (LookupAccountSid(NULL, sid, name, &nameSize, domain, &domainSize, &sidType)) { _tprintf(_T("账户: %s\\%s\n"), domain, name); } else { _tprintf(_T("LookupAccountSid 失败,错误码: %lu\n"), GetLastError()); } }
3. 直接使用固定SID字符串
如果不需要动态生成,可直接用固定SID字符串,通过ConvertStringSidToSid转为SID结构:
PSID sid; // 转换nobody对应的SID字符串 if (ConvertStringSidToSid(_T("S-1-5-7"), &sid)) { // 使用sid LocalFree(sid); } // 转换nogroup对应的SID字符串 if (ConvertStringSidToSid(_T("S-1-1-0"), &sid)) { // 使用sid LocalFree(sid); }
注意事项
- 匿名登录账户权限极低,和UNIX
nobody的权限特性匹配;Everyone组包含所有用户(含匿名用户),符合nogroup作为无归属组的特性 - Cygwin生成的SID是自定义标识符,不属于Windows原生体系,因此无法被
LookupAccountSid识别,必须使用Windows内置的标准SID
内容的提问来源于stack exchange,提问作者Martin Wege
相关产品推荐
相关产品推荐

