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
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)
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
andstat.S_IREAD
constants or a corresponding integer value). All other bits are ignored.
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."