Настройка разрешений для папки в 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 с правильными аргументами. И вместо разрешений вам может просто потребоваться изменить владельца папки на пользователя, который будет владеть этой папкой.
Удачи вам в ваших начинаниях.