c++如何获取文件所属的Owner用户名与权限组信息【详解】

夜明吖_3154

夜明吖_3154

2026-03-27

424人浏览

原创

stat命令可快速查owner和group:linux用stat -c "%u:%g",macos用stat -f "%su:%sg";c++需stat()获uid/gid再调getpwuid_r()/getgrgid_r()转名,失败时应fallback数字;windows须用acl api查sid并转换。

c++如何获取文件所属的owner用户名与权限组信息【详解】

Linux/macOS 下用 stat 命令快速查 Owner 和 Group

直接在终端运行 stat 是最轻量、最可靠的方式,不依赖 C++ 编译或第三方库。它输出明确,且和系统底层一致。

  • stat -c "%U:%G" /path/to/file(Linux)返回类似 alice:devs
  • stat -f "%Su:%Sg" /path/to/file(macOS)效果相同,但格式符不同
  • 注意:路径必须存在且有读取权限,否则报错 stat: cannot stat '/xxx': No such file or directory
  • 脚本中调用时建议加 2>/dev/null 避免错误干扰输出

C++ 用 stat() 系统调用获取 uid/gid,再查用户名组名

stat() 只返回数字型的 st_uid 和 st_gid,要转成可读名称,得查系统数据库(/etc/passwd、/etc/group),这步容易出错。

  • 用 getpwuid_r() 和 getgrgid_r()(带 _r 后缀)——它们线程安全,避免静态缓冲区覆盖
  • 别用 getpwuid(),它返回指向内部静态内存的指针,在多线程或重入场景下会返回错误名字
  • 用户/组可能不存在(如 NFS 挂载点、容器环境),getpwuid_r() 返回 NULL 时应 fallback 到打印 uid/gid 数字
  • 示例关键片段:
    struct stat sb;<br>if (stat("/tmp/test", &sb) == 0) {<br>    struct passwd pwd, *result;<br>    char buf[1024];<br>    getpwuid_r(sb.st_uid, &pwd, buf, sizeof(buf), &result);<br>    const char* owner = result ? result->pw_name : std::to_string(sb.st_uid).c_str();<br>}

Windows 上没有 Owner/Group 概念,得走 ACL API

Windows 用安全描述符(SECURITY_DESCRIPTOR)和访问控制列表(ACL)管理权限,Owner 是 SID(安全标识符),不是用户名字符串。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
  • 调用 GetNamedSecurityInfo() 或 GetSecurityInfo() 获取 SECURITY_DESCRIPTOR
  • 再用 LookupAccountSidA() 把 Owner SID 转成 DOMAIN\user 格式
  • 失败很常见:当前进程没 SE_SECURITY_NAME 权限(需管理员)、目标文件在重定向卷(如 OneDrive)、SID 不属于本地或可信域
  • 别指望 GetFileAttributesEx() 或 FindFirstFile() 返回 Owner——它们根本不提供该信息

跨平台封装要注意的三个实际坑

写一个统一接口时,表面逻辑一样,底层行为差异极大,容易漏掉边界。

  • Linux/macOS 的 getpwuid_r() 查的是本地 /etc/passwd,容器里可能为空;Windows 的 LookupAccountSidA() 在域环境中可能跨网络查询,超时或失败
  • 权限组(Group)在 Windows 上没有直接对应物,通常只取 Primary Group,但它的语义和 POSIX group 不等价
  • 符号链接处理:默认 stat() 跟链接,想查链接文件自身元数据得用 lstat();Windows 的 GetNamedSecurityInfo() 默认不解析符号链接,需手动处理

C++ 里“获取 Owner 和 Group”这件事,本质是拼两段:先拿 uid/gid,再查名字。第二段才是真正的麻烦来源——它依赖系统服务、权限、配置,且失败时很难优雅降级。别假设 getpwuid_r() 一定成功,也别在 Windows 上硬套 Unix 思维。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

509

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.04

11160

5

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

943

5

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

2025.06.11

6730

9

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.07

2662

7

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1538

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2224

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

5724

49

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习