none
icacls или powershell помощь в назанчении прав файлу Только чтение RRS feed

  • Вопрос

  • Добрый день,

    никак не могу разобраться: в общем ситуация такая есть файл его надо поместить в директорию c:\windows

    Но при копировании он унаследует права. Вопрос как можно этому файлу присвоить ntfs права Только чтение всем унаследованным группам и пользователям.

    Из того что успел протестировать это забрать все и владельцу дать только чтение.

    Не очень пойму можно ли как то перечислить группы и пользователей или нет, при тесте использовал вариант с icacls

    Но такой вариант не совсем подходит.


    Все что вы делаете, вы делаете на свой страх и риск. Делайте Backup правильно.

    1 ноября 2017 г. 15:14

Ответы

  • Поправил:

    $file = Copy-Item file.txt C:\Windows -Passthru
    $acl = $file.GetAccessControl()
    $newacl = New-Object System.Security.AccessControl.FileSecurity
    $newacl.SetAccessRuleProtection($True, $True)
    $newacl.SetOwner($acl.GetOwner([System.Security.Principal.SecurityIdentifier]))
    $acl.Access | Where {$_.AccessControlType -eq "Allow"} | Foreach {
    	$id =  $_.IdentityReference.Value
    	try{
    		$id = ([System.Security.Principal.NTAccount]$id).Translate([System.Security.Principal.SecurityIdentifier])
    	} catch{
    		$id = ([System.Security.Principal.NTAccount]$id.split("\")[1]).Translate([System.Security.Principal.SecurityIdentifier])
    	}
    	$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    		$id,
    		"Read",
    		$_.AccessControlType
    	)
    	$newacl.AddAccessRule($rule)
    }
    Set-Acl -Path $file -AclObject $newacl

    • Помечено в качестве ответа PuCtoy 2 ноября 2017 г. 11:12
    2 ноября 2017 г. 9:59
    Отвечающий

Все ответы

  • $file = Copy-Item file.txt C:\Windows -Passthru
    $acl = $file.GetAccessControl()
    #Отключаем наследование
    $acl.SetAccessRuleProtection($True, $True)
    Set-Acl -Path $file -AclObject $acl
    $acl = Get-Acl $file
    #Добавляем только чтение
    $acl.Access | Foreach {
    	$acl.RemoveAccessRule($_)
    	$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    		$_.IdentityReference,
    		"Read",
    		$_.AccessControlType
    	)
    	$acl.AddAccessRule($rule)
    }
    Set-Acl -Path $file -AclObject $acl



    • Изменено KazunEditor 1 ноября 2017 г. 17:11
    1 ноября 2017 г. 17:11
    Отвечающий
  • В предыдущем варианте в ACL возможны попытки записи дублирующихся ACE.

    Поэтому я бы для начала выбрал из ACL список уникальных участников безопасности (из числа разрешённых), очистил бы список доступа и добавил бы туда ACE для каждого уникалльного  участника с разрешением "Чтение".

    Примерно так:

    $file = Copy-Item file.txt C:\Windows -Passthru
    $acl = $file.GetAccessControl()
    #Извлекаем список имён участников безопастности без дублей
    $prc = $acl  | select -expand Access | where {$_.AccessControlType -eq "Allow"} | select IdentityReference -unique
    #Отключаем наследование
    $acl.SetAccessRuleProtection($True, $True)
    #Удаляем существующие ACE
    $acl.Access | Foreach {	$acl.RemoveAccessRule($_)}
    
    #Добавляем ACE только для чтения для списка уникальных имён участников безопасности
    $prc | foreach {$rule=New-Object System.Security.AccessControl.FileSystemAccessRule($_.IdentityReference,"Read","Allow");$acl.AddAccessRule($rule) }
    #Устанавливаем ACL для файла
    Set-Acl -Path $file -AclObject $acl



    Слава России!



    • Изменено M.V.V. _ 1 ноября 2017 г. 19:39
    1 ноября 2017 г. 19:37
  • может просто право записи у всех отнять? 
    1 ноября 2017 г. 19:41
  • В смысле - добавить ACE с явным запретом на запись для Everyone? Возможно, но тут всё зависит от деталей того, что хочет автор вопроса.

    Слава России!

    1 ноября 2017 г. 19:59
  • В предыдущем варианте в ACL возможны попытки записи дублирующихся ACE.


    Слава России!



    Почему бы не проверить для начала? И  следует уточнить, что проблема будет наблюдаться в случае Deny, которая явна запретит чтение.

    PS >  $acl.Access | FT FileSystemRights,IdentityReference
    
     FileSystemRights IdentityReference
     ---------------- -----------------
    Read, Synchronize NT AUTHORITY\Authenticated Users
    Read, Synchronize NT AUTHORITY\SYSTEM
    Read, Synchronize BUILTIN\Administrators
    Read, Synchronize BUILTIN\Users

    Добавим еще:

    PS > $acl.Access | Foreach {
    >> $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    >> $_.IdentityReference,
    >> "Read",
    >> $_.AccessControlType
    >> )
    >> $acl.AddAccessRule($rule)
    >> }
    PS > $acl.Access | FT FileSystemRights,IdentityReference
    
     FileSystemRights IdentityReference
     ---------------- -----------------
    Read, Synchronize NT AUTHORITY\Authenticated Users
    Read, Synchronize NT AUTHORITY\SYSTEM
    Read, Synchronize BUILTIN\Administrators
    Read, Synchronize BUILTIN\Users


    • Изменено KazunEditor 1 ноября 2017 г. 20:23
    1 ноября 2017 г. 20:18
    Отвечающий
  • Доброго дня,

    огромное спасибо за помощь с меня пиво=)

    во втором варианте получаем вот такое вот сообщение

    Исключение при вызове "RemoveAccessRule" с "1" аргументами: "Некоторые или ссылки на свойства нельзя преобразовать."
    строка:8 знак:25
    + $acl.Access | Foreach {    $acl.RemoveAccessRule($_)}
    +                            ~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException
     
    Исключение при вызове "RemoveAccessRule" с "1" аргументами: "Некоторые или ссылки на свойства нельзя преобразовать."
    строка:8 знак:25
    + $acl.Access | Foreach {    $acl.RemoveAccessRule($_)}
    +                            ~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException
     
    Исключение при вызове "AddAccessRule" с "1" аргументами: "Некоторые или ссылки на свойства нельзя преобразовать."
    строка:11 знак:122
    + ... Rule($_.IdentityReference,"Read","Allow");$acl.AddAccessRule($rule) }
    +                                               ~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException
     
    Исключение при вызове "AddAccessRule" с "1" аргументами: "Некоторые или ссылки на свойства нельзя преобразовать."
    строка:11 знак:122
    + ... Rule($_.IdentityReference,"Read","Allow");$acl.AddAccessRule($rule) }
    +                                               ~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException


    Все что вы делаете, вы делаете на свой страх и риск. Делайте Backup правильно.


    • Изменено PuCtoy 2 ноября 2017 г. 8:21
    2 ноября 2017 г. 8:10
  • И с правами получается вроде бы все нормально за исключением того что

    СИСТЕМА и Администраторы имеют полные права FullAccess

    В последнем посте я не очень разобрался как применить код ибо с Пошем дружу весьма относительно=)

    Уточняю по вопросу надо что бы все получили право только чтения.



    Все что вы делаете, вы делаете на свой страх и риск. Делайте Backup правильно.



    • Изменено PuCtoy 2 ноября 2017 г. 8:23
    2 ноября 2017 г. 8:19
  • Удалить из папки C:\Windows\file.txt и выполнить, код из моего 1 поста. И проверить результат.
    • Изменено KazunEditor 2 ноября 2017 г. 8:55
    2 ноября 2017 г. 8:55
    Отвечающий
  • Результат ровно такой же как я описал выше

    Все что вы делаете, вы делаете на свой страх и риск. Делайте Backup правильно.

    2 ноября 2017 г. 9:19
  • Поправил:

    $file = Copy-Item file.txt C:\Windows -Passthru
    $acl = $file.GetAccessControl()
    $newacl = New-Object System.Security.AccessControl.FileSecurity
    $newacl.SetAccessRuleProtection($True, $True)
    $newacl.SetOwner($acl.GetOwner([System.Security.Principal.SecurityIdentifier]))
    $acl.Access | Where {$_.AccessControlType -eq "Allow"} | Foreach {
    	$id =  $_.IdentityReference.Value
    	try{
    		$id = ([System.Security.Principal.NTAccount]$id).Translate([System.Security.Principal.SecurityIdentifier])
    	} catch{
    		$id = ([System.Security.Principal.NTAccount]$id.split("\")[1]).Translate([System.Security.Principal.SecurityIdentifier])
    	}
    	$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    		$id,
    		"Read",
    		$_.AccessControlType
    	)
    	$newacl.AddAccessRule($rule)
    }
    Set-Acl -Path $file -AclObject $newacl

    • Помечено в качестве ответа PuCtoy 2 ноября 2017 г. 11:12
    2 ноября 2017 г. 9:59
    Отвечающий
  • Куда пиво отправлять?

    Благодарен от Всей души!


    Все что вы делаете, вы делаете на свой страх и риск. Делайте Backup правильно.

    2 ноября 2017 г. 11:12