sergey vasin

The IT blog

Назначение прав доступа к файлам и каталогам при помощи PowerShell

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

В некоторых случаях возникает необходимость изменения списков контроля доступа к файлам и каталогам при помощи сценариев. Существует несколько вариантов выполнения этой задачи, например, при помощи Windows Management Instrumentation (WMI). В этой же статье мы рассмотрим применение PowerShell и классов .NET.

В PowerShell существуют два коммандлета для работы со списками доступа: Get-Acl и Set-Acl.

Первый из них считывает права доступа и позволяет записать их в переменную. Второй – применяет права доступа к файлу или каталогу. И, хотя мы можем сохранить определенный набор прав доступа в файле csv или xml и позже применить его к нужным нам объектам, это все же не самый удобный и гибкий способ назначения прав. Нам нужна возможность редактирования существующих прав либо создание новых в самом сценарии без необходимости хранения набора xml- или csv-файлов с различными правами доступа.

Итак, по порядку.

Коммандлет Get-Acl считывает права доступа к папке и возвращает их в виде объекта класса ‘System.Security.AccessControl.DirectorySecurity’

$acl = Get-Acl -Path c:\test

01

Объекты этого класса обладают определенными свойствами и методами. Посмотреть их все можно при помощи коммандлета Get-Member

$acl | Get-Member

В этой статье мы рассмотрим те из них, которые относятся к Discretionary Access Control Lists (DACL), т.е. те, которые относятся к спискам управления доступом.

Свойства.

$acl | Get-Member –MemberType Properties

02

$acl.Access – выводит коллекцию объектов класса ‘System.Security.AccessControl.FileSystemAccessRule’

$acl.Group – выводит основную (primary) группу владельца объекта

$acl.Owner – выводит владельца объекта

$acl.Path – выводит путь к объекту

$acl.Sddl – выводит содержимое списка управления доступом в формате Security Descriptor Definition Language (SDDL)

$acl.AreAccessRilesProtected – если возвращаемое значение $true, это означает что наследование правил управления доступом от родительских объектов отсутствует, если же $false, этот файл или папка наследует правила от родительских объектов файловой системы.

$acl.AccessToString – выводит записи списка управления доступом в виде строк.

Методы.

Теперь рассмотрим полезные для нас методы, список которых мы можем получить, используя команду:

$acl | Get-Member –MemberType Methods

03

$acl.GetOwner() – получает владельца объекта.

$acl.GetOwner(targetType)

04

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

Параметры, которые могут нам пригодиться — NTAccount и SecurityIdentifier.

$acl.GetOwner([System.Security.Principal.NTAccount])
$acl.GetOwner([System.Security.Principal.SecurityIdentifier])

$acl.SetOwner() – задает владельца объекта

$acl.SetOwner(identity)

05

В качества параметра указывается объект NTAccount либо SecurityIdentifier

$user = New-Object System.Security.Principal.NTAccount(‘domain\username’)
$user = [System.Security.Principal.NTAccount]”domain\username”
$acl.SetOwner($user)

$acl.GetAccessRules() – возвращает коллекцию записей списка управления доступом

$acl.GetAccessRules(includeExplicit, includeInherited, targetType)

06

includeExplicit (Boolean) — указывает, выводить ли информацию о записях, явно указанных в списке контроля доступа объекта файловой системы

includeInherited (Boolean) – указывает, выводить ли информацию о записях, наследуемых от родительского объекта файловой системы

targetType – указывает, в каком виде будут представлены значения поля IdentityReference.

В большинстве случаев это будут NTAccount, либо SecurityIdentifier.

$acl.GetAccessRules($true,$true,[System.Security.Principal.NTAccount])

Стоит поговорить о том, что из себя представляет вывод метода GetAccessRules.

Метод GetAccessRulesвозвращает объект класса System.Security.AccessControl.FileSystemRule, который представляет собой коллекцию записей списка управления доступом. Вывод метода аналогичен выводу свойства $acl.Access, с той разницей, что метод позволяет выбрать, выводить ли явные или наследуемые разрешения и в каком виде указывать учетные записи или группы пользователей-обладателей прав.

Поля записи управления доступом:

FileSystemRights — права предоставленные определенному пользователю или группе

AccessControlType — тип записи, разрешающая или запрещающая, ‘Allow’, ‘Deny’

IdentityReference — пользователь или группа – обладатель прав

IsInherited — если значение $true, это означает что запись унаследована от вышестоящих объектов файловой системы, если $false– запись указана явно

InheritanceFlags — флаги наследования, указывают наследуется ли данное правило контейнерами (ContainerInherit) и/или объектами (ObjectInherit), в нашем случае папками и файлами. Может принимать значения ‘None’, ‘ObjectInherit’, ‘ContainerInherit’ и ’ContainerInherit,ObjectInherit’

PropagationFlags — флаги распространения, указывают, распространяется ли запись на сам объект, или только на дочерние объекты (InheritOnly), а также применятся ли данное правило на всю дочернюю иерархию, либо только на файлы и папки, непосредственно вложенные в данную папку (NoPropagateInherit). Может принимать значения ‘None’, ‘InheritOnly’, ‘NoPropagateInherit’ и ‘InheritOnly,NoPropagateInherit’

$acl.SetAccessRuleProtection – указывает, применяются ни наследуемые правила контроля доступа к данному объекту файловой системы.

$acl.SetAccessRuleProtection(isProtected, preserveInheritance)

07

isProtected (Boolean)  — указывает, нужно ли применять к объекту наследуемые правила. При указании значения $true, наследуемые правила применяться не будут, при указании $false, наследуемые параметры применятся к данной объекту файловой системы

preserveInheritance (Boolean) – применяется при отмене наследования, указывает, нужно ли скопировать наследуемые правила и применить их явно

$acl.SetAccessRuleProtection($false, $true)

$acl.AddAccessRule – добавляет запись к списку контроля доступа

$acl.AddAccessRule(rule)

08

В качестве параметра указывается объект класса ‘System.Security.AccessControl.FileSystemAccessRule’

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(identityReference,
fileSystemRights, inheritanceFlags, propagationFlags, accessControlType)

identityReference — может представлять из себя объект класса NTAccount, либо SecurityIdentifier

$identityReference = New-Object System.Security.Principal.NTAccount(‘domain\user’)
$identityReference = New-Object System.Security.Principal.SecurityIdentifier(‘SID’) 

либо

$identityReference = [System.Security.Principal.NTAccount]‘domain\user’
$identityReference = [System.Security.Principal.SecurityIdentifier]‘SID’ 

FileSystemRights — представляетсобойобъекткласса System.Security.AccessControl.FileSystemRights

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

Этот параметр может задаваться несколькими способами.

$fileSystemRights = [System.Security.AccessControl.FileSystemRights]”Read,Write”

либо

$fileSystemRights = New-Object System.Security.AccessControl.FileSystemRights
$fileSystemRights.value__ = числовое значение прав доступа

Права доступа и соответствующие им числовые значения.

Права доступа Битовая маска Название прав при создании объекта
Full Control 2032127 FullControl
Traverse folder / Execute File 32 ExecuteFile
List Folder / Read Data 1 ReadData
Read Attributes 128 ReadAttributes
Read Extended Attributes 8 ReadExtendedAttributes
Create Files / Write Data 2 CreateFiles
Create Folders / Append Data 4 AppendData
Write Attributes 256 WriteAttributes
Write Extended Attributes 16 WriteExtendedAttributes
Delete Subfolders and Files 64 DeleteSubdirectoriesAndFiles
Delete 65536 Delete
Read Permissions 131072 ReadPermissions
Change Permissions 262144 ChangePermissions
Take Ownership 524288 TakeOwnership

Наборы прав доступа и их значения.

Набор прав доступа Права, входящие в набор Битовая маска Название прав при создании объекта
Read List Folder / Read Data 131209 Read
Read Attributes
Read Extended Attributes
Read Permissions
Write Create Files / Write Data 278 Write
Create Folders / Append Data
Write Attributes
Write Extended Attributes
Read and Execute Traverse folder / Execute File 131241 ReadAndExecute
List Folder / Read Data
Read Attributes
Read Extended Attributes
Read Permissions
Modify Traverse folder / Execute File 197055 Modify
List Folder / Read Data
Read Attributes
Read Extended Attributes
Create Files / Write Data
Create Folders / Append Data
Write Attributes
Write Extended Attributes
Delete
Read Permissions

Объект прав доступа не выделяет в отдельную категорию набор прав “ListFolderContents”, поскольку он отличается от “ReadAndExecute” только свойствами наследования, которые задаются при помощи других параметров

InheritanceFlags – этообъекткласса System.Security.AccessControl.InheritanceFlags

От также имеет единственное свойство value__, которое по сути определяет значение этого параметра

$inheritanceFlags = [System.Security.AccessControl.InheritanceFlags]’ContainerInherit,ObjectInherit’

либо

$inheritanceFlags = New-Object System.Security.AccessControl.InheritanceFlags
$inheritanceFlags.value__ = битовая маска


Значение параметра Битовая маска
None 0
ContainerInherit 1
ObjectInherit 2

PropagationFlags – это объект класса System.Security.AccessControl.PropagationFlags

Имеет единственное свойство value__, определяющее значение параметра

Можетзадаваться:

$propagationFlags = [System.Security.AccessControl.PropagationFlags]”NoPropagateInherit,InheritOnly”

либо

$propagationFlags = New-Object System.Security.AccessControl.PropagationFlags
$propagationFlags.value__ = битовая маска


Значение параметра Битовая маска
None 0
NoPropagateInherit 1
InheritOnly 2

AccessControlType – объект класса System.Security.AccessControl.AccessControlType

Имеет единственное свойство value__, определяющее значение параметра

Можетзадаваться:

$accessControlType = [System.Security.AccessControl.AccessControlType]’Allow’

либо

$accessControlType = New-Object System.Security.AccessControl.AccessControlType
$accessControlType.value__ = числовое значение


Значение параметра Числовое значение
Allow 0
Deny 1

При определении правила все значения, за исключением SID, могут указываться непосредственно в полях параметров в текстовом виде. Тем не менее, это не относится к указанию пользователя или группы в форме NTAccount. При создании правила, правильность заполнения параметра IdentityReferenceне проверяется, лишь в дальнейшем, при выполнении метода AddAccessRuleдля объекта FileSystemAccessRuleили других методов для работы с правилами может проявиться ошибка, указывающая, что метод не может произвести трансляцию указанной учетной записи в SID.

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(‘domain\user’,’FullControl’,
’ContainerInherit,ObjectInherit’,’None’,’Allow’)
$acl.AddAccessRule($rule)

$acl.AccessRuleFactory – метод, используемый для создания правила. Может использоваться вместо процедуры, описанной выше.

$acl.AccessRuleFactory(identityReference, accessMask, isInherited, inheritanceFlags, propagationFlags,
accessControlType)

09

Практически все используемые параметры уже были описаны, за исключением accessMask

Параметр AccessMask – это значение битовой маски прав доступа, т.е. свойство value__ объекта System.Security.AccessControl.FileSystemRights, значения которого, а также соответствующие ему права доступа приведены выше.

Значение битовой маски существующего правила (в данном случае – первого в списке) можно посмотреть так:

$acl.access[0].FileSystemRights.value__

Также, при указании IdentityReference в данном методе не допускается ввод учетной записи непосредственно в параметрах в форме “domain\user”. В качестве параметра нужно указать переменную, содержащую объект класса “System.Security.Principal.NTAccount” либо “System.Security.Principal.SecurityIdentifier”, как это было указано выше.

$rule = $acl.AccessRuleFactory(‘domain\user’,197055,$false,’ContainerInherit,ObjectInherit’,’None’,’Allow’)
$acl.AddAccessRule($rule)

$acl.SetAccessRule – замещает запись в списке контроля доступа.

$acl.SetAccessRule(rule)

10

Также как и метод AddAccessRule, данный метод принимает в качестве входного параметра объект класса  ‘System.Security.AccessControl.FileSystemAccessRule’

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(identityReference, fileSystemRights,
inheritanceFlags, propagationFlags, accessControlType)
$acl.SetAccessRule($rule)

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

Т.е., предположим, что для пользователя ‘domain\user’ к некоторой папке были применены разрешения доступа типа “Read”, и мы создаем объект класса  ‘System.Security.AccessControl.FileSystemAccessRule’, в котором указываем права доступа “Write”

$rule = New-Object  System.Security.AccessControl.FileSystemAccessRule(‘domain\user’,’Write’,
’ContainerInherit,ObjectInherit’,’None’,’Allow’)

Используя метод $acl.AddAccessRule($rule), в результате мы получим права доступа “Read,Write”.

Используя же метод $aclSetAccessRule($rule), мы получим права доступа только “Write” т.к. предыдущая запись будет заменена на указанную в переменной $rule.

$acl.ResetAccessRule – удаляет все существующие записи контроля доступа для определенного участника безопасности и создает указанное в качестве параметра правило.

$acl.ResetAccessRule(rule)

11

Данный метод также принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’

Этот метод отличается от метода $acl.SetAccessRule тем, что в случае использования метода ResetAccessRule, удаляются все записи контроля доступа для определенного участника безопасности, будь то записи ‘Allow’ или ‘Deny’. Что касается метода SetAccessRule, то он заменяет только тот тип правил (‘Allow’ или ‘Deny’), к которому относится правило, указанное в качестве параметра

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(identityReference, fileSystemRights,
inheritanceFlags, propagationFlags, accessControlType)
$acl.ResetAccessRule($rule)

$acl.RemoveAccessRule – удаляет определенные разрешения из правила для указанного участника безопасности.

$acl.RemoveAccessRule(rule)

12

Данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’

При использовании этого метода, мы можем убрать определенные разрешения из правила. Например, в списке контроля доступа определено правило, с типом ‘Allow’ и разрешениями ‘Read,Write’. Мы можем удалить разрешение Write, создав объект FileSystemAccessRule с типом ‘Allow’ и разрешением ‘Write’ и указав его в качестве параметра метода RemoveAccessRule

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identityReference, ‘Write’,
$inheritanceFlags,$propagationFlags,’Allow’)
$acl.RemoveAccessRule($rule)

В результате, действующим останется только разрешение ‘Read’.

$acl.RemoveAccessRuleAll – удаляет запись определенного типа для указанного участника безопасности.

$acl.RemoveAccessRuleAll(rule)

13

Данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’

Используя данный метод можно удалить запись определенного типа (‘Allow’ или ‘Deny’) для указанного участника безопасности. В качестве параметра нужно указать объект, представляющий собой правило контроля доступа. Но в отличие от предыдущего метода, достаточно указать нужного участника безопасности и тип правила (‘Allow’ или ‘Deny’). Разрешения же на доступ не обязательно должны соответствовать разрешениям удаляемого правила.

Например, в списке контроля доступа присутствует правило типа ‘Allow’, содержащее разрешения ‘Read,Write’. Мы можем создать объект FileSystemAccessRule с типом ‘Allow’ и разрешением ‘Read’ и указать его в качестве параметра метода RemoveAccessRuleAll.

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identityReference,‘Read’,
$inheritanceFlags,$propagationFlags,’Allow’)
$acl.RemoveAccessRuleAll($rule)

Результатом будет полное удаление записи типа ‘Allow’ для данного участника безопасности.

$acl.RemoveRuleSpecific – данный метод удаляет правило, только в том случае, если параметры правила контроля доступа, указанного в качестве параметра метода, полностью соответствуют параметрам действующего правила.

$acl.RemoveAccessRuleSpecific(rule)

14

Данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’

То есть, чтобы удалить правило типа ‘Allow’, содержащее разрешения ‘Read,Write’, параметры наследования ‘ContainerInherit,ObjectInherit’ и параметры распространения ‘None’, в качестве параметра мы должны указать объект правила контроля доступа с такими же параметрами. Если Разрешения будут отличаться, метод не окажет воздействия на действующее правило.

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identityReference,‘Read’,
$inheritanceFlags,$propagationFlags,’Allow’)
$acl.RemoveRuleSpecific($rule)

$acl.ModifyAccessRule – используется для изменения записи контроля доступа.

$acl.ModifyAccessRule(modification, rule,[ref]$mod)

15

Параметр modification представляет из себя объект класса ‘System.Security.AccessControl.AccessControlModification’ и содержит единственное свойство value__, которое и определяет значение объекта.

Может задаваться:

$modification = [System.Security.AccessControl.AccessControlModification]‘Add’

или

$modification = New-ObjectSystem.Security.AccessControl.AccessControlModification
$modification.value__ =  числовое значение


Значение параметра Числовое значение
Add 0
Set 1
Reset 2
Remove 3
RemoveAll 4
RemoveSpecific 5

Параметр rule – объект класса ‘System.Security.AccessControl.FileSystemAccessRule’

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(identityReference,fileSystemRights,
inheritanceFlags,propagationFlags,accessControlType)

Параметр mod – переменная типа Boolean. При успешном выполнении метода, ей присваивается значение $true. В данном методе должна указываться должна указываться с префиксом [ref].

$mod = $false
$acl.ModifyAccessRule($modification,$rule,[ref]$mod)

$acl.PurgeAccessRules – удаляет запись контроля доступа для определенного участника безопасности

$acl.PurgeAccessRule(identityReference)

16

Данный метод принимает в качестве входного параметра объект ‘System.Security.Principal.IdentityReference’, который может представлять из себя объект класса NTAccount, либо SecurityIdentifier.

$identityReference = New-Object System.Security.Principal.NTAccount(‘domain\user’)
$identityReference = New-Object System.Security.Principal.SecurityIdentifier(‘SID’)

либо

$identityReference = [System.Security.Principal.NTAccount]‘domain\user’
$identityReference = [System.Security.Principal.SecurityIdentifier]‘SID’

Отличие этого метода от предыдущих в том, что в качестве входного параметра он принимает объект участника безопасности и удаляет все правила (как ‘Allow’ так и ‘Deny’) для этой учетной записи.

$acl.PurgeAccessRules($identityReference)

$user.Translate(class)

Также хочется рассказать об одной полезной возможности, которой обладают классы System.Security.Principal.NTAccount и System.Security.Principal.SecurityIdentifier.

Каждый из этих классов обладает методом Translate, при помощи которого можно перевести объект безопасности из одного вида в другой.

Воспользуемся этим методом, чтобы трансформировать объект класса NTAccountв объект класса SecurityIdentifier.

$user = New-Object System.Security.Principal.NTAccount(“domain\user”)
$user_sid = $user.Translate(“System.Security.Principal.SecurityIdentifier”)

17

Таким же образом можно трансформировать объекты класса SecurityIdentifier в объекты класса NTAccount.

Подведем итоги.

Благодаря использованию классов .NET, мы расширяем функционал PowerShell и получаем возможность автоматизировать редактирование списков контроля доступа к объектов файловой системы при помощи сценариев.


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Ноябрь 5, 2011 в 08:14

Опубликовано в PowerShell

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

Subscribe to comments with RSS.

  1. Интересная информация. Меня интересует как воспользоваться способом «И, хотя мы можем сохранить определенный набор прав доступа в файле csv или xml и позже применить его к нужным нам объектам»
    Ведь объект $ac с компа на комп иначе не передашь ?

    Андрей

    Сентябрь 8, 2015 at 15:57

    • Можно экспортировать, например, только содержимое свойства Access объекта, возвращаемого командлетом Get-Acl.

      $acl1 = Get-Acl -Path .\folder
      $acl1.Access | Export-Clixml -Path C:\acl.xml
      

      После можно применить те же настройки к другой папке на этом или любом другом компьютере.

      $xml = Import-Clixml -Path C:\acl.xml
      $acl2 = Get-Acl -Path .\folder2
      $acl2.Access | % {$acl2.RemoveAccessRuleAll($_)}
      $xml | % {
      $rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule([System.Security.Principal.NTAccount]$_.IdentityReference.ToString(),$_.FileSystemRights,$_.InheritanceFlags,$_.PropagationFlags,$_.AccessControlType)
      $acl2.AddAccessRule($rule)
      }
      Set-Acl -Path .\folder2 -AclObject $acl2
      

      На что тут стоит обратить внимание, так это на то, что при создании объекта правила, в нашем случае того, который будет сохранен в переменной $rule, значение свойства IdentityReference нужно явно определять как объект типа [System.Security.Principal.NTAccount] и в качестве аргумента конструктора этого объекта указывать строковое обозначение группы/пользователя — для чего используется метод ToString().

      Сергей Васин

      Сентябрь 10, 2015 at 13:20

      • Спасибо за скорую помощь. Я новичок, но очарован этой магией как в молодости LISPом. Уверен, что получится.

        Андрей

        Сентябрь 10, 2015 at 15:21

  2. Все изумительно работает. Но не разгадал вот, что. В сессии у меня не получатся подключить сетевой диск, на котором я буду держать шаблон acl.xml и с него считывать объект $xml. В локальной сессии получается

    new-psdrive test filesystem \\in4411824\F$

    а вот на удаленном компе

    [in4412005]: PS C:\> new-psdrive test filesystem \\in4411824\F$
    New-PSDrive : Корневой диск «\\in4411824\F$» не существует или не является папкой.
    + CategoryInfo : ReadError: (test:PSDriveInfo) [New-PSDrive], IOException
    + FullyQualifiedErrorId : DriveRootError,Microsoft.PowerShell.Commands.NewPSDriveCommand

    PS
    кодировка в Вашем письме такая, что подбор ее в Outlook не помог прочитать письмо. Читал ответ в https://sergeyvasin.wordpress.com/2011/11/05/powershell-acls/#comment-424

    Андрей

    Сентябрь 11, 2015 at 14:25

    • привет, дошло ли мое предыдущее сообщение?

      Андрей

      Сентябрь 19, 2015 at 20:20

    • Привет.
      Приведенный текст ошибки может говорить о чем-либо другом, но о чем следует помнить, так это о том, что при подключении к удаленным компьютерам учетные данные не передаются. Следствием этого является то, попытка подключения к какому-либо третьему компьютеру изнутри удаленной сессии успехом не увенчается, так как аутентифицироваться перед этим третьим компьютером будет просто нечем.
      Можно настроить подключение так, что ваши учетные данные все же будут передаваться на удаленный компьютер при подключении, однако это считается определенным риском. Поэтому это и отключено по-умолчанию. Если же все-таки данная функциональность требуется, вы можете это настроить.
      Как именно это сделать можно прочитать в этой статье:
      https://sergeyvasin.wordpress.com/2015/05/13/credential-delegation/

      Прошу прощения за долгий ответ :)

      Сергей Васин

      Сентябрь 24, 2015 at 13:01

      • Благодарствую за внимание ко мне. Признаться не ожидал ответа и мое заявление «Все изумительно работает» на волне эйфории первопроходца в моем случае не соответствует действительности. Продолжаю разбираться. Перечитал (Vadims Podāns http://www.sysadmins.lv/blog-ru/upravlenie-acl-v-powershell-chast-1.aspx) и понял что есть подводные камни. Описал ему мою ситуацию и жду, что он прокомментирует.
        Себе поставил такую задачу и на пол-пути к ее решению.
        1. устанавливаю с нуля W7 на комп. Ввожу его в домен. Устанавливаю на диск С и все вложенные папки владельцем встроенную группу Адинистраторы (я доменный в ней) и необходимые права средствами W7 (очень много кликаю, вот это меня и задело).
        2. делаю как Вы меня научили. $acl1 = Get-Acl -Path c:; $acl1 | Export-Clixml -Path C:\acl.xml
        3. $xml = Import-Clixml -Path C:\acl.xml получаю настройки на другом компе с новой ОС.
        4.Set-Acl -Path c: -AclObject $xml — работает так как и ожидаю Владелец — Адинистраторы, ACE — все что надо.
        5.PS C:\> Set-Acl -Path ‘.\Program Files’ -AclObject $xml
        Set-Acl : Попытка выполнить несанкционированную операцию.
        строка:1 знак:8
        + Set-Acl <<<<  -Path '.\Program Files' -AclObject $xml
            + CategoryInfo          : PermissionDenied: (C:\Program Files:String) [Set-Acl], UnauthorizedAccessException
            + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetAclCommand
        Вот тут и начинается. И теоретически понять не могу почему не срабатывает.
        Что делаю не так?
        Обязательно перечитаю WSMan. Но я работаю со своими компами, где я изначально в BUILTIN\Администраторы. Так почему же в сессии необходимо передавать учетные данные?
        Вот высказался.

        Андрей

        Сентябрь 25, 2015 at 14:01

  3. Добрый день! Спасибо за статью. Прошу прояснить момент с визуальным отображением назначенных разрешения. Возможно это где-то объясняется, но не нашел.

    Суть вопроса: если после назначения разрешений пользователю, на каталоге правой кнопкой вызвать «свойства -> безопасность», то я вижу, что пользователь добавился (отображен в списке «Группы или пользователи»), но разрешения пустые (галочки не выставлены), увидеть их можно только пройдя через «Дополнительно -> Изменить разрешения -> Изменить -> Объект», как получить выставленные галочки как при назначении разрешений руками — это, вообще возможно?
    Очень прошу помочь, т.к. пытаюсь автоматизировать перенос домена — объем информации огромный, за ранее благодарю.

    Юрий

    Июль 11, 2017 at 14:13

    • Добрый день. На вкладке Security окна свойств каталога или файла отображаются наборы прав, а не каждое право по отдельности.

      То есть, если мы присвоим какому-либо пользователю права: List Folder / Read Data, Read Attributes, Read Extended Attributes и Read Permissions, то вместе эти четыре права состаляют набор прав Read, и соответствующая галочка отображается в окне свойств.

      Если существующие права не соответствуют какому-либо набору, то для набора галочка не отображается и приходится смотреть, какие именно права присвоены определенному пользователю уже на странице Advanced Security Settings, нажимая кнопку Advanced (Дополнительно).

      Например, если мы присвоим пользователю права List Folder / Read Data, Read Attributes, то эти два права не составляют набор прав Read, так как он кроме них включает еще и Read Extended Attributes и Read Permissions, поэтому галочка для набора Read в окне Properties стоять не будет, а будет стоять галочка Special Permissions, что и указывает на то, что смотреть, какие именно отдельные права (а не наборы) были назначены, нужно на странице, открывающейся при нажатии на кнопку Advanced.

      Сергей Васин

      Июль 12, 2017 at 13:08

      • Добрый день! Спасибо за ответ.

        Юрий

        Июль 13, 2017 at 09:26

  4. Добрый день! Подскажите, пожалуйста, в чем может быть проблема.
    У меня есть smb-сервер на линукс машинке, и windows клиент, монтирующий расшаренную smb-сервером папку. Монтируется папка под рутом с полными правами.
    Попытки изменения/добавления прав доступа согласно Вашим указаниям проходят без ошибок, и если смотреть в $acl | format-list то изменения видны, однако если вызвать после Get-acl папки, то там все без изменений. Та же ситуация если смотреть через эксплорер.Эта ситуация повторяется для всех методов: и $acl.AddAccessRule, $acl.SetAccessRule, $acl.ModifyAccessRule.
    Возможно я что-то упустил и необходимы еще какие-то настройки?
    Заранее спасибо за помощь!

    Павел

    Август 22, 2017 at 18:38

    • Добрый день. Когда мы изменяем права доступа при помощи методов AddAccessRule, SetAccessRule и т.д., мы изменяем только объект, находящийся в переменной (например, $acl). Для того, чтобы этот измененный объект применить к какой либо папке или файлу, нам потребуется воспользоваться командлетом Set-Acl, например так:

      Set-Acl -Path C:\some_path -AclObject $acl
      

      Сергей Васин

      Август 24, 2017 at 11:54


Добавить комментарий

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

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s