Расшарить папку windows 10 powershell

Обновлено: 04.07.2024

Управление файловыми серверами воспринимается как скучное и неблагодарное занятие многими специалистами по ИТ. Но так быть не должно. С помощью Windows Powershell вы научитесь эффективно управлять общими файловыми ресурсами и, может быть, даже найдете в этом интерес

. Причем это не потребует написания сценариев. Все, что я собираюсь показать, потребует всего несколько интерактивных команд. Конечно, если вам придется запускать эти команды часто, сохранить их в виде сценария или функции будет логично.

Особенность Powershell заключается в том, что вы можете взять результаты команд, которые я собираюсь показать, и сделать с ними все, что захотите. Необходимо сохранить результат в файл. csv? Используйте Export-CSV. Нужен отчет в формате HTML? Вам поможет ConvertTo-HTML. Кроме того, все, что я собираюсь продемонстрировать, масштабируется; если вы можете применить команду для одного компьютера, она может быть использована для 10, 100 или 1000 систем.

Сначала я покажу вам, как управлять тем, что уже находится в общих папках. Затем мы рассмотрим процесс создания и удаления общих папок.

Получение списка общих папок

Давайте начнем с определения того, что находится в общих папках. Просто создайте запрос к классу Win32_Share инструментария управления WMI. Вам даже не нужно регистрироваться на файловом сервере, вы можете запустить эту команду со своего рабочего места:

После выполнения данной команды вы получите список общих ресурсов, включая принтеры (если они есть). Поскольку мы говорим об общих файловых ресурсах, давайте изменим запрос соответствующим образом. Каждый объект Win32_Share имеет свойство «Тип», см. таблицу. Таким образом, чтобы ограничить наш запрос, мы можем добавить фильтр к первоначальной команде.

Типы общих ресурсов и их свойства

Таким образом, мы исключили административные общие ресурсы. Это можно увидеть на экране 1.

Вывод неадминистративных общих ресурсов с?помощью WMI
Экран 1. Вывод неадминистративных общих ресурсов с? помощью WMI

Для получения списка скрытых общих ресурсов – тех, что заканчиваются значком доллара ($), — вам нужно лишь немного изменить фильтр:

В WMI символ % используется как знак подстановки. Поэтому получить список общих ресурсов, за исключением скрытых, немного сложнее, нам потребуется сравнение с использованием подстановочного символа:

Эта команда возвращает все объекты Win32_Share, у которых свойство «Тип» равно 0 и имя не заканчивается на $.

Определение размера папки

В результате вы получите объект, который показывает общее количество элементов, общий объем в байтах, наименьший и наибольший файлы. В предыдущей команде я исключил папки. В Powershell 3.0 предусмотрен лучший способ сделать это, но команда, которую я использовал, работает как в Powershell 2.0, так и в Powershell 3.0. Эта команда относится к тому типу, который лучше запускать локально (хороший повод удаленно использовать Powershell). Код в Листинге 1 задействует эту команду совместно с нашим механизмом WMI для получения отчета о размере папок верхнего уровня. Вы можете форматировать или обрабатывать $results так, как хотите. Как насчет удобной для чтения таблицы? Просто используйте команду:

На экране 2 показан приблизительный результат.

Вывод в виде таблицы
Экран 2. Вывод в виде таблицы

Для создания полного отчета об используемом дисковом пространстве для всех общих файловых ресурсов не потребуется много усилий. Я сэкономлю ваше время: взгляните на листинг 2. Как и в прошлый раз, я могу отформатировать $results так, как хочу. Результат использования этой техники показан на экране 3.

Получение списка файлов по владельцу

Другая вариация на эту тему — поиск файлов по их владельцу. Если вы применяете квоты, то вероятно уже составляете отчеты об их использовании. Если нет, то все, что вам нужно, это получить список управления доступом ACL для файла, который включает владельца, и обработать результаты. Мне кажется, лучший способ — это добавить владельца как настраиваемое свойство:

Мы можем сгруппировать полученный результат по владельцу, а затем обработать полученный объект.

Приложив лишь немного усилий, вы сможете использовать эту же технику и для общих файловых ресурсов, как это делает код, указанный в листинге 3. Также необходимо отметить, что вы можете столкнуться с проблемами, если длина пути к файлу превышает 260 символов или если имена файлов содержат необычные символы, особенно при выполнении команды Get-Acl. В Powershell 3.0 эта команда поддерживает параметр – LiteralPath, который поможет в данном случае.

Нужно признать, что некоторые из приведенных примеров требуют набора довольно большого количества текста, и это не единственный способ выполнения задач, но они демонстрируют, что вы можете сделать. Для разовых отчетов можно обойтись меньшей детализацией. На экране 4 показан пример кода, который представляет результаты в виде таблицы.

Получение файлов по возрасту

Определение возраста файла — нетривиальная задача. В Powershell объект «файл» имеет несколько свойств, которые вы можете использовать. Например:

выводит результат, показанный на экране 5.

Свойства файла
Экран 5. Свойства файла

Лично мне свойство LastWriteTime кажется наиболее подходящим для определения времени, когда предоставлялся доступ к файлу. Мне встречались ситуации, когда свойство LastAccessTime обновлялось сторонним приложением, например антивирусом, что может приводить к ошибочным заключениям. Кроме того, LastAccessTime по умолчанию отключено со времен WindowsVista, но вы можете включить его. Нужно быть осторожным, так как значения этих свойств могут меняться, в зависимости от того, копируете вы или перемещаете файлы с тома на том. Однако окончательное решение остается за вами. Используя данный файл в качестве примера, мы можем с помощью Powershell определить возраст файла, как показано в листинге 4.

Параметр Age — это объект типа TimeSpan, а параметр Days — это просто значение параметра TotalDays данного объекта. Поскольку мы можем выполнить эту процедуру для одного файла, можем и для всех файлов. Давайте взглянем на мой общий ресурс Public и найдем все файлы, которые не изменялись 400 дней.

Я продолжил и включил владельца файла. На экране 6 показан результат выполнения этого кода в удаленной сессии на моем сервере.

Выполнение кода в удаленной сессии
Экран 6. Выполнение кода в удаленной сессии

Я мог сохранить эти результаты в переменную и использовать их повторно по своему усмотрению. Поскольку у меня было полное имя файла, перенаправление переменной в такую команду, как, например, Remove-Item, не составило бы труда.

Еще один подход — создание отчета или коллекции объектов. Для этого потребуется немного больше усилий; после того, как мы посчитаем или определим возраст элемента, потребуется добавить немного логики, чтобы что-нибудь с ним сделать.

Одна из моих любимых техник — это выяснение, сколько файлов было изменено с группировкой по годам (экран 7). И снова для демонстрации я буду использовать интерактивную удаленную сессию на своем файловом сервере.

Поиск времени последнего изменения файлов с?группировкой по годам
Экран 7. Поиск времени последнего изменения файлов с?группировкой по годам

Если мне понадобится больше деталей, то я всегда могу проанализировать параметр Group, который является набором файлов.

Может пригодиться информация о том, сколько файлов не изменялись за последние 30, 90 или 180 дней. К сожалению, нет простого способа использовать для этого Group-Object, поэтому мне пришлось решать задачу «в лоб», как показано в листинге 5. На экране 8 показан результат, который получился в результате обработки этим кодом моей папки со сценариями, в которой, как я знал, располагаются файлы различного «возраста». Мой код не выводит сами файлы, но модифицировать его будет несложно.

Дата последнего изменения файлов
Экран 8. Дата последнего изменения файлов

Создание общих файловых ресурсов

Теперь давайте посмотрим, как можно использовать Powershell для создания общих файловых ресурсов и управления ими. Все, что я продемонстрировал до настоящего момента, будет работать как в Powershell 2.0, так и в Powershell 3.0 (хотя при использовании Powershell 3.0 мои примеры в некоторых местах можно упростить). Управление файловым сервером с помощью Powershell 2.0 требует применения WMI и написания сложных сценариев. Но в Powershell 3.0, особенно если вы используете Windows Server 2012, этот тип управления реализован очень удачно. Я собираюсь переключить передачу и управлять файловым сервером на базе WindowsServer 2012 с компьютера с установленной Windows 8. Таким образом, мне будут доступны некоторые дополнительные функции.

Все, что нам нужно, встроено в модуль SMBShare, который устанавливается в Windows 8 по умолчанию. Команды, входящие в этот модуль, позволяют с легкостью управлять общими файловыми ресурсам как на локальных, так и на удаленных серверах. Я не буду рассматривать каждую команду, но все они имеют схожий формат, и я настоятельно рекомендую прочитать подсказку и просмотреть примеры. Мы начнем с использования команды New-SMBShare, для того чтобы создать новый общий файловый ресурс.

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

Я мог бы использовать эту сессию интерактивно, но я собираюсь запускать команды, используя Invoke-Command, которые более предпочтительны, когда вы настраиваете автоматический процесс. Я создам новую папку:

Теперь более сложная часть. Я хочу назначить разрешения NTFS так, чтобы группа JDHLABDomainUsers имела разрешения на изменения Change. Для этого потребуется создать новое правило доступа, изменить список правил доступа и применить измененный список к папке. Я написал эту команду так, что она использует параметр в качестве пути, что делает возможным ее повторное использование:

Существует возможность ускорить этот процесс, но для ясности я предпочитаю выполнять каждый шаг отдельно. Теперь мы можем создать общую папку.

Я мог бы использовать существующую удаленную сессию, но мне хотелось продемонстрировать, что команду New-SmbShare можно задействовать для подключения к удаленному файловому серверу.

По умолчанию на общий ресурс предоставляются разрешения на чтение ReadOnly. Я предоставил администратором домена полные разрешения FullControl, а всем остальным разрешения на изменения Change. Путь, указанный в параметре path, локальный для удаленного компьютера, на котором должен быть установлен Powershell 3.0

Дополнительные параметры общего ресурса

Мы можем в любое время просмотреть свойства общего ресурса, используя команду Get-SMBShare, как показано на экране 9.

Использование команды Get-SMBShare для?просмотра свойств общей папки
Экран 9. Использование команды Get-SMBShare для? просмотра свойств общей папки

Я применил изменения к одной общей папке, но было бы также просто с помощью Get-SMBShare получить список всех общих папок и затем с помощью Set-SMBShare применить изменение ко всем.

Эта команда получает список всех общих папок (за исключением административных) на сервере SRV2K12RC и устанавливает значение параметра EncryptData, равное True. Мне не хотелось подтверждать каждое изменение, поэтому я установил значение ключа –Confirm равным False. Set-SMBshare ничего не передает дальше по конвейеру, если только не указать параметр –Passthru. Но мне удалось изменить сразу все одной простой командой.

Удаление общих папок

Последнее, что осталось рассмотреть, это удаление общих папок. Код в листинге 8 удаляет общий ресурс, который я только что создал. Может ли быть что-то проще? Конечно, сама папка осталось на сервере нетронутой.

Собираем все вместе

Давайте завершим наш обзор, собрав все части процесса управления в одном месте: рабочем процессе PowerShell Workflow. Я не могу в одной статье описать это огромное дополнение Powershell или приводить примеры кода, но должен сказать, что самое замечательное в Powershell Workflow то, что несколько команд могут выполняться параллельно. Например, после создания папки можно создать общий ресурс и назначить разрешения NTFS, см. листинг 9.

Этот процесс создает новую папку и новый общий ресурс, назначает права пользователю или группе. Я могу запустить его на своем компьютере с Windows 8, чтобы он отработал на удаленном сервере с WindowsServer 2012, следующей командой (ее нужно вводить одной строкой)

Выполнение занимает всего несколько секунд. Результат показан на экране 10.

Создание общей папки с помощью Powershell Workflow
Экран 10. Создание общей папки с помощью Powershell Workflow

Нет ничего плохого в использовании графического интерфейса для управления файловыми серверами. Но если вам нужны специальные отчеты или автоматизация, Powershell — лучшее, что может быть.

Листинг 1. Получение отчета о размере папок верхнего уровня

Листинг 2. Создание отчета об использовании общих ресурсов на файловом сервере

Листинг 3. Группируем вывод по владельцу файла

Листинг 4. Определяем возраст файла

Листинг 5. Определяем время последнего изменения файла

Листинг 6. Создание, изменение и применение правила доступа

Листинг 7. Настройка общего ресурса

Листинг 8. Удаление общего ресурса

Листинг 9. Создание общего ресурса и установка прав NTFS

В Powershell реализована возможность подключать сетевые диски используя протоколы SMB/CIFS. Эта возможность использует разные команды работа с которыми может вызвать сложности. Рассмотрим применение команд на примерах.

Навигация по посту

Как работают в Powershell сетевые диски

Такой способ ограничен пользователем, который открыл консоль или запустил скрипт. Если вы запустите консоль от имени доменного администратора - то обращение к сетевому пути будет от его имени.

Возможность использовать другие учетные записи, а так же подключать сетевые диски, реализованы в 2 командах:

Обе команды, аналогично Get-ChildItem, подключают диски под учетной записью, которая запустила консоль.

Хоть эти команды достаточно старые, в каждой из новых версий Powershell находятся ошибки и баги. На момент написания статьи баги были найдены в версиях 5.1 - 7.1 и все они касались процесса подключения.

Основной момент, который упростит работу с сетевыми папками в Powershell кроется в понимании понятии провайдеров. Создавая сетевой диск обычными средствами Windows вы сразу видите результат в проводнике. Делая то же самое в Powershell вы изначально обращаетесь к провайдеру услуг, а он обращается к Windows. В зависимости от указанных вами параметров и возможностью команды у вас может быть создан диск только в рамках этого провайдера либо в рамках провайдера и области Windows.

Если это сложно понять, то представьте, что среда Windows и Powershell это разные вещи и что бы скопировать файл с одного места на другое - нужно использовать дополнительный параметр, которого может и не быть.

Получение списка сетевых дисков и их удаление

Мы можем получить список сетевых дисков используя обе команды модуля:

Получение списка сетевых дисков через Powershell

Получение информации о сетевом диске в Powershell

Мы можем вывести учетную запись, под которой подключена сетевая папка, следующим образом:

Force удаляет подключение без подтверждения.

Подключение сетевых дисков

Проблемы с командами могут зависеть от версии вашего интерпретатора. Powershell 5-ой версии был предустановлен во всех версиях начиная с Windows 10 и Windows Server 2016. Если вы сомневаетесь в версии, то это можно проверить следующей командой:

Вывод версии Powershell

New-SmbMapping

Самый простой способ подключить диски, используя команду New-SmbMapping, будет выглядеть следующим способом:

Подключение сетевого диска через Powershell New-SMBMapping

В этой команде используются следующие ключи:

Мы можем перезапустить процесс средствами Powershell. Выполнение этой команды, как минимум, закроет все открытые окна:

Перезапуск explorer в Powershell

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

  • New-SmbMapping : Имя локального устройства уже используется.
  • New-SmbMapping : The local device name is already in use.
  • New-SmbMapping : The network name cannot be found.

New-PSDrive

В отличие от предыдущего способа - у него нет проблем с проводником, но после перезагрузки компьютера подключение к диску пропадет. Как я прочитал в каких-то версиях Powershell это исправлено, в каких-то появились новые проблем. Один из способов сделать диск постоянным - будет рассмотрен ниже.

Подключить аналогичный диск можно следующим способом:

Подключение сетевой папки в Powershell с New-PSDrive

У вас могут появиться следующие ошибки:

  • New-PSDrive : The network resource type is not correct;
  • The specified network resource or device is no longer available.

Получение информации о сетевом диске через Powershell в реестре

Изменение настроек сетевого диска через Powershell в реестре

Подключение дисков под другим пользователем

Обе команды позволяют выполнять подключение используя других пользователей. Для каждой из команд этот подход отличается.

Ввод учетных данных в Powershell

Эта переменная будет хранить ссылку на объект в памяти, который нельзя будет экспортировать на другой компьютер. Как упростить процесс, если вы планируете использовать учетные данные на разных компьютерах, рассмотрено в другой статье.

Подключение сетевых дисков в Powershell под другим пользователем

  • UserName - логин;
  • Password - пароль;
  • SaveCredential - нужно ли сохранять учетные данные.

Пример подключения с сохранением учетных данных:

Подключение сетевых дисков в Powershell с New-SmbMapping под другим пользователем

Подключение дисков удаленно



Публикуем вторую часть перевода статьи File Server Management with Windows PowerShell. В первой части мы рассматривали как с помощью PowerShell строить отчеты о сетевых папках.
На этот раз в зоне нашего внимания находятся такие вопросы как создание сетевой папки, делегирование прав доступа к ней и прекращение совместного доступа.

Создаем новые папки

Теперь давайте взглянем на то, как можно использовать PowerShell для создания файлов и папок и управления ими. Все, что я продемонстрирую, Вы можете использовать в PS 2.0 и 3.0 (хотя в PS 3.0 приводимые мною примеры можно упростить). Управление файловым сервером в PowerShell 2.0 требует обращения к WMI и написанию сложных скриптов. В PowerShell 3.0, особенно если у вас Windows Server 2012, этот тип управления значительно упрощен. Именно его я и собираюсь рассмотреть.
Все, что нам необходимо, уже имеется в модуле SMBShare, который по умолчанию установлен на моей машине Windows 8. Команды в этом модуле позволят нам локально и удаленно управлять папками. Я не собираюсь останавливаться на каждой команде подробно – они довольно однотипны; рекомендую прочитать справку и примеры. Мы же начнем с использования команды New-SMBShare, чтобы создать новую папку.
Сделать это нужно за пару шагов. Так как папка должна быть на удаленном сервере, я установлю удаленную сессию PowerShell:


Я, конечно, могу использовать интерактивную сессию, однако передо нами стоит задача автоматизации, так что использую команду Invoke-Command. Для начала я создам новую папку:

А сейчас сложная часть. Я хочу установить такие NTFS разрешения, чтобы JDHLAB\Domain Users имела разрешения на изменения (Change). Для этого необходимо создать новое правило доступа, изменяющего список правил доступа и заново применяющих их к папке. В примере 6 приведен пример скрипта:
Пример 6: Создание, изменение и применение правила доступа

В примере 6 я сделал так, чтобы параметр пути можно было заново использовать.

Существует способы упростить этот процесс, но для целей ясности мы сохраним все так как есть. Сейчас мы готовы создать новую папку.
Я могу использовать эту сессию, но я хочу продемонстрировать, как можно использовать команду New-SmbShare, чтобы удаленно подключиться к файловому серверу:

Право доступа к папке по умолчанию стоит “Только чтение” (ReadOnly). Я выдал доменным админам Полный контроль (Full Control) на папку, и всем остальным выдал права на изменение (Change). Этот путь относителен к удаленному компьютеру, который должен работать под PS 3.0.

Расширенные настройки папки

Получить информацию о папке можно в любое время, использовав команду Get-SMBShare, как вы можете видеть на рисунке 9. Можно сделать еще парочку вещей с нашими папками, например, зашифровать SMB соединение, какой режим перечисления (enumeration mode) и тип кеширования использовать для папки. Я собираюсь использовать Set-SMBShare, чтоб осуществить гибкую настройку для только что созданной папки. Посмотрим это на примере 7.

Пример 7: Гибкая настройка папки


Указанное выше применяется к одной единственной папке, но вы с легкостью можете использовать Get-SMBShare для извлечение всех папок и их последующей передачи в Set-SMBShare и применения изменений к ним всем:

Эта команда извлечет все папки (кроме административных папок) на компьютере SRV2K12RC и установим свойство EncryptData в значении True. Мне не хочется подтверждать каждое действие, поэтому переключатель Confirm установлен в значение False. Set-SMBshare не запишет ничего в конвейер, в том случае если вы не используете –Passthru. Как видите, я смог изменить все с помощью одной единственной команды.

Удаление сетевых папок

Напоследок удалим сетевую папку. Код в примере 8 полностью отключает совместный доступ к папке, которую я только что создал. Можно ли это сделать проще? Конечно, структура папок до сих пор на файловом сервере.

Пример 8: Удаляем сетевую папку

Сводим воедино

А теперь давайте сведем все в одном скрипте. Не вдаваясь с детали кода, отмечу, что команды могут быть запущены параллельно. Например, после создания папки, создаю сетевую папку и устанавливаю NTFS разрешения в то же время, см. пример 9.

Пример 9: Создаем сетевую папку и устанавливаем NTFS разрешения

Этот скрипт создает новую сетевую папку, присваивает разрешения пользователю или группе. Я могу запустить ее из-под Windows 8 или на файловом сервере Windows Server 2012, использовав следующую команду (которая должна быть введена в одну строчку):

Процесс займет пару секунд. Результаты на скриншоте ниже.


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

Технический функционал изменился только возможностью работы с удалёнными компьютерами, но синтаксис был изменён (а так же удалены лишние функции) по аналогии с PrinterUtils и имеет примерно следующий вид:

  1. New-Share –Computer <Computer> –Name <Name> –Path <Path> –Description <Description>
    где Computer – имя или IP адрес компьютера, на котором необходимо расшарить папку. (не обязательный параметр). Если не указан, используется текущий компьютер.
    Name - сетевое имя для папки;
    Path - путь к физической папке;
    Description описание к сетевой папке. При наличии пробелов - заключить в кавычки (не обязательный параметр);
  2. Remove-Share –Computer <Computer> –Name <Name> – отменяет расшаривание на папке. Сама папка не удаляется.
    где Computer – имя или IP адрес компьютера, на котором нужно отменить расшаривание папки. (не обязательный параметр). Если не указан, используется текущий компьютер.
    Name - сетевое имя папки;
  3. Get-Share –Computer <Computer> –Name <Name> – получает основные сведения и списки DACL Share Permissions с указанных или всех сетевых папок.
    где Computer – имя или IP адрес компьютера, с которого нужно получить сведения о сетевых папках. (не обязательный параметр). Если не указан, используется текущий компьютер.
    Name - имя сетевой папки (не обязательный параметр). Если не указан, то выбираются все сетевые папки с типом Disk Drive (в которые системные шары не входят).
  4. Set-SharePermission –User <User> –AceType <AceType> –AccessMask <AccessMask> – устанавливает единственный Share Permission ACE для указанного в аргументах пользователя.
    User - имя пользователя/группы, которой предоставляется доступ;
    AceType - тип доступа. Этот параметр должен иметь одно из значений Allow/Deny;
    AccessMask - маска доступа. Этот параметр должен иметь одно из значений FullControl/Change/Read;

И, собственно, сам код:

Categories: PowerShell | ACL | Shares | WMI
Posted at: 04.03.2009 16:22 (GMT+2) by Vadims Podāns | Permalink | Comments (3)

Comments:

Привет. Классный модуль, но у меня возникла небольшая проблема. У вновь созданного пользователя параметр User в cmdlet *-SharePermission не принимается. Можно как-нибудь изменить, чтобы мог приниматься SID? Я новичок в PS и пока самостоятельно подредактировать модуль не могу - не хватает знаний). Может быть есть альтернативные решения проблемы?

Доброго времени суток. При расшаривании папки на удаленном компьютере командой new-share hostname temp$ c:\temp | add-sharepermission username allow FullControl | set-share шара образуется, но вот "Передельное число пользователей" устанавливается в 0. Поэтому хоть шара и есть, но зайти в неё нельзя. Какой командой можно устанавливать число возможных подключений к шаре?

date

17.01.2020

directory

PowerShell, Windows 10, Windows Server 2016

comments

комментариев 13

Для управления доступом к файлам и папкам в Windows на каждый объект файловой системы NTFS (каталог или файл) назначается специальный ACL (Access Control List, список контроля доступа). В ACL объекта задаются доступные операции (разрешения), которые может совершать с этим объектом пользователь и/или группы . В большинстве случаев администраторы Window для управления NFTS разрешениями на файлы и папки используют графический интерфейс File Explorer (свойства папки/файла -> вкладка Security/Безопасность) или консольную утилиту icacls. В этой статье мы рассмотрим способы управления разрешениями на объекты файловой системы NTFS из PowerShell. Вы можете использовать эти команды в скриптах и для автоматизации управлением NTFS разрешениями на файловых серверах Windows.

упраление ntfs разрешениями на папки из проводника Windows

Встроенные командлеты для управления ACL в NTFS: Get-Acl и Set-Acl

В PowerShell v5 (Windows 10 / Windows Server 2016) для управления ACL имеется два отдельных встроенных командлета (входят в модуль Microsoft.PowerShell.Security):

Мы не будем подробно останавливаться на этих встроенных командлетах, т.к. их функционал в большинстве случае недостаточен для управления NTFS разрешениями в реальных задачах. Рассмотрим лишь несколько типовых примеров их использования.

Выведем текущего владельца папки (файла) и список назначенных NTFS разрешений:

get-acl C:\Drivers\ |fl

командлет get-acl из модуля Microsoft.PowerShell.Security

Path : Microsoft.PowerShell.Core\FileSystem::C:\Drivers\
Owner : WORKSTAT1\root

Group : WORKSTAT1\Отсутствует
Access : NT AUTHORITY\Authenticated Users Allow Modify, Synchronize
NT AUTHORITY\SYSTEM Allow FullControl
BUILTIN\Администраторы Allow FullControl
BUILTIN\Пользователи Allow ReadAndExecute, Synchronize
WORKSTAT1\root Allow Modify, Synchronize
Audit :
Sddl : O:S-1-5-21-3650440056-3766451173-3310994491-1001G:S-1-5-21-3650440056-766451173-3310994491-513D:PAI(A;OICI;0x 1301bf;;;AU)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)(A;OICI;0x1301bf;;;S-1-5-21-3650440056-37664 51173-3310994491-1001) Как вы видите, текущие разрешения также представлены в виде SDDL строки – мы вкратце рассматривали этот формат описания доступа в статье Управление правами на службы Windows.

Можно вывести только списки NTFS разрешений в более понятном формате:

get-acl - узнать ntfs разрешения на каталог или папку из powershell

С помощью следящей команды можно скопировать NTFS разрешения с одной папки и применить их на другую:

Get-Acl C:\Drivers | Set-Acl C:\Distr

Для выполнения этой операции учетная запись должна быть владельцем ресурса (Owner) и обладать правами Take Ownership.

Главная проблема при использовании Set-ACL – командлет всегда пытается сменить владельца ресурса, даже если вы просто хотите изменить NTFS разрешения. В результате, чтобы добавить права на объект нужно использовать такую конструкцию:

$path = "c:\drivers"
$user = "WORKSTAT1\user1"
$Rights = "Read, ReadAndExecute, ListDirectory"
$InheritSettings = "Containerinherit, ObjectInherit"
$PropogationSettings = "None"
$RuleType = "Allow"
$acl = Get-Acl $path
$perm = $user, $Rights, $InheritSettings, $PropogationSettings, $RuleType
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $perm
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path $path

Чтобы убрать NTFS доступ к папке для пользователя или группы:
$path = "c:\drivers"
$acl = Get-Acl $path
$rules = $acl.Access | where IsInherited -eq $false
$targetrule = $rules | where IdentityReference -eq "WORKSTAT1\user1"
$acl.RemoveAccessRule($targetrule)
$acl | Set-Acl -Path $path

Чтобы отключить наследование для папки из PowerShell:

Также с помощью Get-acl и Set-Acl можно управлять параметрами NTFS-аудита объектов (см. статью Кто удалил файл на сервере?), либо информацией о текущих разрешениях на OU в AD.

Используем модуль NTFSSecurity для управления разрешениями из PowerShell

Как я уже говорил, встроенный модуль для управления ACL на объекты в PowerShell не самый удобный. Для управления NTFS правами на файлы и папки в Windows лучше использовать отдельный модуль их галереи PowerShell – NTFSSecurity. Последнюю версию модуля NTFSSecurity (4.2.4 на данный момент) можно установить командой Install-Module -Name NTFSSecurity , или скачать вручную (линк). При ручной установке достаточно распаковать содержимое архива модуля в каталог C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurity (не забудьте разблокировать скачанные файлы).

Импортируйте модуль NTFSSecurity в сессию PowerShell:

Выведем список команд, доступных в модуле (доступно 36 командлетов):

Get-Command -Module NTFSSecurity

NTFSSecurity модуль powershell для управления правами на файлы и папки

Выведем текущие NTFS разрешения на каталог:
Get-Item 'c:\distr' | Get-NTFSAccess

Как вы видите, текущие разрешения представлены в более удобной форме.

Get-NTFSAccess получить текущие ntfs права powershell

Чтобы предоставить конкретному пользователю и группе группе полные права на папку, выполните команду:
Add-NTFSAccess -Path C:\distr -Account 'WORKSTAT1\confroom','BUILTIN\Администраторы' -AccessRights 'Fullcontrol' -PassThru

Совет. По умолчанию командлеты модуля NTFSSecurity не возвращают никаких данных, чтобы команда после выполнения выводила новые ACL, используйте параметр PassThru.

Чтобы предоставить права только на верхнем уровне и не изменять разрешения на вложенные объекты (только на папку), используйте команду:

Add-NTFSAccess c:\data\public -Account corp\aaivanov -AccessRights Modify -AppliesTo ThisFolderOnly

Удалить назначенные NTFS разрешения:

Remove-NTFSAccess -Path C:\distr -Account 'WORKSTAT1\confroom' -AccessRights FullControl -PassThru

Следующей командой можно лишить указанную учетную прав на все вложенные объекты в указанной папке (наследованные разрешения будут пропущены):

Get-ChildItem -Path C:\distr -Recurse | Get-NTFSAccess -Account 'WORKSTAT1\confroom' -ExcludeInherited |Remove-NTFSAccess -PassThru

Следующей командой можно назначить учетную запись Administrator владельцем всех вложенных объектов в каталоге:

Get-ChildItem -Path C:\distr -Recurse -Force | Set-NTFSOwner -Account 'Administrator'

Чтобы очистить все разрешения, назначенные на объекты каталога вручную (не будет удалены унаследованные разрешения):

Get-ChildItem -Path C:\distr -Recurse -Force | Clear-NTFSAccess

Включить NTFS наследование для всех объектов в каталоге:

Get-ChildItem -Path C:\distr -Recurse -Force | Enable-NTFSAccessInheritance

Чтобы вывести все разрешения, которые назначены вручную, исключая унаследованные разрешения:

dir C:\distr | Get-NTFSAccess –ExcludeInherited

Можно вывести разрешения, назначенные для определенного аккаунта (не путайте с эффективными разрешениями, речь о них ниже):

dir C:\distr | Get-NTFSAccess -Account corp\aaivanov

Проверка эффективных NTFS разрешений на объекты из PowerShell

Вы можете проверить эффективные NTFS разрешения на конкретный файл или папку с помощью командлета Get-EffectiveAccess . Допустим вы предоставили доступ на некоторую папку нескольким группам безопасности AD и теперь хотите понять, есть ли у конкретного аккаунта (SID) доступ к данной папке или нет. Как это сделать, не выводя состав групп AD, в которых входит его учетная запись? В этой ситуации как раз поможет функция проверки эффективные NTFS разрешений. Допустим, нужно проверить эффективные права на все вложенные папки в каталоге для пользователя confroom.

Get-ChildItem -Path c:\distr -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'WORKSTAT1\confroom' | select Account, AccessControlType, AccessRights, FullName

Читайте также: