商城首页欢迎来到中国正版软件门户

您的位置:首页 >Windows 获取文件所有者名称的实现方法

Windows 获取文件所有者名称的实现方法

  发布于2026-02-27 阅读(0)

扫一扫,手机访问

Windows 系统中获取文件所有者名称的等效实现方法

在 Windows 上,Python 标准库不支持 pwd.getpwuid(),因其依赖 Unix 的用户数据库;需借助 PyWin32 调用 Windows 安全 API 获取文件所有者 SID 并解析为可读用户名。

在 Windows 上,Python 标准库不支持 `pwd.getpwuid()`,因其依赖 Unix 的用户数据库;需借助 PyWin32 调用 Windows 安全 API 获取文件所有者 SID 并解析为可读用户名。

在类 Unix 系统(如 Linux、macOS)中,pwd.getpwuid(uid) 是获取指定用户 ID 对应用户名的标准方式。但该功能基于 POSIX 用户数据库(/etc/passwd),而 Windows 使用完全不同的安全模型——以安全标识符(SID)为核心,通过访问控制列表(ACL)和安全描述符管理权限与所有权。因此,Python 标准库中的 pwd 模块在 Windows 上不可用,直接导入会触发 ModuleNotFoundError;同理,pathlib.Path.owner() 方法在 Windows 下也始终抛出 NotImplementedError。

✅ 推荐方案:使用 PyWin32(安全、简洁、生产就绪)
PyWin32 是最成熟、广泛使用的 Windows 原生接口封装库。安装后,可通过 win32security 模块安全地查询文件所有者:

import win32security
import win32con

def get_file_owner(path: str) -> str:
    """返回指定路径文件/目录的所有者,格式为 'DOMAIN\\Username'"""
    try:
        # 获取文件的安全描述符(仅请求 OWNER 信息,最小权限)
        sd = win32security.GetFileSecurity(
            path, 
            win32security.OWNER_SECURITY_INFORMATION
        )
        owner_sid = sd.GetSecurityDescriptorOwner()
        # 将 SID 解析为可读的账户名
        name, domain, _ = win32security.LookupAccountSid(None, owner_sid)
        return f"{domain}\\{name}"
    except Exception as e:
        raise OSError(f"无法获取 {path} 的所有者信息:{e}")

# 示例用法
print(get_file_owner(r"C:\Windows"))  # 输出类似:NT AUTHORITY\\SYSTEM
print(get_file_owner("."))           # 输出当前目录所有者,如:MYDOMAIN\\Alice

⚠️ 注意事项:

  • 权限要求:调用 GetFileSecurity 可能需要对目标文件具有 READ_CONTROL 权限;若无权限(如系统保护文件),将抛出 pywintypes.error(对应 Windows 错误码 5 或 1309)。建议添加异常处理。
  • 路径规范:确保传入绝对路径或当前工作目录下存在的有效路径;相对路径需注意上下文。
  • 依赖安装:执行 pip install pywin32 后,首次运行可能需手动执行 python Scripts/pywin32_postinstall.py -install(尤其在虚拟环境中)以注册 COM 组件(现代版本通常自动完成)。
  • 域账户兼容性:LookupAccountSid 自动适配本地账户(COMPUTERNAME\user)与域账户(DOMAIN\user),无需额外判断。

❌ 替代方案慎选:ctypes 直接调用 WinAPI
虽然可通过 ctypes 调用 GetFileSecurity, LookupAccountSid 等底层 API 实现零依赖,但需手动处理内存分配、错误码转换、缓冲区大小计算及结构体定义。代码冗长易错,轻微失误(如指针越界、未释放句柄)可能导致进程崩溃(AccessViolation)而非 Python 异常,调试成本极高。除非有强约束(如禁止第三方包),否则不推荐。

? 总结:
在 Windows 上替代 pwd.getpwuid() 的标准实践是使用 PyWin32 的 win32security 模块——它封装了复杂的安全 API,提供健壮、可读、可维护的接口。避免自行实现底层逻辑,优先选用经过充分测试的生态工具。对于跨平台项目,建议封装抽象层,根据 os.name == 'nt' 动态选择 pwd.getpwuid() 或 win32security 实现,保障代码一致性与可移植性。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注