Chaos
Chaos

Reputation: 415

Chmod issue to change file permission using python

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 when I check the file permission doing the right click, it only shows the permissions for me and for the group everyone it only has read permission. Is there anything wrong I am doing in the following script:

import os
import pdb

for dirpath, dirnames, filenames in os.walk('M:\intra\EU'):
    for filename in filenames:
        path = os.path.join(dirpath, filename)
        os.chmod(path, 0o777) # for example

Upvotes: 7

Views: 26793

Answers (3)

macetw
macetw

Reputation: 1820

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."

Upvotes: 7

Chaos
Chaos

Reputation: 415

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)

Upvotes: 13

falsetru
falsetru

Reputation: 368924

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.

Upvotes: 11

Related Questions