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

如何用Python获取文件安全属性中的组/用户名列表?

获取文件安全属性中的组/用户名列表(Python实现)

当然有对应的实现方法,分平台操作如下:

Windows 平台

Windows下可以借助pywin32库调用系统API读取文件的安全描述符,解析出权限列表中的用户和组。

步骤1:安装依赖

pip install pywin32

代码实现

import win32security
import win32api

def get_file_security_principals(file_path):
    # 获取文件的DACL(自主访问控制列表)
    sd = win32security.GetFileSecurity(file_path, win32security.DACL_SECURITY_INFORMATION)
    dacl = sd.GetSecurityDescriptorDacl()
    
    principals = []
    for ace_idx in range(dacl.GetAceCount()):
        ace = dacl.GetAce(ace_idx)
        sid = ace[2]  # 提取ACE中的SID(安全标识符)
        
        try:
            # 将SID转换为可读的域\用户名格式
            name, domain, _ = win32security.LookupAccountSid(None, sid)
            principals.append(f"{domain}\\{name}")
        except win32security.error:
            # 处理无法解析的SID(比如特殊系统账户)
            principals.append(f"SID: {win32security.ConvertSidToStringSid(sid)}")
    
    return list(set(principals))  # 去重后返回

# 示例调用
if __name__ == "__main__":
    target_file = r"C:\Users\YourName\Desktop\test.txt"
    print("文件的组/用户名列表:")
    print(get_file_security_principals(target_file))

Linux/macOS 平台

类Unix系统可以通过两种方式实现:调用系统命令getfacl,或者使用pylibacl库直接操作ACL。

方法1:调用getfacl命令(无需额外安装Python库)

import subprocess

def get_file_security_principals(file_path):
    # 执行getfacl命令获取文件ACL信息
    proc = subprocess.run(
        ["getfacl", "-p", file_path],
        capture_output=True,
        text=True,
        check=True
    )
    
    principals = []
    for line in proc.stdout.splitlines():
        # 筛选出用户和组条目
        if line.startswith(("user:", "group:")):
            parts = line.split(":", maxsplit=2)
            principal = parts[1].strip()
            if principal:
                principals.append(principal)
    
    return list(set(principals))

# 示例调用
if __name__ == "__main__":
    target_file = "/home/yourname/test.txt"
    print("文件的组/用户名列表:")
    print(get_file_security_principals(target_file))

方法2:使用pylibacl库

pip install pylibacl
import acl

def get_file_security_principals(file_path):
    acl_obj = acl.ACL(file_path)
    principals = []
    for entry in acl_obj:
        # 筛选用户和组类型的ACL条目
        if entry.tag_type in (acl.ACL_USER, acl.ACL_GROUP):
            principals.append(entry.qualifier)
    
    return list(set(principals))

# 示例调用
if __name__ == "__main__":
    target_file = "/home/yourname/test.txt"
    print("文件的组/用户名列表:")
    print(get_file_security_principals(target_file))

注意事项

  • Windows环境下,运行代码的账户需要有读取目标文件安全属性的权限(部分系统文件可能需要管理员权限)。
  • Linux环境下,getfacl工具一般默认安装,若缺失可通过包管理器安装(比如apt install acl)。

内容的提问来源于stack exchange,提问作者Luis Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:41:11