在Windows中使用Python设置文件夹权限(Setting folder permission

2019-06-17 21:58发布

我使用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只考虑。 而不是许可,您可能只需要该文件夹的所有者更改为谁将会拥有该文件夹的用户。

祝你的努力。



文章来源: Setting folder permissions in Windows using Python