Заменить разрешения на icalcs.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
?
3 ответа
cacls.exe
обеспечивает параметр /P
добиться замены ( см. здесь).
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)
}
Вам нужно добавить /inheritance:r
переключатель. Этот переключатель удаляет все унаследованные ACE. /grant:r
удаляет только существующие явные записи. Пытаться:
icacls.exe C:\Temp\Test /inheritance:r /grant:r DOMAIN\USER:(OI)(CI)(RX)
Найден обходной путь для вас:
/ Грант: г не работал для меня. Я должен использовать / сбросить, чтобы отменить разрешение только на наследование, а затем удалить унаследованные разрешения. Не забудьте изменить подкаталоги с флагом /t.
Это не моя собственная работа - я получил ее из последнего поста здесь:
Грант: не работает