Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Python: нужно проверить права доступа к директории (OS Windows) / 5 сообщений из 5, страница 1 из 1
01.11.2016, 18:26
    #39339255
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python: нужно проверить права доступа к директории (OS Windows)
вопрос: и как же это лучше сделать? (проверяем для пользователя, запустившего скрипт)
в идеале мне бы подошел функционал os.access(), но в Windows 7 он не работает (нет поддержки effective user id)

пока попробовала следующее и привожу результаты

(a)
пробуем и os.access() и с опцией effective_ids=True и получаем ошибку
Код: python
1.
2.
3.
4.
5.
6.
print(os.access(test_dir, os.F_OK, effective_ids=True))
"""
возвращает
NotImplementedError: access: effective_ids unavailable on this platform
не подходит: мне нужен результать именно для пользователя, запустившего скрипт
"""


(b)
пробуем и os.access() c опцией effective_ids=False
Код: python
1.
2.
3.
4.
5.
6.
print(os.access(test_dir, os.F_OK, effective_ids=False))
"""
возвращает
True
не совсем подходит: мы знаем, что папка существует, но мы также хотим знать, что же там можно сделать, и os.access() здесь не помощник (но вопрос существования папки решился, это плюс)
"""


(c)
пробуем os.path
Код: python
1.
2.
3.
4.
5.
6.
print(os.path.isdir(test_dir), os.path.exists(test_dir))
"""
возвращает
True, False
не совсем подходит: мне нужно проверять отдельно read and write permissions
"""
...
Рейтинг: 0 / 0
01.11.2016, 20:58
    #39339373
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python: нужно проверить права доступа к директории (OS Windows)
mini.weblab,
1) Существование директории, наверное лучше всего проверять
os.path.isdir(directory_name)

2) Проверка Read Permission для директории ???

3) Проверка Write Permission для директории ???
...
Рейтинг: 0 / 0
01.11.2016, 22:35
    #39339421
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python: нужно проверить права доступа к директории (OS Windows)
mini.weblab,

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
import os
import random

class Directory_Permissions():
    def __init__(self, directory_location):
        
        def isReadable(dir_location):
            if not os.path.isdir(dir_location):
                return False
            try:
                os.path.getatime(dir_location)
            except PermissionError:
                return False
            else:
                return True
            
        def isWritable(dir_location):
            if not os.path.isdir(dir_location):
                return False            
            tmp_file = "tmp" + str( random.randint(1000, 9999) ) + "_"
            tmp_location = os.path.join(dir_location, tmp_file)
            try:
                fp = open(tmp_location, "w")
            except PermissionError:         
                return False
            else:
                fp.close()
                os.remove(tmp_location)
                return True
            
            
        self.dlocation = directory_location
        self.exists = os.path.isdir(self.dlocation)      
        self.isReadable = isReadable(self.dlocation)
        self.isWritable = isWritable(self.dlocation)
        
if __name__=='__main__':
    dir_location = r"C:\Test01"
    test = Directory_Permissions(dir_location)
    print("Checking permissions: {}".format(test.dlocation))
    print(test.exists, test.isReadable, test.isWritable)



критика и альтернативные решения приветствуются
...
Рейтинг: 0 / 0
03.11.2016, 22:56
    #39341246
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python: нужно проверить права доступа к директории (OS Windows)
mini.weblab,

А где варианты с os.access(os.R_OK) и os.W_OK? Они проверялись и не работают (и почему тогда их в примере нет)? Или не проверялись даже?

Ну и не совсем понятно, где вы с effective/real UID путаетесь. Потому что "для пользователя, запустившего скрипт" - это real uid. А effective uid - это "пользователь, с правами которого сейчас выполняется скрипт". Они вообще обычно совпадают, если не делать лишних (os-specific) телодвижений. Для windows это будет где-то рядом с ImpersonateUser и т.п. А если вы что-то подобное все же делаете, ваш второй код не верен, потому что он будет проверять права для "имперсонифицированного" пользователя (os.access по идее тоже) а не того, кто изначально запустил скрипт.
...
Рейтинг: 0 / 0
04.11.2016, 01:39
    #39341300
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python: нужно проверить права доступа к директории (OS Windows)
1.
maxkarmini.weblab,
А где варианты с os.access(os.R_OK) и os.W_OK? Они проверялись и не работают (и почему тогда их в примере нет)? Или не проверялись даже?

они проверялись, но не дали желаемого результата. проблема описана в первом посте (а): NotImplementedError: access: effective_ids unavailable on this platform.

Если запускать os.access() с опцией effective_ids=False, то мы получаем True для любой существующей папки вне зависимости от прав доступа, и False для несуществующей. Т.е. папка существует и теоретически в нее можно заглянуть и что-то записать, примерно так. :)

2.
я тоже думала, что os.access() по идее, а на практике оказалось, что нет. :)
в Windows функция os.access() работает некорректно, поэтому я пробую альтернативные решения.
Интересует effective UID: т.е. все просто, скрипт запускается и работает от имени одного пользователя, и мы хотим проверить есть ли у данного пользователя права чтения-записи в определенную папку.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Python: нужно проверить права доступа к директории (OS Windows) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]