Chmod issue to change file permission using python

后端 未结 3 1999
别跟我提以往
别跟我提以往 2021-01-03 04:37

I am looking to change the file permission to all files to read write and execute for all the users in a directory using a python script. However, after running the script w

相关标签:
3条回答
  • 2021-01-03 05:32

    I found a solution here :)

    Setting folder permissions in Windows using Python

    import win32security
    import ntsecuritycon as con
    import os
    import pdb
    userx, domain, type = win32security.LookupAccountName ("", "Everyone")
    directory='M:\intra\EU'
    for dirpath, dirnames, filenames in os.walk('M:\intra\EU'):
        for FILENAME in filenames:
            sd = win32security.GetFileSecurity(directory+'\\'+FILENAME, win32security.DACL_SECURITY_INFORMATION)
            dacl = sd.GetSecurityDescriptorDacl()   # instead of dacl = win32security.ACL()
            dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_ALL_ACCESS, userx)
            sd.SetSecurityDescriptorDacl(1, dacl, 0)
            win32security.SetFileSecurity(directory+'\\'+FILENAME, win32security.DACL_SECURITY_INFORMATION, sd)
    
    0 讨论(0)
  • 2021-01-03 05:34

    According to the NOTE of the os.chmod documentation:

    Although Windows supports chmod(), you can only set the file's read-only flag with it (via the stat.S_IWRITE and stat.S_IREAD constants or a corresponding integer value). All other bits are ignored.

    0 讨论(0)
  • 2021-01-03 05:35

    The recommended solution didn't work on Python3 (modules not available). I took a different approach, to use the Windows command line.

    In my case, I needed the "LOCAL SERVICE" account to have permission. I did:

        import subprocess
        args = ["icacls", directory,
                "/grant:r", 'LOCAL SERVICE:(OI)(CI)MF']
        subprocess.check_call(args)
    

    Note that this permission seems to only work when set on a directory. For security reasons, it would also be a good idea to ensure that "directory" actually exists.

    Also note that "LOCAL SERVICE" might go by a translated name. In German locale, for example, it is "Lokaler Dienst."

    0 讨论(0)
提交回复
热议问题