
Скрипт получения прав доступ пользователей Windows ко всем вложенным папкам
Иногда нужно получить список всех пользователей с правами чтение, изменение и выполнение в определенном каталоге с учетом всех вложенных папок.
Скрипт на Python собирает, как локальных пользователей, так и доменных. Публикую, вдруг кому-то пригодится.
import subprocess
import os
def get_permissions_with_icacls_read_rights(folder_path, output_file="permissions.txt"):
"""
Получает права доступа к папке и ее вложенным папкам, используя icacls,
и записывает информацию в текстовый файл, отображая всех пользователей/группы
с правами "изменение", "чтение и выполнение", "список содержимого папки" и "чтение".
Улучшено определение прав на "Чтение".
"""
try:
with open(output_file, "w", encoding="utf-8") as f:
for root, dirs, files in os.walk(folder_path):
f.write(f"Папка: {root}\n")
try:
# Запускаем icacls для получения прав доступа
result = subprocess.run(['icacls', root], capture_output=True, text=True, encoding='utf-8', errors='ignore', check=True)
output = result.stdout
# Разбираем вывод icacls построчно
lines = output.splitlines()
if len(lines) > 1: # Пропускаем первую строку с путем к папке
for line in lines[1:]:
line = line.strip() # Удаляем пробелы в начале и конце строки
# Проверяем, содержит ли строка информацию о правах доступа
if ":" in line and "(" in line:
parts = line.split(":")
if len(parts) > 1:
user_or_group = parts[0].strip()
rights_part = parts[1].strip()
# Извлекаем права доступа из части строки, содержащей права
rights = rights_part.strip("()").upper() # Извлекаем права и приводим к верхнему регистру
# Определяем тип доступа
access_type = []
if 'F' in rights:
access_type.append('Полный доступ')
if 'M' in rights:
access_type.append('Изменение')
if 'RX' in rights:
access_type.append('Чтение и выполнение')
if 'R' in rights and 'RX' not in rights: # Проверяем, есть ли только право на "Чтение"
access_type.append('Чтение')
# Записываем информацию, если есть какие-либо права
if access_type:
f.write(f" Пользователь/Группа: {user_or_group}, Права: {', '.join(access_type)}\n")
f.write("-" * 40 + "\n")
except subprocess.CalledProcessError as e:
f.write(f"Ошибка при выполнении icacls для папки {root}: {e}\n")
except Exception as e:
f.write(f"Ошибка при обработке папки {root}: {e}\n")
print(f"Информация о правах доступа записана в файл: {output_file}")
except Exception as e:
print(f"Ошибка при записи в файл: {e}")
# Пример использования
if __name__ == '__main__':
folder_path = r"ПУТЬ_К_ПАПКЕ" # Замените на реальный путь к папке
output_file = "permissions.txt" # Имя файла для записи
get_permissions_with_icacls_read_rights(folder_path, output_file)
Вместо ПУТЬ_К_ПАПКЕ пишем путь к каталогу, из которого и нужно извлечь список пользователей имеющих права там что-то делать, включая конкретные полномочия.
Результат будет записан в файл permissions.txt.

110