Я пишу скрипт 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)
Мой босс не указано конкретно, но я, что странно, никто из нас не помнит добавление этого разрешения.
Если UAC включен, то ваш маркер администратора разделен на две части, одна лексема, которая ограничена, а другой это неограниченная. Неограниченный токен также называется «повышенным» токеном, так как он имеет «высокий» обязательный уровень целостности. Проверьте 'whoami/groups/fo list'. Если командная строка не была запущена как администратор, вы должны увидеть, что BUILTIN \ Administrators установлен как «Группа, используемая только для отказа». Это означает, что ACE в дескрипторе безопасности DACL, которые предоставляют доступ администраторам, не применимы к вашему не поднятому токену. – eryksun
Обратите внимание, что каталоги могут предоставить 'FILE_DELETE_CHILD' [File Access Right] (https://msdn.microsoft.com/en-us/library/gg258116), что неявно позволяет пользователю, имеющему это право удалять файлы и подкаталоги. Кажется, у вас есть это право для рассматриваемой директории, но ваш босс этого не делает. Проверьте 'icacls dirpath', чтобы перечислить ACE в DACL каталога. – eryksun
@eryksun - вещь в том, что мой босс может удалить тхм вручную, перейдя в проводник и удалив удаление. Это просто сценарий, который не может удалить их, когда он его запускает. –