Translate

тест скорости интернета

суббота, 26 апреля 2014 г.

Управление ACL файлов и папок в Windows

Возможности по управлению разрешениями на доступ к файлам и папкам из командной строки.


Утилита takeown

Команда takeown использует следующий синтаксис:takeown /f <файл> [/s <система>] [/u <домен\пользователь>] [/p <пароль>]
рассмотрим возможные параметры команды.параметр /f <файл>Используется для указания файла, который принимается во владение. Можно использовать символпараметр /s <система>Используется для предоставления имени или адреса IP удаленного компьютера, на котором будет запущена команда. По умолчанию команда будет запущена на локальной системе.параметр /u <домен\пользователь>Используется для запуска команды от имени другого пользователя. Это может потребоваться, когда команда запускается на изолированной системе от имени локального администратора.параметр /p <пароль>Используется для указания пароля учетной записи пользователя, если предоставлен параметр /u.
пример:Чтобы принять на себя владения всеми файлами в каталоге D:\Game введите такую команду:takeown /f "D:\Game "Чтобы принять на себя владения файлом pesenka.mp3 на удаленном компьютере nya.xxxxx.com:
takeown /f "D:\pesenka.mp3" /s nya.xxxxx.com
внимание!Сразу после принятия на себя владения файлом или папкой администратор может получать доступ к файлу. Если к папке должны получать доступ множество пользователей, не забудьте обновить права доступа для папки с помощью команды cacls или с помощью Проводника Windows (Windows Explorer).
Полный синтаксис утилиты вы можете получить по команде takeown /?

Утилита Icacls

Эта утилита специально предназначена для работы с ACL. В числе прочего она может сохранить список доступа указанного объекта в файл, а затем применить этот список к указанному объекту.
Открываем командную консоль и сохраняем ACL исходного каталога Temp со всем его содержимым (подкаталоги и файлы) в файл tempACL командой:
Icacls C:\Temp\* /save tempACL /t
По умолчанию утилита сохраняет файл в профиле пользователя — C:\Users\Имя_пользователя. Это обычный текстовый файл, который при желании можно открыть в Блокноте.
Перенесем созданный файл tempACL на SRV1 и восстановим из него ACL каталога Temp командой:
Icacls C:\temp /restore C:\tempACL
синтаксис команды icacls выглядит следующим образом:

icacls папка\файл /setowner Пользователь параметры
Посмотрим несколько конкретных примеров, как можно изменить владельца файла или папки.
icacls "C:\Program Files (x86)\UltraISO\UltraISO.exe" /setowner Administrator /C /L /Qicacls "C:\Program Files (x86)\UltraISO\UltraISO.exe" /setowner "NT SERVICE\TrustedInstaller" /C /L /Qicacls "C:\Program Files (x86)\UltraISO\" /setowner Medvedev /T /C /L /Qicacls "C:\Program Files (x86)\UltraISO\" /setowner Putin /T /C /L /Q

/Q – сообщение об успешном выполнении команды не выводится;
/L – команда выполняется непосредственно над символической ссылкой, а не конкретным объектом;
/C – выполнение команды будет продолжаться несмотря на файловые ошибки; при этом сообщения об ошибках все равно будут отображаться;
/T – команда используется для всех файлов и каталогов, которые которые расположены в указанном каталоге;
А вот как можно изменять разрешения для файла или папки:
icacls папка_или_файл /grant:r пользователь:разрешение
Список разрешений выглядит следующим образом:
D – удаление;
F – полный доступ;
M – изменение;
RX – чтение и выполнение;
R – чтение;
W – запись.
В качестве примера можно привести следующие команды:
icacls "C:\Program Files (x86)\UltraISO\UltraISO.exe" /grant:r Putin:F
icacls "C:\Program Files (x86)\UltraISO\UltraISO.exe" /grant:r Putin:M
icacls "C:\Program Files (x86)\UltraISO\" /grant:r Putin:F
icacls "C:\Program Files (x86)\UltraISO\" /grant:r Putin:RX /T
Чтобы узнать больше, введите в командной строке команду icacls /? и вы получите полный перечень ее команд.


Управление ACL из PowerShell

Как вы знаете, в файловой системе NTFS каждый объект  (файл или папка) имеет свой список контроля доступа (Access Control List, ACL). ACL определяет, кто (или что) имеет доступ к объекту, и какие операции разрешено (или запрещено) этому субъекту проводить над объектом.

В PowerShell для управления ACL есть целых два командлета:
  • Get-ACL — извлекает список ACL для объекта. Полученные данные можно передать для дальнейшей обработки (напр. по конвейеру) или просто сохранить в файл;
  • Set-ACL — устанавливает новые или изменяет существующие списки ACL для объекта.
В качестве самого простого примера скопируем разрешения одной папки на другую:

Get-Acl C:\test | Set-Acl C:\test2

При копировании ACL нужно иметь ввиду, что пользователь, под которым выполняется эта операция  должен являться владельцем (Owner) исходного ресурса (в примере это папка Test) и обладать правом Take Ownership. Дело в том, что при переносе разрешений нельзя перенести другого владельца. Если владельцем папки Test является текущий пользователь и он обладает правом Take Ownership, то все разрешения включая владельца будут скопированы на папку Test2. Если же одно из условий не выполняется, то будет выдана ошибка.
Копирование штука полезная, но чаще приходится задавать разрешения более детально. Для установки разрешений NTFS используется .NET класс FileSystemAccessRule, а список прав перечислен в FileSystemRights Enumeration. Вывести список возможных разрешений можно командой:

[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])

В списке будут показаны как основные, так и детальные разрешения (обычно они показываются на вкладке Advanced).
Для примера попробуем дать пользователю Testuser1 полные права на папку Test2:

#считываем текущий список ACL папки Test2
$acl = Get-Acl C:\Test2
#Cоздаем переменную с указанием пользователя, прав доступа и типа разрешения
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule `
(″Testuser1″,″FullControl″,″Allow″)
#Передаем переменную в класс FileSystemAccessRule для создания объекта
$acl.SetAccessRule($AccessRule)
#Применяем разрешения к папке
$acl | Set-Acl c:\Test2

Удаление разрешений производится по такой же схеме, только вместо метода SetAccessRule будет использоваться метод RemoveAccessRule:

$acl = Get-Acl C:\Test2
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule `
(″Testuser1″,″FullControl″,″Allow″)
$acl.RemoveAccessRule($AccessRule)
$acl | Set-Acl c:\Test2

И еще один момент. Метод SetAccessRule полностью заменяет разрешения для пользователя. Поэтому, если нужно добавить новые права к уже имеющимся, то используем  AddAccessRule.
Для удаления всех разрешений пользователя (полное удаление из ACL) используется метод PurgeAccessRules, для работы которого в качестве параметра нужно передать имя пользователя или группы. В работе этого метода есть одна особенность — он не умеет работать со строковыми значениями имён пользователей и групп, поэтому нужен механизм преобразования строковых значений в SID. Для примера удалим группу Users из списка доступа папки Test2:

#Считываем ACL
$acl = Get-Acl C:\Test2
#Преобразуем строковое значение группы users в SID. Для преобразования воспользуемся
#классом Ntaccout
$users = New-Object System.Security.Principal.Ntaccount (″users″)
#Применяем метод,передав в него в качестве аргумента переменную $users
$acl.PurgeAccessRules($users)
#Применяем ACL к папке
$acl | Set-Acl C:\Test2

Стоит иметь в виду, что подобным образом можно удалять только явно назначенные (не наследуемые) разрешения.
Следующий этап настройки разрешений — это управление наследованием.  За управление наследованием отвечает метод SetAccessRuleProtection. Метод имеет два параметра, каждый из которых может быть $true или $false. Значение первого параметра $true блокирует наследование разрешений от родителя, $false включает наследование для объекта. Второй параметр отвечает за судьбу текущих разрешений для объекта при отключении наследования. Значение $true оставляет унаследованные разрешения в виде явно заданных разрешений, $false наоборот удалит унаследованные разрешения и оставит только те, которые были явно заданы. Например SetAccessRuleProtection ($true,$false) — убираем наследование и удаляем унаследованные разрешения.
По умолчанию вновь созданный объект наследует разрешения от родителя. Для примера создадим новый объект (папку Test3) и отключим у нее наследование:

#Создаем новую папку и выводим ее ACL
md C:\Test3 | Get-Acl | fl
#Считываем ACL папки Test3
$acl = Get-Acl C:\Test3
#Отключаем наследование и удаляем все унаследованные разрешения
$acl.SetAccessRuleProtection($true,$false)
#Применяем ACL к папке Test3
$acl | Set-Acl C:\Test3

Если теперь посмотреть на разрешения папки Test3, то в поле Access мы увидим пустоту. И не удивительно, ведь все наследуемые разрешения мы удалили, а явно заданных у нее не было. Теперь доступ к папке сможет получить только ее владелец (Owner).
И раз речь зашла о владельце. Владельцем объекта автоматически становится пользователь, этот объект создавший - Creator Owner. Есть политика Take Ownership, позволяющая захватывать права владения объектом. По умолчанию это право есть только у членов группы локальных администраторов.
Для управления владельцами объектов в PowerShell  используется метод SetOwner. В качестве примера поменяем владельца папки Test2:

#Считываем ACL
$acl = Get-Acl C:\Test2
#Преобразуем строковый параметр группы Administrators в SID
$group = New-Object System.Security.Principal.Ntaccount(″Administrators″)
#Применяем метод SetOwner
$acl.SetOwner($group)
#Применяем ACL к объекту
$acl | Set-Acl C:\Test2

Честно говоря, управление владельцами объектов в PowerShell  не очень удобно. Например,  нельзя указать в качестве владельца другого пользователя или группу. Владельцем объекта можно назначить только текущего пользователя или его группу. Кроме того, пользователь, под которым выполняется эта операция, должен иметь следующие права:
  • право Take Ownership для данного объекта;
  • права Read и  Change Permissions для данного объекта;
  • право Restore files and directories в локальной политике безопасности.
И последнее. Список методов, использующихся для управления ACL, подробно описан в классе FileSystemSecurity на MSDN.

Пункт смены владельца объекта в контекстном меню проводника

Для упрощения процедуры смены владельца вы можете добавить соответствующий пункт в контекстное меню проводника.
В предлагаемом варианте также используются утилиты командной строки takeown и icacls с определенными параметрами, а полученная команда установит владельцем объекта, на котором будет применяться пункт меню, группу Администраторы (или Administrators в английской версии ОС).


Для добавления пункта меню «Смена владельца» примените этот твик реестра:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\runas]
@="Смена владельца"
"NoWorkingDirectory"=""
[HKEY_CLASSES_ROOT\*\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant администраторы:F"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant администраторы:F"
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Смена владельца"
"NoWorkingDirectory"=""
[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant администраторы:F /t"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant администраторы:F /t"
[-HKEY_CLASSES_ROOT\*\shell\runas]
[-HKEY_CLASSES_ROOT\Directory\shell\runas]


Для удаления этого пункта меню можете использовать следующий твик реестра:

Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\*\shell\runas]
[-HKEY_CLASSES_ROOT\Directory\shell\runas]

Источники:

Комментариев нет:

Отправить комментарий