【问题标题】:How to set folder permissions in Windows?如何在 Windows 中设置文件夹权限?
【发布时间】:2012-08-23 11:36:09
【问题描述】:

在创建用户 AD 帐户时,我正在使用 Python 创建一个新的个人文件夹。正在创建文件夹,但权限不正确。 Python 可以将用户添加到新创建的文件夹并更改其权限吗?我不知道从哪里开始编码。

【问题讨论】:

  • 您真的应该尝试使用标题作为搜索字符串进行谷歌搜索,也欢迎使用 Stackoverflow。

标签: python permissions active-directory share


【解决方案1】:

您需要win32security 模块,它是pywin32 的一部分。这是 an example 做你想做的事情。

该示例为文件创建一个新的 DACL 并替换旧的,但修改现有的很容易;您需要做的就是从安全描述符中获取现有的 DACL,而不是像这样创建一个空的 DACL:

import win32security
import ntsecuritycon as con

FILENAME = "whatever"

userx, domain, type = win32security.LookupAccountName ("", "User X")
usery, domain, type = win32security.LookupAccountName ("", "User Y")

sd = win32security.GetFileSecurity(FILENAME, win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl()   # instead of dacl = win32security.ACL()

dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_GENERIC_READ | con.FILE_GENERIC_WRITE, userx)
dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_ALL_ACCESS, usery)

sd.SetSecurityDescriptorDacl(1, dacl, 0)   # may not be necessary
win32security.SetFileSecurity(FILENAME, win32security.DACL_SECURITY_INFORMATION, sd)

【讨论】:

  • 在示例中,他们删除并替换了 DACL。有没有办法只编辑现有的 DACL?只需为 USERX 添加读/写功能并为 USERY 添加完全控制权?
  • 您的代码运行良好!一个问题,有没有办法找到所有可以设置的安全设置的列表?在此示例中,您使用了读/写和完整。是否有其他可能的设置可用并记录在案?再次感谢您的帮助。
  • 这些存储在ntsecuritycon(在此脚本中导入为con),所以只需import ntsecuritycon,然后是dir(ntsecuritycon)help(ntsecuritycon)。或者[x for x in dir(ntsecuritycon) if x.startswith("FILE_")] 应该会为您提供所需的内容。这些映射到this page 上的权限表中描述的 NT 权限。
  • 这个答案经常被引用,但它使用了低级和过时的功能。我添加了一个替代答案,它支持 ACE 的规范排序和可继承 ACE 的传播。
  • 嗨@kindall,你有任何在windows上使用python拒绝文件夹权限的例子吗?
【解决方案2】:

这是kindall's answer 的一个版本,它使用带有SetEntriesInAclEXPLICIT_ACCESS 条目,它创建了一个正确的ACL,其中ACE 按规范顺序(例如,拒绝访问的ACE 首先列出)。此外,此版本使用 SetNamedSecurityInfo 设置 DACL,它支持传播可继承的 ACE,这与过时的函数 SetFileSecurity 不同。

import ntsecuritycon
import win32security

FILENAME = "whatever"
USERX = "UserX"
USERY = "UserY"

entries = [{'AccessMode': win32security.GRANT_ACCESS,
            'AccessPermissions': 0,
            'Inheritance': win32security.CONTAINER_INHERIT_ACE |
                           win32security.OBJECT_INHERIT_ACE,
            'Trustee': {'TrusteeType': win32security.TRUSTEE_IS_USER,
                        'TrusteeForm': win32security.TRUSTEE_IS_NAME,
                        'Identifier': ''}}
            for i in range(2)]

entries[0]['AccessPermissions'] = (ntsecuritycon.GENERIC_READ |
                                   ntsecuritycon.GENERIC_WRITE)
entries[0]['Trustee']['Identifier'] = USERX
entries[1]['AccessPermissions'] = ntsecuritycon.GENERIC_ALL
entries[1]['Trustee']['Identifier'] = USERY

sd = win32security.GetNamedSecurityInfo(FILENAME, win32security.SE_FILE_OBJECT,
        win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl()
dacl.SetEntriesInAcl(entries)
win32security.SetNamedSecurityInfo(FILENAME, win32security.SE_FILE_OBJECT,
    win32security.DACL_SECURITY_INFORMATION |
    win32security.UNPROTECTED_DACL_SECURITY_INFORMATION,
    None, None, dacl, None)

【讨论】:

    【解决方案3】:

    对于那些对 ACE 的安全描述符“列表”感兴趣的人,what-have-ya 使用以下数据结构。不久前我得到了一些帮助,从那以后我就一直在使用它。

    typical_aces={
        2032127L:"Full Control(All)",
        1179817L:"Read(RX)",
        1180086L:"Add",
        1180095L:"Add&Read",
        1245631L:"Change"
    }
    
    binary_aces={
        1:"ACCESS_READ",            #0x00000001
        2:"ACCESS_WRITE",           #0x00000002
        4:"ACCESS_CREATE",          #0x00000004
        8:"ACCESS_EXEC",            #0x00000008
        16:"ACCESS_DELETE",         #0x00000010
        32:"ACCESS_ATRIB",          #0x00000020
        64:"ACCESS_PERM",           #0x00000040
        32768:"ACCESS_GROUP",       #0x00008000
        65536:"DELETE",             #0x00010000
        131072:"READ_CONTROL",      #0x00020000
        262144:"WRITE_DAC",         #0x00040000
        524288:"WRITE_OWNER",       #0x00080000
        1048576:"SYNCHRONIZE",      #0x00100000
        16777216:"ACCESS_SYSTEM_SECURITY",#0x01000000
        33554432:"MAXIMUM_ALLOWED", #0x02000000
        268435456:"GENERIC_ALL",    #0x10000000
        536870912:"GENERIC_EXECUTE",#0x20000000
        1073741824:"GENERIC_WRITE", #0x40000000
        65535:"SPECIFIC_RIGHTS_ALL",#0x0000ffff
        983040:"STANDARD_RIGHTS_REQUIRED",#0x000f0000
        2031616:"STANDARD_RIGHTS_ALL",#0x001f0000
        }
    

    将掩码从给定的 DACL / 路径传递到:

    def calculate_plaintext_mask(mask):
        a=2147483648L
        if typical_aces.has_key(mask):
            return typical_aces[mask]
        else:
            result='NONE'
            while a>>1:
                a=a>>1
                masked=mask&a
                if masked:
                    if binary_aces.has_key(masked):
                        result=binary_aces[masked]+':'+result
        return result
    

    【讨论】:

    • 我将对此进行修改以建议任何使用目录所有权/ACL 的人都熟悉可以分配给帐户的所有权限。例如——获取所有权经常失败,因为人们没有将“SeRestorePrivilege”分配给他们的帐户。您几乎肯定需要使用从代码中调用的 PInvoke(“System.Runtime.InteropServices”)。我已经切换到像 advapi32.dll 这样调用 WinAPI 以确保我正确连接。
    【解决方案4】:

    这是一个完整的 Pythonic 方法,可以在 Windows 下的 NTFS 文件上递归或不设置文件所有权/ACL,有或没有 ACL 继承。

    [编辑]

    我现在已经将此代码作为 Python 包 windows_tools.file_utils 发布,请参阅源代码 here

    [/编辑]

    首先我们需要一个可以获取文件所有权的函数 (set_file_owner()) 然后我们需要一个可以在 Windows 上处理 ACL 的函数(set_acls())。

    为了简化权限,我们将有一个函数 (easy_permissions()) 将 R、RX、M、F 权限转换为权限位掩码。

    一旦我们得到它,我们可能只是将 os.listdir 递归到一个目录中(使用 get_files_recursive()),并在 PermissionError 上执行一个函数来处理权限。 完成后,只需再次遍历所有文件并相应地设置权限。

    底层代码:

    import os
    from fnmatch import fnmatch
    from itertools import chain
    import win32api
    import win32security
    import ntsecuritycon
    import pywintypes
    
    
    def glob_path_match(path, pattern_list):
        """
        Checks if path is in a list of glob style wildcard paths
        :param path: path of file / directory
        :param pattern_list: list of wildcard patterns to check for
        :return: Boolean
        """
        return any(fnmatch(path, pattern) for pattern in pattern_list)
    
    
    def get_files_recursive(root, d_exclude_list=None, f_exclude_list=None,
                        ext_exclude_list=None, ext_include_list=None,
                        depth=0, primary_root=None, fn_on_perm_error=None,
                        include_dirs=False):
    """
    Walk a path to recursively find files
    Modified version of https://stackoverflow.com/a/24771959/2635443 that includes exclusion lists
    and accepts glob style wildcards on files and directories
    :param root: (str) path to explore
    :param include_dirs: (bool) should output list include directories
    :param d_exclude_list: (list) list of root relative directories paths to exclude
    :param f_exclude_list: (list) list of filenames without paths to exclude
    :param ext_exclude_list: list() list of file extensions to exclude, ex: ['.log', '.bak'],
           takes precedence over ext_include_list
    :param ext_include_lsit: (list) only include list of file extensions, ex: ['.py']
    :param depth: (int) depth of recursion to acheieve, 0 means unlimited, 1 is just the current dir...
    :param primary_root: (str) Only used for internal recursive exclusion lookup, don't pass an argument here
    :param fn_on_perm_error: (function) Optional function to pass, which argument will be the file / directory that has permission errors
    :return: list of files found in path
    """
    
    # Make sure we don't get paths with antislashes on Windows
    if os.path.isdir(root):
        root = os.path.normpath(root)
    else:
        return root
    
    # Check if we are allowed to read directory, if not, try to fix permissions if fn_on_perm_error is passed
    try:
        os.listdir(root)
    except PermissionError:
        if fn_on_perm_error is not None:
            fn_on_perm_error(root)
    
    # Make sure we clean d_exclude_list only on first function call
    if primary_root is None:
        if d_exclude_list is not None:
            # Make sure we use a valid os separator for exclusion lists
            d_exclude_list = [os.path.normpath(d) for d in d_exclude_list]
        else:
            d_exclude_list = []
    if f_exclude_list is None:
        f_exclude_list = []
    if ext_exclude_list is None:
        ext_exclude_list = []
    
    def _find_files():
        try:
            if include_dirs:
                yield root
            for f in os.listdir(root):
                file_ext = os.path.splitext(f)[1]
                if os.path.isfile(os.path.join(root, f)) and not glob_path_match(f, f_exclude_list) \
                    and file_ext not in ext_exclude_list \
                    and (file_ext in ext_include_list if ext_include_list is not None else True):
                    yield os.path.join(root, f)
    
        except PermissionError:
            pass
    
    def _find_files_in_dirs(depth):
        if depth == 0 or depth > 1:
            depth = depth - 1 if depth > 1 else 0
            try:
                for d in os.listdir(root):
                    d_full_path = os.path.join(root, d)
                    if os.path.isdir(d_full_path):
                        # p_root is the relative root the function has been called with recursively
                        # Let's check if p_root + d is in d_exclude_list
                        p_root = os.path.join(primary_root, d) if primary_root is not None else d
                        if not glob_path_match(p_root, d_exclude_list):
                            files_in_d = get_files_recursive(d_full_path,
                                                             d_exclude_list=d_exclude_list,
                                                             f_exclude_list=f_exclude_list,
                                                             ext_exclude_list=ext_exclude_list,
                                                             ext_include_list=ext_include_list,
                                                             depth=depth, primary_root=p_root,
                                                             fn_on_perm_error=fn_on_perm_error,
                                                             include_dirs=include_dirs)
                            if include_dirs:
                                yield d
                            if files_in_d:
                                for f in files_in_d:
                                    yield f
    
            except PermissionError:
                pass
    
    # Chain both generators
    return chain(_find_files(), _find_files_in_dirs(depth))
    
    
    def get_binary_sid(string=None):
        """
        Wrapper function that returns PySID object from SID identifier or username
        If none given, we'll get current user
    
        :param string: (str) SID identifier or username
        :return: (PySID) object
        """
        if string is None:
            string = win32api.GetUserName()
        if string.startswith('S-1-'):
            # Consider we deal with a sid string
            return win32security.GetBinarySid(string)
        else:
            # Try to resolve username
            # LookupAccountName returns tuple (user, domain, type)
    
            try:
                user, _, _ = win32security.LookupAccountName('', string)
                print(user)
                return user
            except pywintypes.error as e:
                raise OSError('Cannot map security ID: {0} with name. {1}'.format(string, e))
    
    
    def set_file_owner(path, owner=None, force=False):
        """
        Set owner on NTFS files / directories
        https://stackoverflow.com/a/61009508/2635443
    
        :param path: (str) path
        :param owner: (PySID) object that represents the security identifier. If not set, current security identifier will be used
        :param force: (bool) Shall we force take ownership
        :return:
        """
        try:
            hToken = win32security.OpenThreadToken(win32api.GetCurrentThread(),
                                                   win32security.TOKEN_ALL_ACCESS, True)
    
        except win32security.error:
            hToken = win32security.OpenProcessToken(win32api.GetCurrentProcess(),
                                                    win32security.TOKEN_ALL_ACCESS)
        if owner is None:
            owner = win32security.GetTokenInformation(hToken, win32security.TokenOwner)
        prev_state = ()
        if force:
            new_state = [(win32security.LookupPrivilegeValue(None, name),
                          win32security.SE_PRIVILEGE_ENABLED)
                         for name in (win32security.SE_TAKE_OWNERSHIP_NAME,
                                      win32security.SE_RESTORE_NAME)]
            prev_state = win32security.AdjustTokenPrivileges(hToken, False,
                                                             new_state)
        try:
            sd = win32security.SECURITY_DESCRIPTOR()
            sd.SetSecurityDescriptorOwner(owner, False)
            win32security.SetFileSecurity(path, win32security.OWNER_SECURITY_INFORMATION, sd)
        except pywintypes.error as e:
            # Let's raise OSError so we don't need to import pywintypes in parent module to catch the exception
            raise OSError('Cannot take ownership of file: {0}. {1}.'.format(path, e))
        finally:
            if prev_state:
                win32security.AdjustTokenPrivileges(hToken, False, prev_state)
    
    
    def easy_permissions(permission):
        """
        Creates ntsecuritycon permission bitmask from simple rights
    
        :param permission: (str) Simple R, RX, RWX, F  rights
        :return: (int) ntsecuritycon permission bitmask
        """
        permission = permission.upper()
        if permission == 'R':
            return ntsecuritycon.GENERIC_READ
        if permission == 'RX':
            return ntsecuritycon.GENERIC_READ | ntsecuritycon.GENERIC_EXECUTE
        if permission in ['RWX', 'M']:
            return ntsecuritycon.GENERIC_READ | ntsecuritycon.GENERIC_WRITE | ntsecuritycon.GENERIC_EXECUTE
        if permission == 'F':
            return ntsecuritycon.GENERIC_ALL
        raise ValueError('Bogus easy permission')
    
    
    def set_acls(path, user_list=None, group_list=None, owner=None, permission=None, inherit=False, inheritance=False):
        """
        Set Windows DACL list
    
        :param path: (str) path to directory/file
        :param user_sid_list: (list) str usernames or PySID objects
        :param group_sid_list: (list) str groupnames or PySID objects
        :param owner: (str) owner name or PySID obect
        :param permission: (int) permission bitmask
        :param inherit: (bool) inherit parent permissions
        :param inheritance: (bool) apply ACL to sub folders and files
        """
        if inheritance:
            inheritance_flags = win32security.CONTAINER_INHERIT_ACE | win32security.OBJECT_INHERIT_ACE
        else:
            inheritance_flags = win32security.NO_INHERITANCE
    
        security_descriptor = {'AccessMode': win32security.GRANT_ACCESS,
                               'AccessPermissions': 0,
                               'Inheritance': inheritance_flags,
                               'Trustee': {'TrusteeType': '',
                                           'TrusteeForm': win32security.TRUSTEE_IS_SID,
                                           'Identifier': ''}
                               }
    
        # Now create a security descriptor for each user in the ACL list
        security_descriptors = []
    
        # If no user / group is defined, let's take current user
        if user_list is None and group_list is None:
            user_list = [get_binary_sid()]
    
        if user_list is not None:
            for sid in user_list:
                sid = get_binary_sid(sid)
                s = security_descriptor
                s['AccessPermissions'] = permission
                s['Trustee']['TrusteeType'] = win32security.TRUSTEE_IS_USER
                s['Trustee']['Identifier'] = sid
                security_descriptors.append(s)
    
        if group_list is not None:
            for sid in group_list:
                sid = get_binary_sid(sid)
                s = security_descriptor
                s['AccessPermissions'] = permission
                s['Trustee']['TrusteeType'] = win32security.TRUSTEE_IS_GROUP
                s['Trustee']['Identifier'] = sid
                security_descriptors.append(s)
    
        try:
            sd = win32security.GetNamedSecurityInfo(path, win32security.SE_FILE_OBJECT,
                                                    win32security.DACL_SECURITY_INFORMATION | win32security.UNPROTECTED_DACL_SECURITY_INFORMATION)
        except pywintypes.error as e:
            raise OSError('Failed to read security for file: {0}. {1}'.format(path, e))
        dacl = sd.GetSecurityDescriptorDacl()
        dacl.SetEntriesInAcl(security_descriptors)
    
        security_information_flags = win32security.DACL_SECURITY_INFORMATION
    
        if not inherit:
            # PROTECTED_DACL_SECURITY_INFORMATION disables inheritance from parent
            security_information_flags = security_information_flags | win32security.PROTECTED_DACL_SECURITY_INFORMATION
        else:
            security_information_flags = security_information_flags | win32security.UNPROTECTED_DACL_SECURITY_INFORMATION
    
        # If we want to change owner, SetNamedSecurityInfo will need win32security.OWNER_SECURITY_INFORMATION in SECURITY_INFORMATION
        if owner is not None:
            security_information_flags = security_information_flags | win32security.OWNER_SECURITY_INFORMATION
            if isinstance(owner, str):
                owner = get_binary_sid(owner)
    
        try:
            # SetNamedSecurityInfo(path, object_type, security_information, owner, group, dacl, sacl)
            win32security.SetNamedSecurityInfo(path, win32security.SE_FILE_OBJECT,
                                               security_information_flags,
                                               owner, None, dacl, None)
        except pywintypes.error as e:
            raise OSError
    
    
    def take_ownership_recursive(path, owner=None):
        def take_own(path):
            nonlocal owner
            try:
                set_file_owner(path, owner=owner, force=True)
            except OSError:
                print('Permission error on: {0}.'.format(path))
    
        files = get_files_recursive(path, include_dirs=True, fn_on_perm_error=take_own)
        for file in files:
            set_file_owner(file, force=True)
    
    
    def get_files_recursive_and_set_permissions(path, owner=None, permissions=None, user_list=None):
        def fix_perms(path):
            nonlocal permissions
            nonlocal owner
            nonlocal user_list
            if permissions == None:
                permissions = easy_permissions('F')
            print('Permission error on: {0}.'.format(path))
            try:
                set_acls(path, user_list=user_list, owner=owner, permission=permissions, inheritance=False)
            except OSError:
                # Lets force ownership change
                try:
                    set_file_owner(path, force=True)
                    # Now try again
                    set_acls(path, user_list=user_list, owner=owner, permission=permissions, inheritance=False)
                except OSError as e:
                    print('Cannot fix permission on {0}. {1}'.format(path, e))
    
        files = get_files_recursive(path, include_dirs=True, fn_on_perm_error=fix_perms)
        for file in files:
            set_acls(file, user_list=user_list, owner=owner, permission=easy_permissions('F'), inheritance=False)
    

    以下是如何使用代码的一些示例:

    # Recursively set owner
    take_ownership_recursive(r'C:\MYPATH', owner=get_binary_sid('MyUser'))
    
    # Recursively set permissions
    get_files_recursive_and_set_permissions(r'C;\MYPATH', permissions=easy_permissions('F'), user_list=['MyUser', 'MyOtherUser'])
    
    # Recursively set permissions with inheritance
    get_files_recursive_and_set_permissions(r'C:\MYPATH', permissions=easy_permissions('RX'), user_list=['S-1-5-18'], inheritance=True)
    
    # Set permissions
    set_acls(r'C:\MYPATH', permissions=easy_permissions('F'), user_list['MyUser'])
    
    # Take ownership
    set_file_owner(r'C:\MYPATH', owner=get_binary_sid('MyUser'), Force=True)
    

    非常感谢 Eryk Sun 发表的所有关于在 Python 中处理 win32security 文件的帖子,这些帖子使编写正确的代码成为可能。 见https://stackoverflow.com/a/43244697/2635443https://stackoverflow.com/a/61009508/2635443

    【讨论】:

      【解决方案5】:

      这是最简单的解决方案(您还可以指定用户并添加修改权限):

      command = r'icacls "C:\Users\PC\PycharmProjects\IIS_configuration\someFolder" /grant "userA":(OI)(CI)RWRXM'
      appcmd = subprocess.run(command, shell=True, check=True)
      

      要查看它是如何工作的,您可以通过 CMD 运行:

      icacls "C:\Users\PC\PycharmProjects\IIS_configuration\someFolder" /grant "userA":(OI)(CI)RWRXM
      

      我使用了 icacls(windows 命令) - 您可以在 herehere 找到有关它的信息。

      然后我只是用 python subprocess 运行这个命令

      有关此特定命令的信息:

      • “C:\Users\PC\PycharmProjects\IIS_configuration\someFolder”-dst
      • userA - 用户名
      • (OI) - 对象继承
      • (CI) - 容器继承
      • RWRXM - 每个词都标志着一个前提。就像 R 被读取,而 RX 被读取并执行访问(信息 here)。

      【讨论】:

        【解决方案6】:

        可以使用Python for .NET 包分配Windows 文件夹权限。这个包让程序员可以直接在 Python 中使用 .NET 结构。这种方法的一个优点是强大的 .NET 在线文档,这将有助于识别特定的函数调用和使用权限。例如,FileSystemRights 枚举的文章中记录了所有可能的文件/文件夹权限。

        请注意,尝试将“None”的枚举值直接作为属性访问会导致 Python 语法错误。 getattr() 函数可以用作解决方法。

        import clr
        import System
        
        from System.IO import Directory
        from System.Security.AccessControl import (
            AccessControlType,
            FileSystemAccessRule,
            FileSystemRights,
            InheritanceFlags,
            PropagationFlags,
        )
        
        path = r"C:\path\to\folder"
        accessControl = Directory.GetAccessControl(path)
        accessRule = FileSystemAccessRule(
            "UserX",
            FileSystemRights.Modify | FileSystemRights.Synchronize,
            InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
            getattr(PropagationFlags, "None"),
            AccessControlType.Allow,
        )
        accessControl.AddAccessRule(accessRule)
        Directory.SetAccessControl(path, accessControl)
        

        【讨论】:

        【解决方案7】:

        使用 os.chmod

        http://docs.python.org/library/os.html#os.chmod

        您可以使用 os.chmod 设置权限

        mod是用base 8写的,如果你把它转换成二进制它会是

        000 111 111 000 rwx rwx rwx 第一个 rwx 是给所有者的,第二个是给组的,第三个是给世界的

        r=读取,w=写入,x=执行

        您最常看到的权限是 7 读/写/执行 - 你需要执行目录才能看到内容 6 读/写 4 只读

        当你使用 os.chmod 时,使用八进制符号是最有意义的,所以

        os.chmod('myfile',0o666)  # read/write by everyone
        os.chmod('myfile',0o644)  # read/write by me, readable for everone else
        

        记住我说过你通常希望目录是“可执行的”,这样你就可以看到内容。

        os.chmod('mydir',0o777)  # read/write by everyone
        os.chmod('mydir',0o755)  # read/write by me, readable for everone else
        

        注意:0o777 的语法适用于 Python 2.6 和 3+。否则 2 系列为 0777。2.6 接受任一语法,因此您选择的语法取决于您是要向前兼容还是向后兼容。

        【讨论】:

        • 在 Windows 中,chmod 的适用性相当低。来自the chmod doc:“尽管 Windows 支持 chmod(),但您只能使用它设置文件的只读标志(通过 stat.S_IWRITE 和 stat.S_IREAD 常量或相应的整数值)。所有其他位都被忽略。”
        【解决方案8】:

        对于初学者,如果用户的配置文件目录不存在,则会自动创建它,并将权限设置为合理的默认值。除非您有使用 python 的特殊需要,否则您可以让 windows 为您创建文件夹并整理权限。

        如果你仍然想使用 python,你可以考虑只使用 os.system() 来调用带有正确参数的 cacls 或 icacls。您可能只需将文件夹的所有者更改为将拥有该文件夹的用户,而不是权限。

        祝你工作顺利。

        【讨论】:

          猜你喜欢
          • 2012-03-02
          • 2011-10-07
          • 1970-01-01
          • 2014-09-28
          • 1970-01-01
          • 2015-03-30
          • 1970-01-01
          • 2015-10-18
          • 2021-05-02
          相关资源
          最近更新 更多