Управление правами NTFS с помощью PowerShell: Руководство

Если вы являетесь IT-специалистом и испытываете трудности с настройкой разрешений файловой системы для вашей организации, вам повезло. Управление разрешениями NTFS с использованием графического интерфейса пользователя (GUI) занимает много времени, особенно при работе с многими пользователями или группами. К счастью, у нас есть PowerShell, чтобы все улучшить. Как? С помощью модуля Microsoft.PowerShell.Security.

PowerShell имеет две командлета, специально предназначенные для работы с списками управления доступом (ACL) – Get-ACL и Set-ACL. Эти две командлета могут извлекать и присваивать любое количество разрешений NTFS, о чем вы узнаете в этом руководстве. Если вы хотите стать более эффективными и сразу начать использовать управление разрешениями NTFS, продолжайте читать.

Нет времени читать? Нет проблем! Посмотрите это сопутствующее видео от TechSnips.io с Антони Хауэллом ниже:

Управление и отчетность по Active Directory, Exchange и Microsoft 365 с использованием ADManager Plus от ManageEngine. Скачайте бесплатную пробную версию!

Предварительные требования

Для выполнения примеров в этом руководстве вам потребуется:

Создание файлов/папок для тестирования

Этот учебник будет построен вокруг простой “лаборатории” или одной папки. Вы узнаете, как работать с разрешениями NTFS в PowerShell с нуля; на вашей стороне не требуется никаких дополнительных действий.

  1. Для начала откройте сеанс PowerShell от имени администратора.
  2. Создайте пустую папку с именем Share где-то в файловой системе. В следующих примерах предположим, что эта папка находится по адресу C:\Share. Это сделает примеры более краткими и легкими для следования. Вы можете создать этот каталог, скопировав приведенный ниже код:
New-Item -ItemType Directory -Path 'C:\Share'

3. Создайте папку с именем C:\Share\Assets.

New-Item -ItemType Directory -Path 'C:\Share\Assets'

4. Создайте файл с именем client_list.txt в папке C:\Share.

New-Item -ItemType File -Path 'C:\Share\Client_list.txt'

5. Создайте файл с именем client_projects.txt в папке C:\Share.

New-Item -ItemType File -Path 'C:\Share\Client_projects.txt'

6. Затем назначьте переменную для пути к папке Share. Создание переменных упрощает набор и делает путь более удобным для повторного использования. Предположим, что вы используете C:\Share, скопируйте следующий пример кода в ваш сеанс PowerShell:

$dir = 'C:\Share'

7. Нажмите Enter. Теперь у вас есть пустой каталог, и этот путь сохранен как переменная.

Просмотр разрешений NTFS с помощью Get-Acl

PowerShell позволяет быстро просматривать разрешения NTFS с использованием cmdlet Get-Acl. В следующих разделах вы узнаете, как использовать cmdlet для просмотра разрешений NTFS для файла или папки.

Список контроля доступа (ACL представляет собой список записей контроля доступа (ACE). Каждая ACE в ACL идентифицирует доверенное лицо и указывает разрешенные, запрещенные или проверяемые права доступа. Дескриптор безопасности для объекта, который можно защитить, может содержать два типа ACL: DACL и SACL.

Отображение прав NTFS

Традиционно вы просматривали ACL, щелкая правой кнопкой мыши на папке C:\Share, щелкая по Свойства, выбирая вкладку Безопасность и нажимая кнопку Дополнительно. Ниже вы можете увидеть пример того, как GUI отображает разрешения.

Access Control List using Advanced Security Settings for Share

В приведенном выше примере есть некоторые записи разрешений и пронумерованные свойства. Внимательно изучите их, так как вы увидите сравнение позже в этом разделе.

Используя ранее созданную директорию, отобразите текущие права NTFS для директории, используя Get-Acl.

Get-Acl -Path $dir

Теперь вы должны увидеть путь, владельца и детали уровня доступа на следующем снимке экрана.

Access Control List

Свойство Access, показанное на приведенном выше снимке экрана, содержит дополнительную информацию о списке управления доступом (ACL), но оно выходит за пределы экрана, как показано троеточием в конце FullControl выше. Есть лучший способ просмотра этого свойства – заключить предыдущую команду в круглые скобки или круглые скобки, чтобы просмотреть Access свойства объекта. Ищите только свойство Access в этом объекте, запустив следующий код.

(Get-Acl -Path $dir).Access

Вышеуказанную команду также можно выразить, используя объект Access и параметр -ExpandProperties: Get-Acl -Path $dir | Select-Object -ExpandProperty Access

Как показано на следующем снимке экрана, вывод обернут, чтобы упростить просмотр отдельных Access свойств:

Access Control Entities

Просмотр свойств доступа указанным способом может привести к быстрому прокручиванию вывода терминала вниз по экрану, если у вас много сущностей контроля доступа (ACE). Каждая сущность содержит FileSystemRights, AccessControlType, IdentityReference, IsInherited, InheritenceFlags и PropagationFlags свойства. Чтобы сделать это все более читаемым, направьте объекты на Format-Table -AutoSize. Запустите следующую команду.

(Get-Acl -Path $dir).Access | Format-Table -AutoSize

Как видно на следующем снимке экрана, свойства доступа становятся более чистыми и организованными при использовании Format-Table -AutoSize:

Cleaner output when piping to Format-Table

Изучите свойства и номера столбцов. Обратите внимание, что это те же свойства, которые вы видели в графическом интерфейсе пользователя в начале учебника.

Access Control List using Advanced Security Settings for Share

Фильтрация объектов доступа

Иногда вам захочется быть более точным при изучении разрешений NTFS. Для этого вы можете фильтровать конкретный ACE или находить определенные результаты с унаследованными или явными разрешениями NTFS в рамках ACL с использованием PowerShell. Вместо прокрутки окна терминала глазами построчно, вы можете использовать командлет Where-Object для фильтрации.

Приведенный ниже пример кода фильтрует объекты, не наследующие разрешения NTFS. Это достигается с использованием Where-Object с операндом -Not, рассматривающим текущий объект в конвейере как свойство объекта $_. IsInherited, которое указывает, является ли ACE результатом наследования и не установлено явным образом:

(Get-Acl -Path $dir).Access | Where-Object {$_.IsInherited -eq $true} | Format-Table -AutoSize

Не забывайте направлять объекты к Format-Table -AutoSize, иначе вывод будет прокручиваться вниз экрана. Сделайте это новой привычкой; позже вы мне благодарны будите!

Используя приведенный ниже код, замените 'USERNAME' на другое имя пользователя, чтобы увидеть конкретные результаты:

(Get-Acl -Path $dir).Access | Where-Object {$_.IdentityReference -like 'USERNAME'} | Format-Table -AutoSize

Приведен пример того, как могут выглядеть результаты:

Sample output from the filtering

В приведенном примере показаны все ACE, для которых свойство IdentityReference – это имя пользователя или группа безопасности, которой назначены разрешения.

Продолжайте практиковаться в использовании команды Get-Acl. Изучите различные файлы и папки на вашей системе. Это поможет вам увидеть множество различных дескрипторов безопасности для разных контекстов. Это также поможет развить навыки.

Давайте поднимем планку и назначим разрешения NTFS.

Изменение разрешений NTFS с помощью Set-Acl

Теперь, когда вы можете просматривать разрешения NTFS, пришло время назначать и изменять разрешения NTFS с помощью PowerShell. Команда Set-Acl делает это возможным. В следующих разделах будет показано, как использовать эту команду совместно с Get-Acl, чтобы копировать, изменять наследование и удалять разрешения NTFS для файла или папки.

Копирование разрешений NTFS

У вас может быть файл или папка, содержащие необходимый уровень разрешений NTFS, который вам нужно использовать для нового ACL. Вы можете сэкономить время, копируя разрешения из одного файла или папки в другой.

Копирование существующих ACL/ACE может снизить вероятность человеческой ошибки при настройке разрешений NTFS, предполагая, что дескриптор безопасности, который вы копируете, корректен и соответствует месту назначения. Как говорится, “С великой силой приходит великая ответственность”. Помните об этом.

Рассмотрите следующий снимок экрана. Здесь вы просматриваете ACL для файла в C:\Share под названием Client_List.txt. ACL имеет правильный уровень разрешений NTFS, который вам нужен:

Client list with appropriate NTFS permissions for Bill, the new employee.

Теперь рассмотрим следующий снимок экрана. На этот раз вы просматриваете ACL для другого файла в C:\Share под названием Client_Projects.txt. У этого файла нет нужных вам разрешений NTFS:

Client Projects with no access for Bill.

Вам нужно скопировать разрешения NTFS из Client_List.txt в Client_Projects.txt. Как вы можете это сделать? Вы измените разрешения, получив ACL из Client_List.txt и затем используя командлет Set-Acl с параметром -AclObject. Когда вы запускаете приведенный ниже код, весь ACL из Client_List.txt копируется в Client_Projects.txt :

# Скопировать дескрипторы безопасности из Client_list.txt в Client_Projects.txt
$Acl = Get-Acl -Path 'C:\Share\Client_list.txt'
Set-Acl -AclObject $Acl -Path 'C:\Share\Client_Projects.txt'

Как видно на пронумерованном снимке экрана ниже, файл Client_Projects.txt теперь имеет те же дескрипторы безопасности, что и Client_list.txt.

  1. Получите существующий ACL из существующего файла.
  2. Установите скопированный объект ACL для файла или папки.
  3. Проверьте, что ACL правильно скопирован в файл или папку.
NTFS Permissions Copied

Теперь вы видите, что ACL идентичен для файла Client_Projects.txt как для файла Client_List.txt в столбце IdentityReference с параметром AccessControlType, установленным на Allow. Вы используете ту же технику для назначения разрешений NTFS для папок.

Добавление разрешений NTFS

В последнем разделе вы скопировали существующие разрешения NTFS с одного объекта файла на другой. На этот раз вы собираетесь создать разрешения NTFS с нуля. Это позволит вам назначить разрешения NTFS, которые будут применены к файлу или папке.

Сначала начните назначать некоторые переменные для создания нового объекта, используемого Set-Acl. Этот способ делает его немного проще, когда приходит время запускать команду. Ниже приведен код, который создает свойства ACE, которые станут разрешениями NTFS, назначенными файлу или папке:

# Создать ACE
$identity = 'domain\user'
$rights = 'FullControl' # Другие варианты: [enum]::GetValues('System.Security.AccessControl.FileSystemRights')
$inheritance = 'ContainerInherit, ObjectInherit' # Другие варианты: [enum]::GetValues('System.Security.AccessControl.Inheritance')
$propagation = 'None' # Другие варианты: [enum]::GetValues('System.Security.AccessControl.PropagationFlags')
$type = 'Allow' # Другие варианты: [enum]::GetValues('System.Securit y.AccessControl.AccessControlType')
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($identity,$rights,$inheritance,$propagation, $type)

Затем назначьте еще одну переменную, которая получит начальное ACL для папки Assets. Затем, используя метод члена AddAccessRule, добавьте правило доступа, используя переменную $ACE:

$Acl = Get-Acl -Path "$dir\Assets"
$Acl.AddAccessRule($ACE)

Теперь вы готовы добавить только что созданный ACE к ACL C:\Share\Assets. Теперь используйте Set-Acl, чтобы применить это новое ACE к соответствующему каталогу:

Set-Acl -Path "$dir\Assets" -AclObject $Acl

Затем проверьте, имеет ли выбранный вами пользователь разрешения на просмотр нужного каталога, используя приведенный ниже код:

(Get-Acl -Path "$dir\Assets").Access | Format-Table -Autosize

Удаление разрешений NTFS

Возможно, наступит момент, когда вам потребуется удалить разрешения NTFS для ресурса.

Для удаления разрешений NTFS начните с получения текущего ACL для файла или папки. В этом примере файл называется Client_Projects.txt:

$Acl = Get-Acl -Path "$dir\Client_Projects.txt"

Теперь отфильтруйте нужный ACE, который вы хотите удалить. Для этого вызовите объекты-члены $Acl и направьте результаты на Where-Object и несколько операндов:

$Ace = $Acl.Access | Where-Object {($_.IdentityReference -eq 'domain\user') -and -not ($_.IsInherited)}

Затем используйте переменную $Acl, которая содержит текущие дескрипторы безопасности ACL, вызовите метод RemoveAccessRule и передайте объект ACE, созданный выше с помощью cmdlet New-Object, методу RemoveAccessRule(). Это удалит запись:

$Acl.RemoveAccessRule($Ace)

Важно помнить, что вы изменили существующий ACL здесь и еще не подтвердили изменения.

Теперь, чтобы изменения вступили в силу, выполните cmdlet Set-Acl, предоставив параметры -Path и -AclObject с соответствующими значениями "$dir\Client_Projects.txt" и $Acl. После ввода следующей команды нажмите Enter:

Set-Acl -Path "$dir\Client_Projects.txt" -AclObject $Acl

Управляйте и отчеты о каталоге Active Directory, Exchange и Microsoft 365 с помощью ManageEngine ADManager Plus. Скачайте бесплатную пробную версию!

Сводка

В этой статье вы узнали о управлении разрешениями NTFS с помощью PowerShell. Вы узнали о двух командных файлах Get-Acl и Set-Acl, и о том, что они делают с разрешениями NTFS.

Вы также узнали, как использовать фильтры для выбора конкретного ACE в ACL для использования в вышеупомянутых командных файлах. С небольшой практикой вы сможете легко управлять большим количеством запросов на разрешения NTFS, чем когда-либо раньше.

Дальнейшее чтение

Source:
https://adamtheautomator.com/ntfs-permissions/