Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сброс прав на папку через Set-Acl (http://forum.oszone.net/showthread.php?t=348043)

Dragokas 19-02-2021 18:40 2950685

Сброс прав на папку через Set-Acl
 
Здравствуйте!

Имеется вот такая папка:
Код:

PS C:\Windows\system32> Get-Acl -Path c:\temp | Format-List

Path  : Microsoft.PowerShell.Core\FileSystem::C:\temp
Owner  : BUILTIN\Администраторы
Group  : BUILTIN\Администраторы
Access :
Audit  :
Sddl  : O:BAG:BAD:PAI

Владелец - локальная группа администраторов.
Привилегии не установлены.

Хочу сбросить права с использованием строки SDDL.
Powershell запущен с повышенными правами. Юзер находится в группе "Администраторы".
Код:

$SD = Get-Acl -Path c:\temp
$SD.SetSecurityDescriptorSddlForm('O:BAG:BAD:PAI(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;BU)')
PS C:\Windows\system32> Set-Acl -Path c:\temp -AclObject $SD
Set-Acl : Попытка выполнить несанкционированную операцию.
At line:1 char:1
+ Set-Acl -Path c:\temp -AclObject $SD
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\temp:String) [Set-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetAclCommand

В чём проблема?

SDDL корректен.
Тоже самое происходит, если сделать без SetSecurityDescriptorSddlForm, при попытке перенести права, например, с C:\Windows.

2) Попытно вопрос, как записать однострочником, что-то вроде:
Код:

(Get-Acl -Path c:\path).SetSecurityDescriptorSddlForm('...') | Set-Acl -Path c:\path
Некорректно отрабатывает. Ошибок нет, но новые права не применены.

Спасибо.

YuS_2 19-02-2021 21:29 2950698

Цитата:

Цитата Dragokas
В чём проблема? »

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

Цитата:

Цитата Dragokas
как записать однострочником, что-то вроде:
Код:

(Get-Acl -Path c:\path).SetSecurityDescriptorSddlForm('...') | Set-Acl -Path c:\path
»

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

($acl=Get-Acl -Path c:\path).SetSecurityDescriptorSddlForm('...');$acl | Set-Acl -Path c:\path

Fors1k 19-02-2021 21:38 2950699

На всякий, версия 5.1?

У меня этот код отрабатывает, не могу пока воспроизвести ошибку:
Код:

cls
$path = 'c:\test'
$newParam = 'O:BAG:BAD:PAI(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;BU)'
$SD = Get-Acl -Path $path
$SD|FL
"Sddl До:`n`t"+$SD.Sddl
$SD.SetSecurityDescriptorSddlForm($newParam)
Set-Acl -Path $path -AclObject $SD
$SDnew = Get-Acl -Path $path
"Sddl После:`n`t"+$SDnew.Sddl

Код:

Path  : Microsoft.PowerShell.Core\FileSystem::C:\test
Owner  : BUILTIN\Администраторы
Group  : BUILTIN\Администраторы
Access :
Audit  :
Sddl  : O:BAG:BAD:PAI



Sddl До:
        O:BAG:BAD:PAI
Sddl После:
        O:BAG:BAD:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;BU)


YuS_2 19-02-2021 21:42 2950700

Цитата:

Цитата Fors1k
У меня этот код отрабатывает, не могу пока воспроизвести ошибку »

аналогично... всё же там, что-то с правами на изменение владельца, скорее всего...

Dragokas 20-02-2021 18:24 2950769

Fors1k, а у меня ваш код, увы нет :(
Лично я условия воссоздавал просто зайдя в свойства папки - отключаю наследование прав от родителя и удаляю все явно назначенные права, если есть.

Windows 7 x64.

Код:

PS C:\Windows\system32> (Get-Command Set-Acl).Version

Major  Minor  Build  Revision
-----  -----  -----  --------
3      0      0      0


PS C:\Windows\system32> (Get-Host).Version

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14409  1018

YuS_2, спасибо, да я в курсе про требования. Но если моя учётка входит в состав группы "Администраторы", то и условия соблюдены. По остальному:
Код:

PS C:\Windows\system32> whoami /priv

Сведения о привилегиях
----------------------

Имя привилегии                  Описание                                    Область, край
=============================== =========================================== =============
SeAssignPrimaryTokenPrivilege  Замена маркера уровня процесса              Отключен
SeIncreaseQuotaPrivilege        Настройка квот памяти для процесса          Отключен
SeSecurityPrivilege            Управление аудитом и журналом безопасности  Отключен
SeTakeOwnershipPrivilege        Смена владельцев файлов и других объектов  Отключен
SeLoadDriverPrivilege          Загрузка и выгрузка драйверов устройств    Отключен
SeSystemProfilePrivilege        Профилирование производительности системы  Отключен
SeSystemtimePrivilege          Изменение системного времени                Отключен
SeProfileSingleProcessPrivilege Профилирование одного процесса              Отключен
SeIncreaseBasePriorityPrivilege Увеличение приоритета выполнения            Отключен
SeCreatePagefilePrivilege      Создание файла подкачки                    Отключен
SeBackupPrivilege              Архивация файлов и каталогов                Отключен
SeRestorePrivilege              Восстановление файлов и каталогов          Отключен
SeShutdownPrivilege            Завершение работы системы                  Отключен
SeDebugPrivilege                Отладка программ                            включен
SeSystemEnvironmentPrivilege    Изменение параметров среды изготовителя    Отключен
SeChangeNotifyPrivilege        Обход перекрестной проверки                включен
SeRemoteShutdownPrivilege      Принудительное удаленное завершение работы  Отключен
SeUndockPrivilege              Отключение компьютера от стыковочного узла  Отключен
SeManageVolumePrivilege        Выполнение задач по обслуживанию томов      Отключен
SeImpersonatePrivilege          Имитация клиента после проверки подлинности включен
SeCreateGlobalPrivilege        Создание глобальных объектов                включен
SeIncreaseWorkingSetPrivilege  Увеличение рабочего набора процесса        Отключен
SeTimeZonePrivilege            Изменение часового пояса                    Отключен
SeCreateSymbolicLinkPrivilege  Создание символических ссылок              Отключен

Код:

PS C:\Windows\system32> net user $env:UserName
...
Членство в локальных группах          *Debugger Users
                                      *HomeUsers
                                      *individual
                                      *Администраторы
                                      *Пользователи журналов
                                      *Пользователи удаленно
Членство в глобальных группах          *None

При этом, утилита cacls.exe прекрасно справляется:

Код:

PS C:\Windows\system32> cacls "c:\temp" /S:"O:BAG:BAD:PAI(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;BU)"
Продолжить? (Y/N)y
обработан каталог: c:\temp
PS C:\Windows\system32> Get-Acl c:\temp | Format-List


Path  : Microsoft.PowerShell.Core\FileSystem::C:\temp
Owner  : BUILTIN\Администраторы
Group  : BUILTIN\Администраторы
Access : NT AUTHORITY\система Allow  FullControl
        BUILTIN\Администраторы Allow  FullControl
        BUILTIN\Пользователи Allow  FullControl
Audit  :
Sddl  : O:BAG:BAD:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;BU)

Попробовал на другой (чистой) Win 7. Ошибка такая же.

На Windows 10 ошибка не воспроизводится.

Получается, что это бага ... (?)

Fors1k 20-02-2021 19:50 2950781

Цитата:

Цитата Dragokas
PermissionDenied
UnauthorizedAccessException»

Команда говорит, что недостаточно прав. Пока что больше копать некуда.
Проверьте так:
Код:

cls
$isAdmin = [Security.Principal.WindowsPrincipal]::new([Security.Principal.WindowsIdentity]::
          GetCurrent())
.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if($isAdmin){
   
$path = 'c:\test'
    $newParam = 'O:BAG:BAD:PAI(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;BU)'
    #
    $SD = Get-Acl -Path $path
    Write-Host "Sddl До:`n" -fo Yellow
    $SD|FL
    $SD.SetSecurityDescriptorSddlForm($newParam)
   
Set-Acl -Path $path -AclObject $SD
    $SDnew = Get-Acl -Path $path
    Write-Host "Sddl После:`n" -fo green
    $SDnew|FL
}
else{
   
Write-Host "Запустите PowerShell от имени Администратора" -fo Red
}

Код:

Sddl До:

Path  : Microsoft.PowerShell.Core\FileSystem::C:\test
Owner  : BUILTIN\Администраторы
Group  : BUILTIN\Администраторы
Access :
Audit  :
Sddl  : O:BAG:BAD:PAI


Sddl После:

Path  : Microsoft.PowerShell.Core\FileSystem::C:\test
Owner  : BUILTIN\Администраторы
Group  : BUILTIN\Администраторы
Access : NT AUTHORITY\СИСТЕМА Allow  FullControl
        BUILTIN\Администраторы Allow  FullControl
        BUILTIN\Пользователи Allow  FullControl
Audit  :
Sddl  : O:BAG:BAD:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;BU)

Скрытый текст
Цитата:

Цитата Dragokas
Код:

PS C:\Windows\system32> ....
»

Рекомендую использовать powershell_ise.
Код всегда перед глазами ; F8 - запустить строку или выделенный фрагмент ; F5 - запустить весь код - "Чистый кайф" (с) Баста.

YuS_2 20-02-2021 19:58 2950783

Цитата:

Цитата Dragokas
Получается, что это бага ... (?) »

скорее всего, да, причем баг не PS и даже не .net, т.к. при установленном .NET 5.0 и PS 7.2, эта ошибка также воспроизводится на Win7 SP1

Цитата:

Цитата Fors1k
Проверьте так: »

ОС Win7, это не поможет...

Fors1k 20-02-2021 20:10 2950786

YuS_2, тогда здесь мои полномочия всё =)


Время: 02:55.

Время: 02:55.
© OSzone.net 2001-