Powershell изменить владельца файла
17.01.2020
itpro
PowerShell, Windows 10, Windows Server 2016
комментариев 14
Для управления доступом к файлам и папкам в Windows на каждый объект файловой системы NTFS (каталог или файл) назначается специальный ACL (Access Control List, список контроля доступа). В ACL объекта задаются доступные операции (разрешения), которые может совершать с этим объектом пользователь и/или группы . В большинстве случаев администраторы Window для управления NFTS разрешениями на файлы и папки используют графический интерфейс File Explorer (свойства папки/файла -> вкладка Security/Безопасность) или консольную утилиту icacls. В этой статье мы рассмотрим способы управления разрешениями на объекты файловой системы NTFS из PowerShell. Вы можете использовать эти команды в скриптах и для автоматизации управлением NTFS разрешениями на файловых серверах Windows.
Как создать новый раздел (ключ) или параметр реестра из командной строки PowerShell?
Чтобы создать новую ветку реестра используется команда New-Item. Создадим новую ветку с именем NewKey:
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
New-Item –Path $HKCU_Desktop –Name NewKey
Теперь создадим новый параметр (свойство) в новой ветке. Допустим, нам нужно создать новый строковый параметр типа REG_SZ с именем SuperParamString и значением file_name.txt :
New-ItemProperty -Path $HKCU_Desktop\NewKey -Name "SuperParamString" -Value ”file_name.txt” -PropertyType "String"
Вы можете использовать следующие типы данных для параметров в реестре:
- Binary (REG_BINARY)
- DWord (REG_DWORD)
- Qword (REG_QWORD)
- String (REG_SZ)
- ExpandString (REG_EXPAND_SZ)
- MultiString (REG_MULTI_SZ)
- Unknown
Убедитесь, что в реестре появился новый ключ и параметр.
Как из PowerShell проверить, что раздел реестра существует?
Если вам нужно проверить, существует ли раздел определенный реестра, используйте командлет Test-Path:
Test-Path 'HKCU:\Control Panel\Desktop\NewKey'
Следующий PowerShell скрипт позволит проверить, существует ли определенный параметр реестра, и если нет, создать его.
if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore)
< write-host 'Параметр реестра существует' >
else
С помощью командлета Copy-Item можно скопировать записи из одной ветки реестра в другую
$source='HKLM:\SOFTWARE\7-zip\'
$dest = 'HKLM:\SOFTWARE\backup'
Copy-Item -Path $source -Destination $dest -Recurse
Если нужно скопировать все, включая вложенные ветки, добавьте параметр –Recurse.
Проверка эффективных 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
Либо вы можете проверить эффективные разрешения на конкретный файл:
Get-Item -Path 'C:\distr\mstsc.exe.manifest' | Get-NTFSEffectiveAccess -Account 'WORKSTAT1\confroom' | Format-List
23.11.2021
itpro
PowerShell, Windows 10, Windows Server 2019
комментариев 6
Для работы с реестром Windows не обязательно использовать графический редактор regedit.exe , или утилиту командной строки reg.exe. PowerShell предоставляет администратору большое количество инструментов для взаимодействия с реестром. С помощью PowerShell вы можете создать, изменить или удалить ключ/параметр реестра, выполнить поиск значения и подключиться к реестру на удаленном компьютере.
Изменение, копирование и добавление разрешений
Еще одна причина использовать Powershell - это возможность копирования разрешений. Например так я поставлю разрешения для папки Folder2 такие же, как и Folder2:
Возможности добавить нового пользователя в список ACL или изменить его права одним командлетом у нас нет. В обоих случаях мы должны будет создавать копию объекта ACL, изменять ее отдельным классом, а затем применять используя метод. Сам объект, который мы получаем через Get-ACL, имеет множество методов:
Для создания нового объекта с правами используется класс "FileSystemAccessRule", который в команде будет выглядеть так:
Расшифровать значения можно следующим образом:
- IdentityReference\String - пользователь или группа формата "DOMAIN\Administrator";
- FileSystemRights - сами разрешения, например "Read";
- InheritanceFlags и PropagationFlags - определяют наследование. Например вы можете сделать так, что папки внутри указанной будут наследовать разрешения, а файлы нет. Ниже будут приведены несколько примеров. Более подробно об этом можно почитать на сайте Microsoft;
- AccessCpmtrolType - разрешить или запретить (Allow/Deny).
Создать сетевую папку Windows с помощью PowerShell
Чтобы вывести полный список сетевых папок, доступных на компьютере, выполните:
На этом компьютере открыт доступ к административным общим ресурсам и к каталогу Distr.
Чтобы создать новую общую сетевую папку, выполните команду:
New-SmbShare -Name Scripts -Path C:\PS -FullAccess winitpro\spb_admins, winitpro\msk-man01$ -ChangeAccess "winitpro\msk-man01_script_rw" -ReadAccess “$env:USERDOMAIN\domain users” –description “Collection of management PowerShell scripts”
В этом примере мы создали сетевую папку и предоставили права доступа доменным группам и одному компьютеру.
Дополнительно при создании папки можно использовать такие параметры:
- -CachingMode [None|Manual|Programs|Documents|BranchCache] – задать режим кэширования для офлайн доступа (автономных файлов);
- -EncryptData $True – включить шифрование SMB трафика;
- -FolderEnumerationMode [AccessBased | Unrestricted] – включить опцию перечисления на основании доступа (Access-based Enumeration). Позволяет скрыть в сетевой папке объекты, на которых у пользователя нет доступа;
- -CompressData $True – включить сжатие при передаче файлов по SMB;
- -ConcurrentUserLimit 50 – позволяет ограничить количество одновременных подключений к папке (по умолчанию 0, не ограничено);
- -Temporary – создать временную сетевую папку (пропадет после следующей перезагрузки Window).
Полный список настроек сетевой папки можно вывести:
Get-SmbShare -Name scripts| select *
Чтобы удалить сетевую папку:
Добавить в список доступа сетевой папки разрешения на запись для указанного пользователя:
Grant-SmbShareAccess -Name Scripts -AccountName "winitpro\kbuldogov" -AccessRight Change –force
Вывести текущий список доступа к общей папке:
Удалить группу из списка доступа:
Revoke-SmbShareAccess -Name Scripts -AccountName Everyone –Force
Принудительный запрет на доступ к общей папке (запрещающее разрешение имеет более высокий приоритет):
Block-SmbShareAccess -Name Scripts -AccountName winitpro\ExtUsers -Force
В большинстве случаев на уровне сетевой папки предоставляют доступ Everyone RW, а фактически права доступа к папке определяются на уровне NTFS.
Текущий NTFS ACL для сетевой папки можно получить с помощью команды:
Чтобы изменить права доступа, используйте Set-Acl (подробнее про управление NTFS разрешениями с помощью PowerShell).
Поиск всех папок с правами у определенной группы
Представим, что мы хотим проверить права данные определенной группе. Мы можем заходить в свойства каждой папки и смотреть вкладку "Безопасности", а можем сделать это через Powershell.
Обычно у нас есть какой-то каталог с общим доступом с папками внутри, на которые мы выдаем разрешения. В моем случае такой каталог "Moscow", а на папки внутри я уже даю права:
В следующем примере я узнаю на какие папки установлены разрешения для TestGroup:
Получить значение параметра реестра с помощью PowerShell
Обратите внимание, что параметры, хранящиеся в ветке реестра, считаются не вложенными объектами (не аналогом файлов на файловой системе), а параметрами (Property) конкретной ветки реестра. Т.е. у любой ветке реестра может быть любое количество параметров.
Выведите содержимое текущей ветки командой:
Как вы видите, команда вывела информацию о вложенных ветках реестра и их свойствах. Но не вывела информацию о параметр SearchOrderConfig, который является свойством текущей ветки.
Чтобы получить список параметров (свойств) ветки реестра, выполните:
Get-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Как вы видите, ключ реестра DriverSearching имеет только один параметр – SearchOrderConfig со значением 1.
Чтобы получить значение параметра ключа реестре, используется командлет Get-ItemProperty.
$DriverUpdate = Get-ItemProperty –Path “HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching”
$DriverUpdate.SearchOrderConfig
Мы получили, что значение параметра SearchOrderConfig равно 1.
Управление правами на ветки реестра из PowerShell
С помощью командлета Get-Acl вы можете получить текущие права на ветку реестра (командлет Get-ACL позволяет также управлять NTFS разрешениями на файлы и папки).
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
$rights.Access.IdentityReference
В следующем примере мы изменим ACL на данную ветку реестра, предоставив право записи для группы Users.
Получите текущие разрешения:
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
Укажите, кому нужно дать доступ:
Выберите уровень доступа:
$regRights = [System.Security.AccessControl.RegistryRights]::WriteKey
Задайте настройки наследования:
$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None
Тип доступа (Allow/Deny):
$acType = [System.Security.AccessControl.AccessControlType]::Allow
Создайте правило:
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType)
Добавим новое правило к текущему списку:
Применить новые права к ветке реестра:
$rights | Set-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
Проверьте, что новые в списке доступа к ветке реестра появилась новая группа пользователей.
Подключение сетевых дисков с помощью командлетов SmbMapping
Командлеты форматы SbmMapping используются для управления сетевыми дисками.
Чтобы подключить удаленную сетевую папку в сетевой диск U:, выполните команду:
New-SmbMapping -LocalPath U: -RemotePath \\msk-man01\scripts -UserName kbuldogov -Password mypass –Persistent $true -SaveCredential
- Без параметра Persistent сетевой диск будет доступен только до перезагрузки компьютера;
- Параметр SaveCredential позволяет сохранить учетные данные пользователя для подключения в диспетчер учетных данных Windows Credential Manager
Вывести список подключенных сетевых папок:
Для удаления сетевого диска:
Remove-SmbMapping U: -force
Предыдущая статья Следующая статья
Вам понадобится новое приложение, чтобы открыть эту ссылку Windows Defender
Включаем поддержку SR-IOV для виртуальных машин Hyper-V
Низкая скорость сети на хосте Hyper-V с Windows Server 2019
Установка и настройка фермы Remote Desktop Services (RDS) в Windows Server
Как-то давно Александр Станкевич просил у меня вариант скрипта, который бы менял владельца файла или папки из PowerShell. В своё время я занимался этим вопросом и результат моих исследований:
Я для решения данной задачи решил использовать класс Win32_LogicalFileSecuritySetting (хотя, можно и Win32_Directory использовать но после мелкой доработки. Но об этом я выскажусь в конце статьи).
Итак, класс Win32_LogicalFileSecuritySetting имеет те же методы, что и остальные классы, работающие со списками ACL - GetSecurityDescriptor и SetSecurityDescriptor. Я уже неоднократно поднимал вопрос работы с SecurityDescriptor в PowerShell, поэтому приступим сразу к решению задачи.
Как видно из картинки, нас будет интересовать объект Owner и ControlFlags. Объект DACL нас не будет интересовать совсем, поэтому работать с Win32_Ace нам не придётся, а только с Trustee:
Далее следует стандартная процедура преобразования имени пользователя в SID и получение байтового массива из SID'а:
Теперь $SIDArray и имя пользователя запишем в Trustee и поместим этот объект в свойство Owner дескриптора безопасности:
Его можно записывать как десятичное число (32768), так и в HEX нотации. Я использую HEX. Вот и всё, дескриптор безопасности у нас готов. Теперь самое время получить ACL в формате SecurityDescriptor из имеющейся папки:
В Options помимо включения привилегий можно указывать имперсонализацию пользователя (Impersonate) и другие параметры. Чтобы посмотреть доступные свойства достаточно набрать в консоли:
Когда привилегии включены, можно уже записывать дескриптор в папку при помощи метода SetSecurityDescriptor:
Если имя папки указано верно, то в выводе ReturnValue должен вернуть значение 0, что означает, что владелец сменён! :rock: и мы небольшим (но для PowerShell'а это уже много, учитывая что многие вещи в нём делаются в одну строчку ;-) ) увеличением объёма кода можем полноценно изменять владельца файла или папки без установки дополнительных расширений, как PSCX или отдельных консольных утилит, как SubInAcl или SetAcl.
Теперь это всё окультурим в готовый скрипт:
Примечание: При указании пути, который содержит пробелы, путь нужно заключать в кавычки!
и немного о стандартности использования методов SetSecurityDescriptor для различных объектов. Мне не понятно, почему в различных классах WMI используются различные именования свойств дескриптора безопасности, когда в этом явных причин нету? Например:
-
для дескриптора использует свойство Access метода SetShareInfo использует свойство Descriptor метода SetSecurityDescriptor использует SecurityDescriptor метода SetSecurityDescriptor (и для SetSecurityDescrptorEx) использует Descriptor метода SetSecurityDescriptor
Вот 4 WMI класса управления ACL списками различных объектов, с которыми я недавно работал и имеем 3 различных именования свойства дескриптора безопасности и Win32_Share использует даже другое название метода (SetShareInfo), хотя этот метод использует тот же Win32_SecurityDescriptor. Но это уже оффтопик и личные размышления. Вот :)
Categories: PowerShell | ACL | WMI
Posted at: 17.11.2008 02:19 (GMT+3) by Vadims Podāns | Permalink | Comments (0)
Основной способ ограничения доступа к файлам и папкам дает файловая система NTFS с ее таблицами ACL. Это может быть право только на чтение файла (открытие и просмотр), на чтение и запись (открытие, просмотр, изменение и сохранение) и многие другие. Такие права мы чаще устанавливаем через GUI назначая права не конечному пользователю, а группе в которой он состоит. Все действия по созданию и изменению мы так же можем сделать через Powershell.
Навигация по посту
На мой взгляд использование консоли Powershell лишнее при выдаче таких прав. Риск совершить ошибку в консоли намного выше, чем при работе в GUI, да и время для написания команды уйдет больше. Есть специфичные задачи, например в виде аудита или перенос прав где Powershell очень поможет.
Изменить значение параметра реестра из PowerShell
Чтобы изменить значение параметра реестра, воспользуйтесь командлетом Set-ItemProperty:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig -Value 0
Проверьте, что значение параметра изменилось:
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig
Удаленный доступ к реестру с помощью PowerShell
PowerShell позволяет получить доступ к реестру удаленного компьютера. К удаленном компьютеру можно подключится через WinRM (Invoke-Command или Enter-PSSession). Чтобы получить значение параметра реестра на удаленном компьютере, выполните:
Invoke-Command –ComputerName srv-fs1 –ScriptBlock
Или вы можете использовать подключение к удаленному реестру (служба RemoteRegistry должна быть включена):
$Server = "srv-fs1"
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
$RegKey= $Reg.OpenSubKey("System\Setup")
$RegValue = $RegKey.GetValue("WorkingDirectory")
Совет. Если нужно создать/изменить определённый параметр реестра на нескоьких компьютерах домена AD, проще воспользоваться возможностями GPO.
Итак, мы рассмотрели типовые примеры использования PowerShell для работы с системным реестром Windows. Как вы видите, ничего сложного. Возможности редактирования реестра Windows из PowerShell очень удобно использовать различных скриптах автоматизации.
Предыдущая статья Следующая статья
Просмотр и анализ логов RDP подключений в Windows
Поиск и удаление писем в ящиках Exchange Server (Microsoft 365) с помощью PowerShell
Аудит надежности паролей пользователей в Active Directory
Модуль PSWindowsUpdate: управление обновлениями Windows из PowerShell
У меня вопрос таков:
Вношу изменения в «Default Domain Controllers Policy»
Set-GPRegistryValue -Name "Default Domain Controllers Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\KDC\Parameters" -ValueName "EnableCbacAndArmor" -Type DWord -Value 1
Set-GPRegistryValue -Name "Default Domain Controllers Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\KDC\Parameters" -ValueName "CbacAndArmorLeve" -Type DWord -Value 1
Создал один объект групповой политики «DAC Policy» через PS
New-GPO -Name "DAC policy" | New-GPLink -Target "dc=test,dc=com" -LinkEnabled Yes | Set-GPPermission -TargetType User -TargetName "Admin" -PermissionLevel GpoEditDeleteModifySecurity
Set-GPRegistryValue -Name "DAC Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\KDC\Parameters" -ValueName "CbacAndArmorLeve" -Type DWord -Value 1
Следующим шагом хочу изменить параметр «DAC Policy», который отвечает за присоединение к этой политике доступных централизованных правил доступа, но в реестре не могу найти ветку
Не совсем верный текст: «Для удаления всех элементов в ветке, но не самого раздела, команда будет такой: Remove-Item –Path $HKCU_Desktop\NewKey\* –Recurse»
Эта команда удаляет не все элементы, а только подразделы в текущем разделе. Чтобы удалить параметры (записи) внутри раздела нужна ещё команда: «Remove-ItemProperty -Path $HKCU_Desktop\NewKey -Name *»
Как изменить свойства ветки: ‘HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search’
Имя — SearchboxTaskbarMode
Тип — REG_DWORD
Значение — 2
Команда для консоли PoSh:
проверьть если ли параметр, если нет — создать, если есть — изменить:
$regkey='HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Search'
$regparam='SearchboxTaskbarMode'
if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore) else
Здравствуйте.
Мне нужно на разных машинах обнулить некоторый ключ. Предположим HKLM:\bla\bla
ключ на одной машине 123 на другой 132 на третьей 1456 и т.д. Но все начинаются на 1.
Создал такую конструкцию.
Set-ItemProperty HKLM:\bla\bla -name 1* -Value $null
Создает ключ «1*» В ветке.
Думал что можно через конвеер.
Get-ItemProperty HKLM:\bla\bla -Name 1* | Set-ItemProperty -Value $null
Пишет «Set-ItemProperty: The input object cannot be bound because it did not contain the information required to bind all mandatory parameters: Name» Что я делаю не так?
Я б сделал так:
$Path = 'HKLM:\Software\7-zip\'
(Get-Item -Path $Path).GetValueNames() |
Where-Object |
ForEach-Object Set-ItemProperty -Path $Path -Name $_ -Value $null
>
14.03.2022
itpro
PowerShell, Windows 10, Windows Server 2019
Один комментарий
Встроенный PowerShell модуль SMBShare позволяет создавать, тонко настраивать и управлять общими сетевыми папками в Windows. В этой статье рассмотрим особенности управления сетевыми SMB папками Windows с помощью PowerShell. Вы можете использовать эти примеры для простого и быстрого управления настройками ваших файловых SMB серверов и сетевых папкок в различных сценариях автоматизации.
В модуле SMBShare доступно 42 команлета PowerShell для управления сетевыми папками. Их полный список можно вывести так:
Get-Command -Module SMBShare
Вывести текущую конфигурацию SMB сервера Windows:
Чтобы изменить эти параметры используйте командлет Set-SmbServerConfiguration:
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
Вывести список версий протокола SMB, использующихся активными клиентами для подключения к общим папкам на этом файловом сервере:
Чтобы ограничить пропускную способность для файлового SMB трафика, можно настроить политику QoS для SMB сервера. Например, следующая команда ограничит максимальную используемую ширину канала для SMB трафика до 10 Мб:
Set-SmbBandwidthLimit -Category Default -BytesPerSecond 10MB
Включение или отключение наследования папок и файлов
Для управления наследованием используется метод "SetAccessRuleProtection", который устанавливает следующее:
- Нужно ли блокирование от родительской папки.
- Нужна ли перезапись прав.
Значения указываются в $True или $False. Например так я включу наследование и заменю существующие разрешения родительскими:
Удаление прав у пользователя или группы
Для удаления всех разрешений есть метод "RemoveAccessRuleAll". Работает он так же:
Для удаления конкретного права, например только возможность чтения, есть метод "RemoveAccessRule". С этим методом у меня были проблемы после которых действующие разрешения менялись на Special и изменить эту ситуацию у меня не получилось. Если вам нужно все же убрать одно разрешение - я бы советовал удалять все разрешения у пользователя, а затем добавлять их заново. У пользователя было право на Чтение и Запись, но мне нужно было оставить только чтение:
Как переименовать ветку или параметр реестра?
Вы можете переименовать параметр реестра с помощью команды:
Rename-ItemProperty –path 'HKCU:\Control Panel\Desktop\NewKey' –name "SuperParamString" –newname “OldParamString”
Аналогично можно переименовать ветку реестра:
Rename-Item -path 'HKCU:\Control Panel\Desktop\NewKey' OldKey
Удаление раздела или параметра реестра
Для удаления параметра в ветке реестра используется команда Remove-ItemProperty. Удалим созданный ранее параметр SuperParamString:
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
Remove-ItemProperty –Path $HKCU_Desktop\NewKey –Name "SuperParamString"
Можно удалить ветку реестра целиком со всем содержимым:
Remove-Item –Path $HKCU_Desktop\NewKey –Recurse
Примечание. Ключ –Recurse говорит о том, что нужно рекурсивно без подтверждения удалить все вложенные подразделы.
Для удаления всех вложенных веток реестра (но не самого раздела):
Remove-Item –Path $HKCU_Desktop\NewKey\* –Recurse
Используем модуль 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
Выведем текущие NTFS разрешения на каталог:
Get-Item 'c:\distr' | Get-NTFSAccess
Как вы видите, текущие разрешения представлены в более удобной форме.
Чтобы предоставить конкретному пользователю и группе группе полные права на папку, выполните команду:
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
Основы разрешений
ACL (access controll list) - делится на два вида:
- SACL (System Access Control List) - используется для аудита;
- DACL (Discretionary Access Control List) - используется для выдачи и проверки разрешений пользователям и группам.
Оба этих типа разрешений хранятся в специальной таблице MFT (Master File Table).
Основное средство для редактирования этих разрешений в GUI можно увидеть зайдя в свойства файла или папки:
В области 4 выделены следующие разрешения:
- Read - открытие файла и папки;
- List folder contents - открытие папки;
- Write - создание файлов и папок и их изменение;
- Read & Execute - открытие и запуск исполняемых файлов;
- Modify - открытие, создание, изменение и удаление файлов и папок;
- Full Control - включает разрешения modify, а так же управление разрешениями файла или папки.
Чаще всего мы работаем с разрешениями выше, но есть еще один список с возможностью настройки прав более тонко:
Как можно догадаться - разрешения указанные в области 1 это просто набор нескольких правил из области 3. Их так же еще называют "Premission Sets" и "Special Premissions".
Групповые разрешения могут принимать флаги Allow и Deny, которые разрешат или запретят указанные действия. Указывать разрешения для пользователей через Deny считается плохой практикой и практически не используется.
Кроме этого существует наследование:
Наследование помогает установить разрешения для одной папки так, что оно будет применяться ко вложенным файлам и папкам. Если наследование отключить (2), то у нас будет возможность убрать все наследуемые разрешения или оставить их.
Функции по работе со строками в Powershell
Сбор всех прав и их экспорт в CSV
Учитывая примеры выше мы можем временно собирать отчеты по выданным правам. Пример того, как может выглядеть отчет:
Навигация в реестре с помощью PowerShell
Работа с реестром Windows в PowerShell похожа на работу с обычными файлами на локальном диске. Основное отличие в том, что в этой концепции ветки реестра являются аналогом файлов, а ключи (параметры) реестра – свойствами этих файлов.
Выведите список доступных дисков на компьютере:
Обратите внимание, что среди обычных дисков (с назначенными буквами дисков) есть особые устройства, доступные через провайдера Registry – HKCU (HKEY_CURRENT_USER) и HKLM (HKEY_LOCAL_MACHINE). Вы можете перемещаться по дереву реестра так же как вы перемещаетесь по дискам. Для обращения к определенному кусту реестра используется адресация HKLM:\ и HKCU:\.
cd HKLM:\
Dir -ErrorAction SilentlyContinue
Т.е. вы можете обращаться к веткам реестра и им значениям (параметрам) с помощью тех же командлетов PowerShell, которые вы используете для управления файлами.
Для обращения к веткам (разделам реестра) используются командлеты с -Item:
-
Get-Item – получить информацию о ветке реестра
Ключи (параметры) реестра нужно рассматривать, как свойства ветки реестра (аналогично свойствам файла). Для работы с параметрами реестра используются командлеты, заканчивающиеся на -ItemProperty:
- Get-ItemProperty – получить значение параметра реестра
- Set-ItemProperty – изменить название или значение параметра реестра
- New-ItemProperty – создать параметр реестра
- Rename-ItemProperty – переименовать параметр реестра
- Remove-ItemProperty — удалить параметр
Чтобы перейти к определенной ветке реестра (например, к ветке в которой хранятся настройки автоматического обновления драйверов) можно использовать одну из двух команд:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Изменение и добавление прав у пользователя и групп
Допустим у нас есть пользователь "Test User (001)" с возможностью чтения папки "Folder1" и мы хотим добавить еще права на запись. Это будет выглядеть так:
Наследование типа 'ContainerInherit, ObjectInherit' говорит о том, что оно касается этой папки и всех вложенных папок и файлов.
Таким же образом работает добавление новой группы или пользователя в список ACL:
Права, которые мы можем дать имеют сокращенное название и они отображены далее:
У вас может быть много ошибок связанных с созданием класса с новыми разрешениями. Я бы советовал выводить существующие права и сравнивал бы их с новыми - это позволит снизить вероятность ошибок.
При этом вы можете применить набор разрешений, например в виде Write, но результат будет отображаться в виде "Special Premission":
Если бы я указал наследование в виде 'ContainerInherit, ObjectInherit', то права бы применились как нужно:
Поэтому я рекомендую смотреть существующие разрешения на примере того, как я сделал это выше.
Получение текущих разрешений в Powershell
На примере ниже я верну разрешения для папки "C:\TestFolder\"
В области 1 выделен владелец папки, а под областью 2 отображаются все группы и пользователи с правами.
Мы можем проверять права не только локальной, но и сетевой папки. На примере ниже возвращена та же папка:
Управление открытыми файлами в сетевой папке
Командлеты модуля SMBShare можно использовать для просмотра списка файлов, открытых клиентами в сетевой папке на файловом сервере.
Вывести список открытых файлов с именами пользователей, именами компьютеров (IP адресами), и путями к файлам:
Вывести список файлов, открытых определённым пользователем:
Get-SMBOpenFile –ClientUserName "corp\kbuldogov" |select ClientComputerName,Path
Закрыть файл, открытый и заблокированный пользователем:
$sessn = New-CIMSession –Computername msk-fs01
Get-SMBOpenFile -CIMSession $sessn | where | Close-SMBOpenFile -CIMSession $sessn
Поиск в реестре с помощью PowerShell
PowerShell позволяет выполнять поиск по реестру. Следующий скрипт выполняет поиск по ветке HKCU:\Control Panel\Desktop параметров, в имени которых содержится ключ dpi.
$Path = (Get-ItemProperty ‘HKCU:\Control Panel\Desktop’)
$Path.PSObject.Properties | ForEach-Object If($_.Name -like '*win*')Write-Host $_.Name ' = ' $_.Value
>
>
Для поиска ветки реестра с определенным именем:
Get-ChildItem -path hkcu:\ -recurse -ErrorAction SilentlyContinue | Where-Object
Смена владельца
Смена владельца файла или папки делается через метод SetOwner. Этот метод, в качестве идентификатора, принимает SID пользователя и что бы его узнать нужно использовать класс "System.Security.Principal.Ntaccount". На практике это выглядит так:
Как отсортировать в Powershell объекты через Sort-Object
Встроенные командлеты для управления ACL в NTFS: Get-Acl и Set-Acl
В PowerShell v5 (Windows 10 / Windows Server 2016) для управления ACL имеется два отдельных встроенных командлета (входят в модуль Microsoft.PowerShell.Security):
- Get-Acl — позволяет получить текущие ACL для конкретного объекта на файловой системе NTFS;
- Set-Acl – используется для добавления/изменения текущих ACL объекта.
Мы не будем подробно останавливаться на этих встроенных командлетах, т.к. их функционал в большинстве случае недостаточен для управления NTFS разрешениями в реальных задачах. Рассмотрим лишь несколько типовых примеров их использования.
Выведем текущего владельца папки (файла) и список назначенных NTFS разрешений:
get-acl C:\Drivers\ |fl
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 разрешений в более понятном формате:
С помощью следящей команды можно скопировать 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.
Читайте также: