Как проверить, можно ли создать файл в данном каталоге на MS XP / Vista? - PullRequest
6 голосов
/ 16 января 2009

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

Я создал каталог для тестирования, назовем его C:\foo.

У меня есть следующие разрешения для C:\foo:

  • Каталог перемещения / Выполнить файл
  • Удаление подпапок и файлов
  • Удаление
  • Разрешения на чтение
  • Изменение разрешений
  • взять на себя ответственность

У меня нет следующих разрешений для C:\foo:

  • Полный контроль
  • Создание файла
  • Создание папки

Пока я пробовал следующие подходы:

<br> os.access('C:\foo', os.W_OK) == True </p> <p>st = os.stat('C:\foo')<br> mode = st[stat.ST_MODE]<br> mode & stat.S_IWRITE == True

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

Кто-нибудь знает, как я могу написать код, который будет проверять заданный каталог, если у текущего пользователя есть разрешения на создание файла в этом каталоге?

Вкратце - я хочу проверить, есть ли у текущего пользователя Создание файла и Создание папки Разрешения для данного имени папки.

РЕДАКТИРОВАТЬ: Необходимость такого кода возникла из контрольного примера № 3 из программы «Сертифицировано для Windows Vista», в котором говорится:

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

Следует ли это понимать как «Приложение может пытаться сохранить файл в системном каталоге Windows, но не должно аварийно завершить работу при сбое?» или, скорее, «Приложение должно выполнить проверки безопасности, прежде чем пытаться сохранить файл?»

Должен ли я перестать беспокоиться только потому, что сама Windows Vista не позволяет пользователю с наименьшими привилегиями сохранять какие-либо файлы в% WINDIR%?

Ответы [ 4 ]

4 голосов
/ 16 января 2009

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

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

Должен ли я перестать беспокоиться только потому, что сама Windows Vista не позволяет пользователю с наименьшими правами сохранять какие-либо файлы в% WINDIR%?

На мой взгляд? Да.

4 голосов
/ 16 января 2009

Я бы не стал тратить время и LOCs на проверку разрешений. Конечным тестом создания файла в Windows является само создание. Другие факторы могут вступать в игру (например, существующие файлы (или, что еще хуже, папки) с одинаковыми именами, дисковым пространством, фоновыми процессами. Эти условия могут даже меняться между временем первоначальной проверки и временем фактической попытки создания файл.

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

3 голосов
/ 16 января 2009
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
3 голосов
/ 16 января 2009

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

Однако , на Vista остерегайтесь UAC! См., Например, «Почему мое приложение позволяет сохранять файлы в папках Windows и System32 в Vista?» : для поддержки старых приложений Vista «делает вид», что создает файл, в то время как в действительности он его создает в так называемом виртуальном магазине под профилем текущего пользователя.

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

...