Настройка разрешений для папки в Windows с использованием Python

Я использую Python для создания новой личной папки при создании учетной записи AD пользователя. Папка создается, но разрешения не верны. Может ли Python добавить пользователя во вновь созданную папку и изменить их разрешения? Я не уверен, где начать кодирование этого.

Ответы

Ответ 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)

Ответ 2

Для тех, кто интересуется "списком" дескрипторов безопасности для ACE, what-have-ya использует следующие структуры данных. Некоторое время назад я немного помог с этим и использовал это с тех пор.

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

Ответ 3

Здесь версия kindall answer, которая использует записи EXPLICIT_ACCESS с SetEntriesInAcl, который создает правильный ACL с ACE в каноническом порядке (например, 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)

Ответ 4

использовать os.chmod

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

вы можете установить разрешения с помощью os.chmod

Мод написан на базе 8, если вы преобразуете его в двоичный, это будет

000 111 111 000   rwx rwx rwx Первый rwx для владельца, второй для группы, а третий для мира

г = читать, ш = писать, х = выполнить

Разрешения, которые вы видите чаще всего, 7 read/write/execute - вам нужно выполнить для каталогов, чтобы увидеть содержимое 6 чтение/запись 4 readonly

Когда вы используете 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 допускает синтаксис, так что тот, который вы выберете, будет зависеть от того, хотите ли вы быть совместимым с прямой или обратной связью.

Ответ 5

Для начала каталог профиля пользователя создается автоматически, если он не существует, а разрешения установлены на разумные значения по умолчанию. Если у вас нет необходимости использовать python, вы можете просто позволить окнам создать папку и разрешить вам доступ.

Если вы все равно хотите использовать python, вы можете просто использовать os.system() для вызова cacls или icacls с правильными аргументами. И вместо разрешений вам может просто потребоваться изменить владельца папки на пользователя, который будет владеть этой папкой.

Удачи вам в ваших начинаниях.