【问题标题】:Replace permissions with icacls.exe用 icacls.exe 替换权限
【发布时间】:2017-09-02 16:41:17
【问题描述】:

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

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替换权限?

【问题讨论】:

    标签: powershell permissions acl icacls


    【解决方案1】:

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 2016-10-06
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多