将权限替换为 icacls.exe
Replace permissions with icacls.exe
我们有很多具有以下权限的文件夹:
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
替换权限?
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)
}
我们有很多具有以下权限的文件夹:
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
替换权限?
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)
}