用icalcs.exe替换权限

时间:2017-09-02 16:41:17

标签: powershell permissions acl icacls

我们有很多具有以下权限的文件夹:

PS C:\> icacls.exe C:\Temp\Test
C:\Temp\Test    BUILTIN\Administrators:(OI)(CI)(F)
                NT AUTHORITY\SYSTEM:(OI)(CI)(F)
                DOMAIN\USER:(OI)(IO)(RX)
                DOMAIN\USER:(CI)(RX) 

我们希望将DOMAIN\USER的两个权限替换为(OI)(CI)(RX)的权限  为了实现这一目标,我们使用了icacls.exe /grant:r。不幸的是:r参数不起作用。

PS C:\> icacls.exe --% C:\Temp\Test /grant:r DOMAIN\USER:(OI)(CI)(RX)
PS C:\> icacls.exe C:\Temp\Test
C:\Temp\Test    BUILTIN\Administrators:(OI)(CI)(F)
                NT AUTHORITY\SYSTEM:(OI)(CI)(F)
                DOMAIN\USER:(OI)(IO)(RX)
                DOMAIN\USER:(CI)(RX)
                DOMAIN\USER:(OI)(CI)(F)

如您所见,该权限已添加但未被替换。  有没有办法用icacls.exe替换权限?

3 个答案:

答案 0 :(得分:0)

您需要添加/grant:r开关。此开关删除所有继承的ACE。 icacls.exe C:\Temp\Test /inheritance:r /grant:r DOMAIN\USER:(OI)(CI)(RX) 仅删除现有的显式条目。尝试:

public function store(Request $request)
{
    Model::create($request->all());
    return redirect(url('/'));
}

答案 1 :(得分:0)

为您找到解决方法:

  

/ grant:r没有为我工作。我必须使用/ reset来恢复   仅限inherintance的权限,然后删除继承的权限。   不要忘记用/ t标志更改子目录。

这不是我自己的工作 - 我从上一篇文章中得到了它:

grant:r not working

答案 2 :(得分:0)

cacls.exe提供参数/P以实现替换(see here)。

cacls.exe C:\Temp\Test /E /P DOMAIN\USER:F

这个可以工作,但后来我努力了解特殊权限(DOMAIN\USER2:(OI)(CI)(IO)(M)

所以我编写了一些PowerShell代码来实现与icacls.exe相同的功能 在授予新的显式权限之前,将使用/remove:g删除旧的权限。

$FolderPath = 'C:\Temp\Test'
$NewPermission = @('DOMAIN\USER1:(OI)(CI)(F)', 'DOMAIN\USER2:(OI)(CI)(RX,W)', 'DOMAIN\USER2:(OI)(CI)(IO)(M)')

$IcaclsOutput = icacls.exe "$FolderPath"
$InheritedPermission = @()
$InheritedPermission = foreach ($Line in $IcaclsOutput)
{
    #Check if last line
    if ($Line -eq '')
    {
        break
    }

    #Get inherited permissions
    $Permission = ''
    $Permission = $Line.Substring($FolderPath.Length + 1, $Line.Length - ($FolderPath.Length + 1))
    if ($Permission -notlike '*(I)*')
    {
        $Permission.Split(':')[0]
    }
}

$InheritedPermission = $InheritedPermission | Sort-Object -Unique

#Set new permission
if ($InheritedPermission.Count -ne 0)
{
    #Remove granted explicit permissions and add new on 
    icacls.exe "$FolderPath " /remove:g ($InheritedPermission) /grant:r ($NewPermission)
}
else
{
    #Add new one
    icacls.exe "$FolderPath " /grant:r ($NewPermission)
}