Создание и изменение в Powershell NTFS разрешений ACL
Основной способ ограничения доступа к файлам и папкам дает файловая система NTFS с ее таблицами ACL. Это может быть право только на чтение файла (открытие и просмотр), на чтение и запись (открытие, просмотр, изменение и сохранение) и многие другие. Такие права мы чаще устанавливаем через GUI назначая права не конечному пользователю, а группе в которой он состоит. Все действия по созданию и изменению мы так же можем сделать через Powershell.
Навигация по посту
На мой взгляд использование консоли Powershell лишнее при выдаче таких прав. Риск совершить ошибку в консоли намного выше, чем при работе в GUI, да и время для написания команды уйдет больше. Есть специфичные задачи, например в виде аудита или перенос прав где Powershell очень поможет.
Основы разрешений
Оба этих типа разрешений хранятся в специальной таблице MFT (Master File Table).
Основное средство для редактирования этих разрешений в GUI можно увидеть зайдя в свойства файла или папки:
В области 4 выделены следующие разрешения:
Чаще всего мы работаем с разрешениями выше, но есть еще один список с возможностью настройки прав более тонко:
Групповые разрешения могут принимать флаги Allow и Deny, которые разрешат или запретят указанные действия. Указывать разрешения для пользователей через Deny считается плохой практикой и практически не используется.
Кроме этого существует наследование:
Наследование помогает установить разрешения для одной папки так, что оно будет применяться ко вложенным файлам и папкам. Если наследование отключить (2), то у нас будет возможность убрать все наследуемые разрешения или оставить их.
Функции по работе со строками в Powershell
Получение текущих разрешений в Powershell
На примере ниже я верну разрешения для папки «C:\TestFolder\»
В области 1 выделен владелец папки, а под областью 2 отображаются все группы и пользователи с правами.
Мы можем проверять права не только локальной, но и сетевой папки. На примере ниже возвращена та же папка:
Поиск всех папок с правами у определенной группы
Представим, что мы хотим проверить права данные определенной группе. Мы можем заходить в свойства каждой папки и смотреть вкладку «Безопасности», а можем сделать это через Powershell.
Обычно у нас есть какой-то каталог с общим доступом с папками внутри, на которые мы выдаем разрешения. В моем случае такой каталог «Moscow», а на папки внутри я уже даю права:
В следующем примере я узнаю на какие папки установлены разрешения для TestGroup:
Изменение, копирование и добавление разрешений
Возможности добавить нового пользователя в список ACL или изменить его права одним командлетом у нас нет. В обоих случаях мы должны будет создавать копию объекта ACL, изменять ее отдельным классом, а затем применять используя метод. Сам объект, который мы получаем через Get-ACL, имеет множество методов:
Для создания нового объекта с правами используется класс «FileSystemAccessRule», который в команде будет выглядеть так:
Расшифровать значения можно следующим образом:
Изменение и добавление прав у пользователя и групп
Допустим у нас есть пользователь «Test User (001)» с возможностью чтения папки «Folder1» и мы хотим добавить еще права на запись. Это будет выглядеть так:
Наследование типа ‘ContainerInherit, ObjectInherit’ говорит о том, что оно касается этой папки и всех вложенных папок и файлов.
Таким же образом работает добавление новой группы или пользователя в список ACL:
Права, которые мы можем дать имеют сокращенное название и они отображены далее:
При этом вы можете применить набор разрешений, например в виде Write, но результат будет отображаться в виде «Special Premission»:
Если бы я указал наследование в виде ‘ContainerInherit, ObjectInherit’, то права бы применились как нужно:
Поэтому я рекомендую смотреть существующие разрешения на примере того, как я сделал это выше.
Удаление прав у пользователя или группы
Для удаления всех разрешений есть метод «RemoveAccessRuleAll». Работает он так же:
Смена владельца
Смена владельца файла или папки делается через метод SetOwner. Этот метод, в качестве идентификатора, принимает SID пользователя и что бы его узнать нужно использовать класс «System.Security.Principal.Ntaccount». На практике это выглядит так:

Как отсортировать в Powershell объекты через Sort-Object
Включение или отключение наследования папок и файлов
Для управления наследованием используется метод «SetAccessRuleProtection», который устанавливает следующее:
Сбор всех прав и их экспорт в CSV
Учитывая примеры выше мы можем временно собирать отчеты по выданным правам. Пример того, как может выглядеть отчет:
Как узнать владельца папки или файла

К сожалению, чтобы определить владельца файла с помощью проводника нужно сделать множество щелчков мышью. Чтобы получить интересующую Вас информацию быстро, откройте окно командной строки и введите в ней команду:
Dir \Q имя_файла
После нажатия клавиши Enter утилита Dir отобразит имя владельца файла. Как правило, владельцем файла является пользователь, создавший его. В самом худшем случае он способен переадресовать Вас к лицу, способному определить, что делать с файлом. Достоинством метода является возможность одновременной проверки множества файлов, особенно если эти файлы имеют одно расширение.
Если Вы подозреваете, что решение задачи подобным способом отнимает слишком много времени, воспользуйтесь проводником. Щелкните на файле правой кнопкой мыши и выберите в контекстном меню команду Свойства. В окне свойств перейдите на вкладку Безопасность и щелкните на кнопке Дополнительно. В диалоговом окне Дополнительные параметры безопасности перейдите на вкладку Владелец, в которой расположено поле Текущий владелец этого элемента. Именно в этом поле Вы найдете информацию о владельце файла. Единственной веской причиной для использования описанного метода является смена владельца файла — задача, которую не так просто решить с помощью командной строки.
Работа с файлами и папками
Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows. В этой статье описывается выполнение конкретных задач по управлению файлами и папками с помощью PowerShell.
Получение списка файлов и папок, содержащихся в папке
Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:
Копирование файлов и папок
Эта команда работает, даже если целевой объект доступен только для чтения.
Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.
Создание файлов и папок
Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.
Эта команда создает папку C:\temp\New Folder :
Удаление всех файлов и папок, содержащихся в папке
Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse :
Подключение локальной папки как диска
Чтение текстового файла в массив
Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее:
Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:
Получаем отчеты по сетевым папкам с помощью PowerShell
Получаем все сетевые папки
Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам даже не нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.
Вместо chi-fp01 укажем имя интересующего нас компьютера
Запустив эту команду Вы получите все сетевые папки, включая принтеры (если таковые имеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Все экземпляры Win32_Share имеют свойство Type, как показано в таблице 1.
Добавим фильтр в первоначальную команду:
Тем самым мы выводим только нужную информацию.
Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) – фильтр придется слегка переписать:
В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки, кроме тех, которые скрыты чуть сложнее.
Получаем размер сетевой папки
Довольно часто необходима информация о том, сколько места занимают файловые шары. Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:
В итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие и наибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то же самое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и 3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашей техникой WMI, чтобы получить отчет о размере высокоуровневых папок.
Пример 1: Отчет о размерах высокоуровневых сетевых папок
Вы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужна удобоваримая таблица? Просто используйте следующую команду:
Тем самым можно сделать полный отчет по использованию всех папок на файловом сервере не составляет труда. Сэкономьте время, воспользуетесь примером 2.
Пример 2: Отчет об использовании файловых шар
И снова я слегка отформатирую таблицу.
Получаем файлы по владельцу
Двигаемся дальше – найдем владельцев файлов. Если вы используете квоты, отчеты уже наверняка получаете. В противном случае, все, что вам нужно – это извлечь ACL файла, который включает в себя владельца, и агрегировать результаты. Лучше всего добавить владельца файла в качестве кастомного свойства
Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.
Пара усилий и вы можете применить тот же подход к файловой шаре, как указано в коде примера 3.
Пример 3: Группируем файловые шары по владельцу
Я также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символов или содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell 3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.
Опять выведем читаемую таблицу.
Получаем файлы по дате создания
Последняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчета с последними созданными файлами. Фактически, мы создаем коллекцию объектов, которую можем использовать несколькими способами. Возможно вы захотите использовать объекты или удалить или переместить файлы, или можете захотите построить отчет, который можно отправить руководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать.
Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеет несколько свойств, которые вы возможно захотите использовать. Например, команда:
дает вывод, представленный на скриншоте ниже.
Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу в последний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся через сторонние программы, например, антивирус, что само по себе уже не означает правды. И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете его включить. Вам также нужно быть осторожным, потому что эти значения могут меняться в зависимости от того, копируете ли вы или перемещаете файлы между дисками (between volumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставить PowerShell сказать нам, насколько стар файл. См. пример 4.
Пример 4. Определяем возраст файлов
Свойство Age является объектом TimeSpan, и свойство Days является просто свойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мы можем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы, которые не менялись за последние 400 дней.
Я пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты от запуска этого код в удаленной сессии на моем файловом сервере.
Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меня есть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда.
Одной из моих любимых техник является определение того, сколько файлов было изменено за год.
Как вы можете видеть на скриншоте, все выглядит причесано. Нужны детали? Можно проанализировать свойство Group, которое представляет собой коллекцию файлов.
Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простого способа использовать Group-Object для этого не существует, поэтому мне необходимо придется «пойти иным путем»; смотрите пример 5.
Пример 5: Определяем период изменения файлов
На рисунке ниже показан результат, когда я запустил этот код для папки с моими скриптами, которая, как я знаю, имеет плотное распределение по возрасту (decent age distribution). Мой код не включает в себя актуальные файлы, но это было бы слишком сложно изменить мой пример.
За основу поста использована первая часть статьи File Server Management with Windows PowerShell.
Кстати, о том, как найти файлы с помощью PowerShell и WMI Джеффри Хикс пишет в своем блоге (часть 1 и 2).
Управление файловыми серверами с помощью Windows Powershell
Управление файловыми серверами воспринимается как скучное и неблагодарное занятие многими специалистами по ИТ. Но так быть не должно. С помощью Windows Powershell вы научитесь эффективно управлять общими файловыми ресурсами и, может быть, даже найдете в этом интерес
. Причем это не потребует написания сценариев. Все, что я собираюсь показать, потребует всего несколько интерактивных команд. Конечно, если вам придется запускать эти команды часто, сохранить их в виде сценария или функции будет логично.
Особенность Powershell заключается в том, что вы можете взять результаты команд, которые я собираюсь показать, и сделать с ними все, что захотите. Необходимо сохранить результат в файл. csv? Используйте Export-CSV. Нужен отчет в формате HTML? Вам поможет ConvertTo-HTML. Кроме того, все, что я собираюсь продемонстрировать, масштабируется; если вы можете применить команду для одного компьютера, она может быть использована для 10, 100 или 1000 систем.
Сначала я покажу вам, как управлять тем, что уже находится в общих папках. Затем мы рассмотрим процесс создания и удаления общих папок.
Получение списка общих папок
Давайте начнем с определения того, что находится в общих папках. Просто создайте запрос к классу Win32_Share инструментария управления WMI. Вам даже не нужно регистрироваться на файловом сервере, вы можете запустить эту команду со своего рабочего места:
После выполнения данной команды вы получите список общих ресурсов, включая принтеры (если они есть). Поскольку мы говорим об общих файловых ресурсах, давайте изменим запрос соответствующим образом. Каждый объект Win32_Share имеет свойство «Тип», см. таблицу. Таким образом, чтобы ограничить наш запрос, мы можем добавить фильтр к первоначальной команде.
![]() |
Таким образом, мы исключили административные общие ресурсы. Это можно увидеть на экране 1.
![]() |
| Экран 1. Вывод неадминистративных общих ресурсов с? помощью WMI |
Для получения списка скрытых общих ресурсов – тех, что заканчиваются значком доллара ($), — вам нужно лишь немного изменить фильтр:
В WMI символ % используется как знак подстановки. Поэтому получить список общих ресурсов, за исключением скрытых, немного сложнее, нам потребуется сравнение с использованием подстановочного символа:
Определение размера папки
Одной из типичных задач администратора является создание отчетов о том, как много места занимает папка. Быстрый способ — задействовать команду Get-ChildItem, или ее псевдоним (alias) dir, и перенаправить вывод в Measure-Object:
На экране 2 показан приблизительный результат.
![]() |
| Экран 2. Вывод в виде таблицы |
![]() |
| Экран 3. Отчет об использовании дискового пространства на файловом сервере |
Получение списка файлов по владельцу
Другая вариация на эту тему — поиск файлов по их владельцу. Если вы применяете квоты, то вероятно уже составляете отчеты об их использовании. Если нет, то все, что вам нужно, это получить список управления доступом ACL для файла, который включает владельца, и обработать результаты. Мне кажется, лучший способ — это добавить владельца как настраиваемое свойство:
Мы можем сгруппировать полученный результат по владельцу, а затем обработать полученный объект.
Приложив лишь немного усилий, вы сможете использовать эту же технику и для общих файловых ресурсов, как это делает код, указанный в листинге 3. Также необходимо отметить, что вы можете столкнуться с проблемами, если длина пути к файлу превышает 260 символов или если имена файлов содержат необычные символы, особенно при выполнении команды Get-Acl. В Powershell 3.0 эта команда поддерживает параметр – LiteralPath, который поможет в данном случае.
Нужно признать, что некоторые из приведенных примеров требуют набора довольно большого количества текста, и это не единственный способ выполнения задач, но они демонстрируют, что вы можете сделать. Для разовых отчетов можно обойтись меньшей детализацией. На экране 4 показан пример кода, который представляет результаты в виде таблицы.
![]() |
| Экран 4. Разовый отчет |
Получение файлов по возрасту
Последний прием, который я хочу продемонстрировать, это составление отчетов, основанных на времени создания файлов. На самом деле мы создаем коллекцию объектов, которую можем в дальнейшем использовать несколькими способами. Вы можете задействовать эти объекты для удаления или перемещения файлов или для создания отчета, который затем можно отправить руководству по электронной почте. Всегда составляйте команды Powershell, держа в уме их повторное использование в дальнейшем.
Определение возраста файла — нетривиальная задача. В 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.
![]() |
| Экран 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.
![]() |
| Экран 10. Создание общей папки с помощью Powershell Workflow |
Нет ничего плохого в использовании графического интерфейса для управления файловыми серверами. Но если вам нужны специальные отчеты или автоматизация, Powershell — лучшее, что может быть.
Если у вас есть вопросы по поводу этих примеров (или другие вопросы относительно Powershell), воспользуйтесь форумами на PowerShell.org.
Листинг 1. Получение отчета о размере папок верхнего уровня
Листинг 2. Создание отчета об использовании общих ресурсов на файловом сервере
Листинг 3. Группируем вывод по владельцу файла
Листинг 4. Определяем возраст файла
Листинг 5. Определяем время последнего изменения файла
Листинг 6. Создание, изменение и применение правила доступа
Листинг 7. Настройка общего ресурса
Листинг 8. Удаление общего ресурса
Листинг 9. Создание общего ресурса и установка прав NTFS
Поделитесь материалом с коллегами и друзьями





























.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)


