我使用Python创建用户帐户AD时创建一个新的个人文件夹。 正在创建的文件夹,但该权限是不正确的。 Python可以将用户添加到新创建的文件夹,并改变他们的权限? 我不知道从哪里开始编码这一点。
Answer 1:
你想要win32security
模块,这是一部分pywin32 。 这里有一个例子做那种你想要做的事情。
这个例子创建该文件的新的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)
Answer 2:
对于那些有兴趣在的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 /路径面膜:
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
Answer 3:
这里有一个版本kindall的回答使用EXPLICIT_ACCESS
的条目SetEntriesInAcl
,创造与典范顺序的ACE相应的ACL(例如,访问被拒绝的ACE列第一)。 此外,这个版本将使用DACL SetNamedSecurityInfo
,支持传播可继承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)
Answer 4:
使用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可以接受的语法,所以你选择哪一种取决于您是否想向前或向后兼容。
Answer 5:
对于初学者来说,如果它不存在,用户的配置文件目录会自动创建和权限设置为合理的默认值。 除非你有特殊需要使用Python,你可以只让Windows创建文件夹和排序的权限为你。
如果您仍要使用Python,你可以使用使用os.system()调用以正确的参数CACLS或ICACLS只考虑。 而不是许可,您可能只需要该文件夹的所有者更改为谁将会拥有该文件夹的用户。
祝你的努力。