Как проверить, можно ли создать файл в данном каталоге на 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", которая гласит:

  1. Приложение не должно позволять пользователю с наименьшими правами сохранять какие-либо файлы в системный каталог 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, см. Вопрос, связанный выше.

Другие вопросы по тегам