Запись в файл непроверенного байтового массива не имеет разрешений, установленных по умолчанию. - PullRequest
0 голосов
/ 01 февраля 2020

У меня десериализованные данные файла в этом словаре, расположенные следующим образом -

[filename1 : bytearray with file contents]  
[filename2 : bytearray with file contents]  
[filename3 : bytearray with file contents]  
...

Теперь, когда я записываю данные на диск в папке назначения, используя

    for f,bArr in depickled_.items():
        with open(os.path.join(r"S:\test", f), "wb") as fWr:
            fWr.write(bytearray(bArr))
            fWr.close() # <- probably redundant

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

Есть идеи, что идет не так и как я могу это исправить? Я единственный администратор (и пользователь) этого компьютера.

Подробнее:

  • Python версия 3.7
  • Windows 10 Домой

1 Ответ

0 голосов
/ 01 февраля 2020

Добавлены некоторые разрешения с использованием модуля pywin32.

import win32security
import ntsecuritycon as con
from win32 import win32api

for f,bArr in depickle_.items():
        full_path = os.path.join(r"S:\test", f) 
        # with open(full_path, "wb+") as fWr:
        fd = os.open(full_path, os.O_CREAT | os.O_WRONLY, 0o777) # will probably work for linux
        with open(fd, 'wb') as fWr:
            fWr.write(bytearray(bArr))
            fWr.close()

    # user, domain, type = win32security.LookupAccountName ("", win32api.GetUserName())
    user, domain, type = win32security.LookupAccountName ("", "Everyone")
    sd = win32security.GetFileSecurity(full_path, win32security.DACL_SECURITY_INFORMATION)
    dacl = sd.GetSecurityDescriptorDacl()

    # Delete all existing permissions        
    for index in range(0, dacl.GetAceCount()):
        dacl.DeleteAce(0)

    dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_ALL_ACCESS, user)
    sd.SetSecurityDescriptorDacl(1, dacl, 0) 
    win32security.SetFileSecurity(full_path, win32security.DACL_SECURITY_INFORMATION, sd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...