如何在Windows系统中用Python添加文件夹的用户/组权限
解决Windows下Python复制文件夹后缺失用户/组权限的问题
shutil.copytree在Windows环境下默认不会完整复制原文件夹的所有ACL(访问控制列表)权限,这就是你手动复制时权限保留,但用代码复制后丢失特定用户/组的原因。要手动添加缺失的用户/组,得借助Windows原生API,这里可以用pywin32库实现。
步骤1:安装依赖库
先安装操作Windows安全权限的工具库:
pip install pywin32
步骤2:编写权限添加代码
以下是可直接复用的示例代码,你只需替换目标文件夹路径和缺失的用户/组名称:
import win32security import win32api import win32con def add_user_to_folder_acl(folder_path, user_name): # 获取目标文件夹的安全描述符 sd = win32security.GetFileSecurity(folder_path, win32security.DACL_SECURITY_INFORMATION) dacl = sd.GetSecurityDescriptorDacl() # 解析目标用户/组的SID(安全标识符) try: sid, _, _ = win32security.LookupAccountName(None, user_name) except win32api.error as e: print(f"找不到指定用户/组 {user_name}: {e}") return # 定义要赋予的权限(示例为读取、执行、列出内容权限,可按需修改) access_mask = win32con.FILE_GENERIC_READ | win32con.FILE_GENERIC_EXECUTE # 创建访问控制项(ACE),设置权限继承规则(同步到子文件和子文件夹) dacl.AddAccessAllowedAce( win32security.ACL_REVISION, access_mask, sid ) # 开启权限继承标识 dacl.SetAce( dacl.GetAceCount() - 1, ( win32security.ACCESS_ALLOWED_ACE_TYPE, win32security.ACE_FLAG_OBJECT_INHERIT | win32security.ACE_FLAG_CONTAINER_INHERIT, access_mask, sid ) ) # 更新文件夹的安全描述符并应用 sd.SetSecurityDescriptorDacl(1, dacl, 0) win32security.SetFileSecurity(folder_path, win32security.DACL_SECURITY_INFORMATION, sd) # 示例调用:替换为你的实际路径和用户/组名称 target_folder = r"C:\Your\Copied\Folder\Path" missing_user = "BUILTIN\Users" # 本地组格式,域用户/组用"DOMAIN\GroupName" add_user_to_folder_acl(target_folder, missing_user)
关键细节说明
- 用户/组名称格式:本地用户/组需用
BUILTIN\名称格式,域用户/组用域名\名称格式,确保能正确解析SID。 - 权限自定义:如果需要写入、修改等权限,可组合
win32con中的常量,比如FILE_GENERIC_WRITE、FILE_ALL_ACCESS(谨慎使用全权限)。 - 继承规则:
ACE_FLAG_OBJECT_INHERIT和ACE_FLAG_CONTAINER_INHERIT确保权限会同步到文件夹内的所有子项,和手动复制的权限继承行为一致。
内容的提问来源于stack exchange,提问作者we_are_all_in_this_together
相关产品推荐
相关产品推荐

