Года 4 назад мне пришлось хорошенько попотеть с переносом обьектов AD со старого престарого контроллера домена. Тогда я познакомился с замечательной утилитой SubInACL. Первоначально я планировал выложить статью и перевод на oszone.net. В редактировании перевода мне помогал мой друг, и вообще очень хороший человек Вадим Стеркин. Он довольно известная персона в рунете, но если вы вдруг его не знаете, то обязательно посетите его блог. Готов съесть свою шляпу Уверен, что вы найдете много интересного для себя.
SUBINACL —
незаменимый помощник системного администратора
Введение
Эта статья — только небольшое вступление к русскому переводу справки утилиты SubInACL, более подробную информацию об использовании и применении можно найти в самой Справке (там очень неплохой раздел примеров, занимающий большую часть справки), а также по ссылкам в конце статьи.
SubInACL — это утилита командной строки, которая позволяет администраторам получать и непосредственно редактировать практически любую информацию, относящуюся к сфере безопасности: разрешения, аудит, владельца. Более того, SubInACL умеет переносить эту информацию используя идентификаторы безопасности SID :
- от одного пользователя к другому
- из одной группы (локальной или глобальной) в другую
- из домена в домен
Все идентификаторы SID, с которыми работает утилита, как локальные, так и сетевые, кэшируются для снижения нагрузки на сеть.
Все, что делается с помощью таких инструментов как Xcalcs, Calcs и Icacls, и даже больше, можно сделать, используя SubInACL.
Название утилиты происходит от англ. «SUBstitute SIDs in ACL» т.е. подмена идентификаторов безопасности напрямую, а не через разрешения. Отсюда вытекают некоторые ограничения в работе с наследованием и разрешениями.
Основное предназначение утилиты – упростить процедуру различных сценариев миграции. Например миграция пользователей в новый домен из рабочей группы и из домена в домен. Или миграция файлов с сервера на сервер, от пользователя к пользователю. Утилита существует со времен Windows NT 3.51, но работает и на всех последующих версиях ОС ветки NT. По словам разработчика SubInACL стала предшествинницей такого известного инструмента для миграций как ADMT.
Список объектов, с которыми работает утилита, очень широк:
- Файлы;
- Папки;
- Ключи реестра;
- Службы;
- Принтеры;
- Метабазы IIS;
- Общие папки;
- Кластерные общие папки;
- Исполняемые процессы;
- Объекты ядра;
- Объекты именованного канала (\\.\pipe\);
- Объекты почтовых слотов (\\.\mailslots\);
- Объекты безопасности SAM;
Дескрипторы безопасности и SubInACL
Для уверенной работы с утилитой необходимо понимать назначение и устройство Дескрипторов безопасности, разбираться в терминах SID, ACL, SACL, DACL, ACE, PACE, AACE (подробнее см. раздел Ссылки).
Дескриптор безопасности — это специальная структура, которая хранит:
- информацию о безопасности объекта, включающую идентификатор безопасности (SID) владельца объекта
- два вида списков ACL – системный список контроля доступа SACL и список управления доступом DACL
- прочую информацию
SubInACL получает информацию о разрешениях, аудите, владельце объекта в дескрипторах безопасности объектов из списков контроля доступа ACL (Access Control List), которые состоят из отдельных записей — ACE (Access Control Entries). Каждая такая отдельная запись содержит информацию о разрешениях (аудите) для отдельного пользователя (или группы пользователей).
Эту систему можно сравнить с бюро пропусков на предприятии с разделяемым доступом. В каждом здании предприятия есть проходная, где для входа вы предъявляете свой документ (SID), в журнале посещений делается отметка о вашей попытке войти (SACL) и по списку посетителей проверяется ваше право на вход (DACL). В данном случае SubInACL можно сравнить с сотрудником службы безопасности этого предприятия, который может разрешить или запретить при необходимости доступ посетителей на любой объект.
Синтаксис
Синтаксис утилиты немногим отличается от других консольных продуктов Microsoft – команды и опции выделяются наклонной чертой – ‘/’. Разделителем команды и ее опций, обычно, служит символ равно ‘=’. Однако, есть исключение параметр – имя объекта (путь к нему), например, отделяется пробелом.
Пример:
Subinacl /noverbose=0 /file C:\Example.file /display=sdsize
отобразит дескриптор безопасности файла C:\Example.file. Как видно, между опцией тип_объекта и именем_обьекта стоит пробел, а не символ разделителя «равно», как в прочих параметрах.
Более того, команды /file и /subdirectories тоже могут использовать символ разделитель, но только для задания параметров =directoriesonly или =filesonly, путь к объекту все равно отделен пробелом. Обратите на это внимание.
Вы можете изменить символ разделитель на любой другой с помощью параметра /separator=символ, если символ ‘=’ нужен для других целей.
Дополнительные возможности утилиты направлены в основном на повышение производительности и удобства работы. Например, любую команду можно не указывать целиком, а напечатать первые три буквы. Например, вместо
Subinacl /noverbose /file c:\some.txt /display
можно напечатать
Subinacl /nov /fil c:\some.txt /dis
Не забывайте при наличии пробелов заключать пути к объектам или их имена в кавычки! Иначе вместо запрета доступа к ветке HKLM\Software\Microsoft\Windows NT\CurrentVersion\Terminal Server, Вы запретите доступ к ветке HKLM\Software\Microsoft\Windows !
SubInACL по умолчанию (если не указанно иное) запускается со следующими опциями:
/verbose /statistic /expandenvironmentsymbols /notestmode
Условно можно сгруппировать команды и опции по выполняемым задачам:
- Управляющие: setowner, owner, perm, audit, testmode, notestmode, accesscheck, setprimarygroup, grant, deny, sgrant, sdeny, revoke, playfile;
- Обслуживание SID: cleandeletedsidsfrom, suppresssid, compactsecuritydescriptor, dumpcachedsids, findsid;
- Обслуживание миграции: accountmigration, replace, changedomain, migratetodomain, alternatesamserver, offlinesam;
- Управление выводом: display, confirm, ifchangecontinue, pathexclude, objectexclude, outputlog, errorlog, stringreplaceonoutput, expandenvironmentsymbols, noexpandenvironmentsymbols, statistic, nostatistic, separator, noverbose, verbose;
Важные особенности
Следует отметить ограничение утилиты — нельзя использовать комбинацию из разрешающей ACE и запрещающей ACE одновременно. Также SubInACL может задавать только общие разрешения (Read, Write). Несмотря на это выводится информация в «низкоуровневом» формате с отображением особых разрешений, и можно «схитрить» используя язык SDDL (/display=sddl) и команды /outputlog, /playfile.
Имеется в виду выгрузка дескриптора безопасности в файл в формате SDDL (а можно выгрузить и просто в режиме /noverbose , но редактировать шестнадцатеричную маску доступа конечно не так удобно :-) ручное изменение и последующее применение этого файла:
Subinacl /noverbose /outputlog=sddl_format.txt /file C:\test.exe /display=sddl
Также утилита не умеет управлять наследованием разрешений, что несколько огорчает. Интересно, что ни один автор статей прочитанных мной, почему- то не додумался до «хитрости» с командами /display=sddl и команды /outputlog, /playfile. Сразу скажу – полноценно такой способ работать будет не всегда, поэтому лучше им не пользоваться. Не забывайте об этом ограничении – если вы хотите задать разрешение на папку с файлами, Вам придется задать разрешение и на все файлы в папке.
Опция /offlinesam позволяет работать с SID в случае недоступности домена или локальной базы SAM. Предварительно надо создать файл с идентификаторами SID. Такой файл можно создать, используя опцию /dumpcachedsids. Обратите внимание – это опция, и она работает только в связке с другими командами, либо в командном файле. Чтобы быстро выгрузить буферизированные SID в файл, выполните на компьютере источнике базы SAM команду
Subinacl /dumpcachedsids=filename.txt /subdirectories D:\*
где диск D: — диск с которым работают пользователи, над чьими учетными записями будут производиться в дальнейшем действия, а filename.txt – файл, куда будет выгружен локальный буфер идентификаторов безопасности. В случае, если база SAM на локальном компьютере или домене не содержит нужных записей, но все-таки где-то в сети есть компьютер с нужной информацией – используйте команду /alternatesamserver.
В справке не совсем верно отражена равнозначность опций /verbose=1 и /verbose=2 опции /verbose. На самом деле только опция /verbose=2 аналогична /verbose, а опция /verbose=1 выдает сокращенный вывод, аналогичный /noverbose , отличаясь от него только наличием информации о наследовании. Разработчик рекомендовал мне не использовать /verbose=1. Недокументированный же ключ /verbose=0 вообще полностью аналогичен /noverbose. Все это легко проверить самостоятельно.
Используя команды /file /subdirectories, не забывайте про их параметры [=directoriesonly | =filesonly].
Команда /display также имеет необязательные параметры [=dacl | =sacl | =owner | =primarygroup | =sdsize | =sddl], из них поясню последних два. Sdsize — покажет размер дескриптора безопасности объекта, а sddl покажет дескриптор безопасности в традиционной строковой «буквенно- точеченой» записи. Если применить этот параметр с опцией /outputlog, то можно получить такие записи в файле отдельно от другой информации.
Пример использования
Приведу небольшой пример использования утилиты.
Крупная организация мигрирует из рабочей группы в домен. Задача — не прерывая работы пользователей перевести все компьютеры из рабочей группы в домен, при этом перенести старые профили пользователей в новые (не затрагивая старый профиль).
Очевидно, основная трудность в этой ситуации – отсутствие прав доступа у новой доменной учетной записи пользователя к старому профилю пользователя (папке пользователя и файлу реестра NTUSER.DAT).
Подразумевается, что оба профиля уже существуют, т.е. был осуществлен вход под именем нового пользователя хотя бы один раз.
Решение задачи – войти под учетной записью Администратора Домена и скопировать все папки и файлы из старого профиля в новый, включая кусты реестра NTUSER.DAT и UsrClass.DAT, заменив, таким образом, новый профиль настройками из старого профиля. Проблема доступа к кусту реестра решается заменой разрешений для старой учетной записи на разрешения для новой.
В масштабах 1-2 компьютера это можно сделать вручную. Но в рамках предприятия эта процедура будет довольно утомительной. Поэтому оптимальным решением будет написать скрипт.
@Echo off
Set OLD_USER=%1
Set NEW_USER=%2
Set USER_DISK=%3
Set USRCLASS=”Local Settings\Application Data\Microsoft\Windows”
Rem Извлекаем из реестра полный путь к папке, содержащей профили пользователей
SET profiles=%AllUsersProfile%
SET profiles=%profiles:~0,-10%
Rem Копируем профиль и заменяем его владельца
xcopy «%profiles%\%OLD_USER%\*.*» «%profiles%\%NEW_USER%» /E /Q /H /R /K /Y
Subinacl /noverbose /subdirec «%profiles%\%NEW_USER%» /setowner=»%NEW_USER%»
Subinacl /noverbose /subdirec «%profiles%\%NEW_USER%\*» /setowner=»%NEW_USER%»
Rem Загрузка скопированного куста старого пользователя и замена разрешений
Reg Load HKEY_USERS\Temph «%profiles%»\%NEW_USER%\NTUSER.DAT
Reg Load HKEY_USERS\Temph2 «%profiles%»\%NEW_USER%\%USRCLASS%\USRCLASS.DAT
Subinacl /noverbose /subkeyreg HKEY_USERS\Temph /replace=%OLD_USER%=%NEW_USER%
Subinacl /noverbose /subkeyreg HKEY_USERS\Temph\* /replace=%OLD_USER%=%NEW_USER%
Subinacl /noverbose /subkeyreg HKEY_USERS\Temph2 /replace=%OLD_USER%=%NEW_USER%
Subinacl /noverbose /subkeyreg HKEY_USERS\Temph2\* /replace=%OLD_USER%=%NEW_USER%
Reg Unload HKEY_USERS\Temph
Reg Unload HKEY_USERS\Temph2
Pause
Exit
Запуск скрипта осуществляется с указанием старого и нового имени профиля пользователя, например
mig2dom.cmd IvanPetrov VasiliyZaytsev
Из примера хорошо виден недостаток SubInACL – из-за неумения работать с наследованием приходится менять разрешения отдельно на папку и отдельно на вложенные в нее объекты. Однако с другой стороны утилита умеет работать с большим количеством объектов, чем другие утилиты не могут похвастаться.
Ссылки
1. Изменение разрешений с помощью SubinACL
2. Управление списком контроля доступа
3. Контроль доступа. Знакомство с правами доступа к файлам и реестру Windows
4. Путеводитель по разрешениям файловой системы
5. Простейший пример применения — возврат прав пользователя для множества файлов и подпапок.

Reblogged this on Mcp Club Minsk's Blog and commented:
Если надо разобраться в утилите, сначала, лучше прочесть предисловие