2

Я пишу скрипт python для получения одного файла, изменяя его, создавая несколько новых файлов на основе первого. Идея состоит в том, что если первый обновлен, я или мои другие коллеги могут запустить сценарий на нашем сервере (под управлением Windows Server 2008 r2) и распространить изменения на другие файлы.Python 3.5 на Windows - переписывание файлов, созданных другими пользователями "PermissionError: [Errno 13]"

Однако мы попали в ловушку, когда дело доходит до того, что, как я полагаю, сводится к разрешению файлов Windows.

Когда скрипт создает файлы, которые он создает их с правами следующим образом:

  • Пользователь, который бежал сценарий: полный контроль, чтение, чтение & Выполнить команду Изменить Написать
  • Администраторы Группа: Полный контроль , чтение, чтение & Выполнить команду Изменить Написать
  • Системы: Полный доступ, чтение, чтение & Выполнить команду Изменить Написать
  • группы пользователей: чтение, чтение & Exec Ют

Я наблюдал следующее поведение:

  • Когда я или мой босс запустить сценарий, и ни один из дочерних файлов не существует, скрипт прекрасно работает и создает новые.
  • Когда я или мой босс запускают сценарий, дочерние файлы существуют и были созданы предыдущим запуском того же самого пользователя, который запускает скрипт, сценарий отлично работает и перезаписывает существующие файлы.
  • Когда я запускаю скрипт, дочерние файлы существуют, но были созданы моим боссом, выполняющим скрипт, сценарий не работает с `PermissionError: [Errno 13] Permission denied.
  • Когда мой босс запускает скрипт, дочерние файлы существуют, но были созданы мной, запускающим скрипт, сценарий не работает с `PermissionError: [Errno 13] Permission denied.

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

Что я делаю неправильно?

Есть ли способ изменить права доступа к файлу из сценария или удалить файлы до того, как скрипт будет писать?

код следующим образом:

#All variables are set above 
#They have no bearing on file permissions other than setting the paths to read/write 
fileIn = io.open(filePath, mode='r') 
print ("Reading " + filePath) 
for line in fileIn: 
    for x in range(0,5): 
     contentsOut[x] += line 
     if line[:len(seekLine)] == seekLine: 
      contentsOut[x] += catSection.format(catStrings[x]) 
      print ("written category string") 
fileIn.close() 
for x in range(0,5): 
    fileOutName = basePath + fileFormat.format(catStrings[x]) 
    fileOut = io.open(fileOutName, mode='wt', encoding='utf_8',newline='\r\n') 
    print ("Writing " + fileOutName) 
    fileOut.write(contentsOut[x]) 
    fileOut.close() 
    print ("Write finished") 

EDIT: С тех пор я изменил алгоритм удаления файла, прежде чем писать, и это дает еще более странные результаты.

По какой-то причине, если созданные мной файлы были созданы мной, мой босс не может удалить их, запустив скрипт и получив PermissionError: [WinError 5] Access is denied, когда он ударит по строке os.remove(fileOutName).

У меня, однако, нет проблем, и я могу запустить скрипт отлично, независимо от того, был ли он мной или моим начальником, который создал файлы.

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

fileIn = io.open(filePath, mode='r') 
print ("Reading " + filePath) 
for line in fileIn: 
    for x in range(0,noOfOutFiles): 
     contentsOut[x] += line 
     if line[:len(seekLine)] == seekLine: 
      contentsOut[x] += catSection.format(catStrings[x]) 
      print ("written category string") 
fileIn.close() 
for x in range(0,noOfOutFiles): 
    fileOutName = basePath + '\\' + scopePath + '\\' + typePath + '\\' + fileFormat.format(catStrings[x]) 
    if os.path.exists(fileOutName): 
     print ("Deleting " + fileOutName) 
     os.remove(fileOutName) 
    print ("Writing " + fileOutName) 
    fileOut = io.open(fileOutName, mode='wt', encoding='utf_8',newline='\r\n') 
    fileOut.write(contentsOut[x]) 
    fileOut.close() 
    print ("Write finished") 

EDIT: Я запускал icacls на '.' (Текущий каталог) и один из полученных файлов, вот результат:

Текущий каталог:

NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F) 
BUILTIN\Administrators:(I)(OI)(CI)(F) 
BUILTIN\Users:(I)(OI)(CI)(RX) 
BUILTIN\Users:(I)(CI)(AD) 
BUILTIN\Users:(I)(CI)(WD) 
SERVERNAME\Me:(I)(F) 
CREATOR OWNER:(I)(OI)(CI)(IO)(F) 

Файл:

NT AUTHORITY\SYSTEM:(I)(F) 
BUILTIN\Administrators:(I)(F) 
BUILTIN\Users:(I)(RX) 
SERVERNAME\Me:(I)(F) 

Мой босс не указано конкретно, но я, что странно, никто из нас не помнит добавление этого разрешения.

+0

Если UAC включен, то ваш маркер администратора разделен на две части, одна лексема, которая ограничена, а другой это неограниченная. Неограниченный токен также называется «повышенным» токеном, так как он имеет «высокий» обязательный уровень целостности. Проверьте 'whoami/groups/fo list'. Если командная строка не была запущена как администратор, вы должны увидеть, что BUILTIN \ Administrators установлен как «Группа, используемая только для отказа». Это означает, что ACE в дескрипторе безопасности DACL, которые предоставляют доступ администраторам, не применимы к вашему не поднятому токену. – eryksun

+0

Обратите внимание, что каталоги могут предоставить 'FILE_DELETE_CHILD' [File Access Right] (https://msdn.microsoft.com/en-us/library/gg258116), что неявно позволяет пользователю, имеющему это право удалять файлы и подкаталоги. Кажется, у вас есть это право для рассматриваемой директории, но ваш босс этого не делает. Проверьте 'icacls dirpath', чтобы перечислить ACE в DACL каталога. – eryksun

+0

@eryksun - вещь в том, что мой босс может удалить тхм вручную, перейдя в проводник и удалив удаление. Это просто сценарий, который не может удалить их, когда он его запускает. –

ответ

0

Если вы используете модель win32security, у вас будет полный контроль над настройкой прав доступа к файлам для разных групп.

http://timgolden.me.uk/python/win32_how_do_i/add-security-to-a-file.html

dacl = win32security.ACL() 
dacl.AddAccessAllowedAce (win32security.ACL_REVISION, con.FILE_GENERIC_READ, everyone) 
dacl.AddAccessAllowedAce (win32security.ACL_REVISION, con.FILE_GENERIC_READ | con.FILE_GENERIC_WRITE, user) 
dacl.AddAccessAllowedAce (win32security.ACL_REVISION, con.FILE_ALL_ACCESS, admins) 
+0

Но знаете ли вы, почему это может произойти в любом случае? так как независимо от разрешений это поведение кажется странным. –

+0

Каковы разрешения для папки, в которой создается файл? насколько я знаю, в Windows он наследует разрешения родительской папки. Вы можете проверить это. – roymustang86

+0

Я добавил редактирование, которое может ответить на ваш вопрос –

 Смежные вопросы

  • Нет связанных вопросов^_^