2016-05-20 5 views
0

Нам нужно проверить, имеет ли текущая учетная запись 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. благодаря!

+1

Рекомендуется выполнять операцию и обрабатывать любые исключения. Таким образом, не было насущной необходимости улучшать 'os.access' в Windows, чтобы сделать правильный WinAPI' AccessCheck'. Как и в случае, «os.access» проверяет только атрибут файла только для чтения, который вам не подходит. Если бы была проведена надлежащая проверка, то проверка 'os.R_OK' была бы правильной. Право перечислить папку такое же, как право на чтение данных. – eryksun

+0

Вы можете использовать подпроцесс для запуска [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

ответ

0

попробовать с помощью: os.listdir(), было бы сделать Ls в командной строке текущего каталога, однако, Ls будет в виде массива, использовать его как это:

import os 
ls = os.listdir() 
print(ls) 

сделал это ответит на ваш вопрос?

Смежные вопросы