Задать вопрос
Rett-oo
@Rett-oo

Как проверить права пользователей на объекты в Windows?

Есть задача - получить права пользователей на файлы и папки. Решил воспользоваться библиотекой 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

Как можно решить эту задачу? (получить права пользователей на объекты, при этом пропустив объекты для которых права отсутствуют). Возможно этьо можно решить с помощью других библиотек, буду рад любой подсказке, спасибо.
  • Вопрос задан
  • 153 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@NortheR73
системный инженер
Как можно решить эту задачу? (получить права пользователей на объекты, при этом пропустив объекты для которых права отсутствуют)
штатными средствами - например, CMD и/или PowerShell
# экспорт ACL в файл рекурсивно, с игнорированием ошибок доступа
# в файле будут относительные пути, и для каждого указаны текущие разрешения в формате SDDL
icacls "yourpath" /save C:\somepath\acl.txt /t /c

то же самое на PowerShell
# запрос ACL рекурсивно, с игнорированием ошибок доступа
# на выходе список с абсолютными путями и SDDL, можно экспортировать в CSV-файл
Get-ChildItem "yourpath" -Recurse -ErrorAction SilentlyContinue | Get-Acl | fl @{"N"="ObjectPath";"E"={($_.Path -split "::")[1]}},sddl
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы