Есть задача - получить права пользователей на файлы и папки. Решил воспользоваться библиотекой
winsys. Библиотека достаточно простая, вот код который у меня получился:
import json
import winsys
from winsys import fs
from winsys.fs import File, Dir
import pandas as pd
path = "E:/"
def error_handler(error):
print('Словил ошибку', error)
pass
def check_permission(path: str):
# counter = 0
data = []
for file in fs.flat(path, includedirs=True, error_handler=error_handler):
if isinstance(file, Dir):
object_ = {'object': str(file), 'security': [], 'is_permitted': None}
try:
for ace in file.security().dacl:
user = ace.trustee
permissions = fs.FILE_ACCESS.names_from_value(ace.access)
object_['security'].append({'user': str(user), 'permissions': permissions})
object_ = object_ | {'is_permitted': True}
data.append(object_)
except (winsys.security.x_security, winsys.exc.x_access_denied) as error:
object_ = object_ | {'is_permitted': False}
print('Отказано в доступе к ', object_)
data.append(object_)
continue
# counter += 1
# if counter == 100:
# break
data = json.dumps(data)
data = json.loads(data)
return data
def init_process():
data = check_permission(path)
df1 = pd.json_normalize(data)
df2 = pd.json_normalize(data, record_path='security', meta='object')
with pd.ExcelWriter('E:/permissions.xlsx', engine='xlsxwriter') as writer:
df1.to_excel(writer, sheet_name='source', index=False)
df2.to_excel(writer, sheet_name='permap', index=False)
def main():
init_process()
main()
Но жизнь оказалась суровой...Даже выполняя скрипт от администратора есть папки и файлы к которым нет доступа этой учетной записи админа, причина очевидна - другой админ ограничил права на эти объекты, поэтому я хочу просто их пропустить в цикле, но все равно лювлю иключение, что бы я не вернул в error_handler'е
winsys.exc.x_access_denied: (5, 'FindFirstFileW', 'Отказано в доступе.')
При этом если я верну `True`, то вернется исключение
RuntimeError: generator raised StopIteration
Как можно решить эту задачу? (получить права пользователей на объекты, при этом пропустив объекты для которых права отсутствуют). Возможно этьо можно решить с помощью других библиотек, буду рад любой подсказке, спасибо.