Как проверить, можно ли создать файл в данном каталоге на MS XP/Vista?
У меня есть код, который создает файл (ы) в указанной пользователем директории. Пользователь может указать каталог, в котором он не может создавать файлы, но он может переименовать его.
Я создал каталог для тестовых целей, давайте назовем его C:\foo
,
У меня есть следующие разрешения на C:\foo
:
- Обход каталога / Выполнить файл
- Удаление подпапок и файлов
- Удаление
- Разрешения на чтение
- Изменить разрешения
- Взять на себя ответственность
У меня нет следующих разрешений C:\foo
:
- Полный контроль
- Создание файла
- Создание папки
До сих пор я пробовал следующие подходы:
os.access('C:\foo', os.W_OK) == True
st = os.stat('C:\foo')
mode = st[stat.ST_MODE]
mode & stat.S_IWRITE == True
Я считаю, что это связано с тем, что я могу переименовать папку, поэтому она может быть изменена для меня. Но это содержание - нет.
Кто-нибудь знает, как я могу написать код, который будет проверять для данного каталога, если текущий пользователь имеет разрешения на создание файла в этом каталоге?
Вкратце - я хочу проверить, есть ли у текущего пользователя разрешения на создание файлов и создание папок для данного имени папки.
РЕДАКТИРОВАТЬ: Необходимость такого кода возникла из контрольного примера № 3 из программы "Certified for Windows Vista", которая гласит:
- Приложение не должно позволять пользователю с наименьшими правами сохранять какие-либо файлы в системный каталог Windows, чтобы пройти этот тестовый пример.
Следует ли это понимать как "Приложение может попытаться сохранить файл в системном каталоге Windows, но не должно произойти сбой при сбое?" или, скорее, "Приложение должно выполнить проверки безопасности, прежде чем пытаться сохранить файл?"
Должен ли я перестать беспокоиться только потому, что сама Windows Vista не позволит пользователю с наименьшими привилегиями сохранять какие-либо файлы в%WINDIR%?
4 ответа
Недавно я написал приложение, чтобы пройти набор тестов для получения статуса ISV от Microsoft, и я также добавляю это условие. Я понял, что если пользователь является наименее привилегированным, у него не будет разрешения на запись в системные папки. Поэтому я подошел к проблеме так, как описал Измаил. Я пытаюсь создать файл и перехватить исключение, а затем сообщить пользователю, что у него нет разрешения на запись файлов в этот каталог.
В моем понимании пользователь с наименьшими привилегиями не будет иметь необходимых разрешений для записи в эти папки, если он имеет, то он не является пользователем с наименьшими привилегиями.
Должен ли я перестать беспокоиться только потому, что сама Windows Vista не позволит пользователю с наименьшими привилегиями сохранять какие-либо файлы в%WINDIR%?
По моему мнению? Да.
Я бы не стал тратить время и LOCs на проверку разрешений. Конечным тестом создания файла в Windows является само создание. Другие факторы могут вступать в игру (например, существующие файлы (или, что еще хуже, папки) с одинаковыми именами, дисковым пространством, фоновыми процессами. Эти условия могут даже меняться между моментом первоначальной проверки и временем, когда вы фактически пытаетесь создать свой файл). файл.
Поэтому, если бы у меня был такой сценарий, я бы просто разработал свой метод, чтобы не потерять какие-либо данные в случае сбоя, продолжить работу и попытаться создать свой файл, а также предложить пользователю возможность изменить выбранный каталог и повторить попытку. если создание не удается.
import os
import tempfile
def can_create_file(folder_path):
try:
tempfile.TemporaryFile(dir=folder_path)
return True
except OSError:
return False
def can_create_folder(folder_path):
try:
name = tempfile.mkdtemp(dir=folder_path)
os.rmdir(name)
return True
except OSError:
return False
Я согласен с другими ответами, что способ сделать это - попытаться создать файл и перехватить исключение.
Однако на Vista остерегайтесь UAC! См., Например, "Почему мое приложение позволяет мне сохранять файлы в папках Windows и System32 в Vista?" Для поддержки старых приложений Vista будет "притворяться", что создает файл, в то время как на самом деле она создает его в так называемом виртуальном хранилище под профилем текущего пользователя.
Чтобы избежать этого, вы должны специально указать Vista, что вам не нужны административные привилегии, включив соответствующие команды в манифест.exe, см. Вопрос, связанный выше.