使用Python在Windows中设置文件夹权限

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

你需要win32security模块,它是pywin32的一部分。 这是一个做你想做的事情的例子 。

该示例为该文件创build了一个新的DACL并replace了旧的DACL,但修改现有的DACL非常容易; 您只需从安全描述符中获取现有的DACL,而不是创build一个空的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) 

对于那些对ACE的安全描述符“列表”感兴趣的人来说,什么都可以使用下面的数据结构。 有一段时间,我有一些帮助,并从此使用这一点。

 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 /path的掩码传递给:

 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 

下面是kindall的答案的一个版本,它在SetEntriesInAcl中使用EXPLICIT_ACCESS条目,它以规范的顺序(例如访问被拒绝的ACE被列出)与ACE创build适当的ACL。 此外,此版本使用SetNamedSecurityInfo设置DACL,它支持传播可inheritance的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) 

使用os.chmod

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

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

模块是写在基地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接受任何语法,所以你select的语法将取决于你想要向前还是向后兼容。

对于初学者,如果用户的configuration文件目录不存在,则自动创build用户的configuration文件目录,并将权限设置为合理的默认值。 除非你有特定的需要使用Python,你可以让Windows创build文件夹并为你sorting权限。

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

祝你好运。