Нам нужно проверить, имеет ли текущая учетная запись Windows listdir/[List Folder Contents][1]
права доступа к папке Windows. в настоящее время мы используем os.access(path, os.R_OK)
. однако, по моему мнению, пользователь Windows может иметь доступ для чтения к папке без разрешения List folder Conents
.python: как проверить содержимое папки Windows listdir (список содержимого папки)?
мой тест: создать fodler, конфиг Security
, отрицать List folder/read data
разрешения.
когда я обращаюсь к нему в проводнике окон, You don't currently have permission to access this folder
- это то, что я ожидаю. однако, когда я тестирую на питоне:
>>> p = r'c:\tmp\p'
>>> os.stat(p)
nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_a
time=1463736204L, st_mtime=1463736204L, st_ctime=1463736135L)
>>> os.access(p, os.R_OK)
True
>>> os.listdir(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: [Error 5] Access is denied: 'c:\\tmp\\p/*.*'
os.access => True; os.list => Exception
вопрос
Я не думаю, что os.access()
является собственным Funciton, чтобы проверить List Folder Conents
разрешение, есть ли другие Funciton/Библиотека в Python можно проверить listdir (Список содержимого папки) разрешение ?
понять, что It's easier to ask for forgiveness than for permission
, но я все еще хочу найти правильный способ проверить разрешение listdir. благодаря!
Рекомендуется выполнять операцию и обрабатывать любые исключения. Таким образом, не было насущной необходимости улучшать 'os.access' в Windows, чтобы сделать правильный WinAPI' AccessCheck'. Как и в случае, «os.access» проверяет только атрибут файла только для чтения, который вам не подходит. Если бы была проведена надлежащая проверка, то проверка 'os.R_OK' была бы правильной. Право перечислить папку такое же, как право на чтение данных. – eryksun
Вы можете использовать подпроцесс для запуска [accesschk.exe] (https://technet.microsoft.com/en-us/sysinternals/accesschk.aspx), чтобы проверить доступ для текущего пользователя. Например: 'user = os.environ ['USERNAME'];' out = subprocess.check_output ('accesschk -qdv'% s ""% s "'% (пользователь, путь));' list_access = any (x in out для x в [b'FILE_ALL_ACCESS ', b'FILE_LIST_DIRECTORY']) '. – eryksun