Известный своими скриптами блоггер Luc Dekens (LucD) опубликовал интересный сценарий PowerCLI для виртуальной инфраструктуры VMware vSphere, который позволяет вычистить права доступа на объекты, для которых уже существуют права на уровне родительских объектов.
Например, у вас есть такая картина:
Соответственно, нам нужно почистить пермиссии в папке Test1131 для пользователя Local\test, чтобы разрешения остались только на уровне родительского объекта Test1 (там, как мы видим, установлена опция применения разрешений вниз к дочерним объектам).
Собственно, сам скрипт:
<#
.SYNOPSIS
Find and remove redundant permissions on vSphere objects
.DESCRIPTION
The function will recursively scan the permissions on the
inventory objects passed via the Entity parameter.
Redundant permissions will be removed.
.NOTES
Author: Luc Dekens
.PARAMETER Entity
One or more vSphere inventory objects from where the scan
shall start
.EXAMPLE
PS> Optimize-Permission -Entity Folder1 -WhatIf
.EXAMPLE
PS> Optimize-Permission -Entity Folder?
.EXAMPLE
PS> Get-Folder -Name Folder* | Optimize-Permission
#>
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[parameter(ValueFromPipeline)]
[PSObject[]]$Entity
)
Begin{
function Optimize-iVIPermission{
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[parameter(ValueFromPipeline)]
[VMware.Vim.ManagedObjectReference]$Entity,
[VMware.Vim.Permission[]]$Permission = $null
)
Process{
$entityObj = Get-View -Id $Entity
$removePermission = @()
$newParentPermission = @()
if($Permission){
foreach($currentPermission in $entityObj.Permission){
foreach($parentPermission in $Permission){
if($parentPermission.Principal -eq $currentPermission.Principal -and
$parentPermission.RoleId -eq $currentPermission.RoleId){
$removePermission += $currentPermission
break
}
else{
$newParentPermission += $currentPermission
}
}
}
}
else{
$newParentPermission += $entityObj.Permission
}
if($removePermission){
if($pscmdlet.ShouldProcess("$($entityObj.Name)", "Cleaning up permissions")){
$removePermission | %{
$authMgr.RemoveEntityPermission($Entity,$_.Principal,$_.Group)
}
}
}
$Permission += $newParentPermission
if($entityObj.ChildEntity){
$entityObj.ChildEntity | Optimize-iVIPermission -Permission $Permission
}
}
}
}
Process{
foreach($entry in $Entity){
if($entry -is [System.String]){
$entry = Get-Inventory -Name $entry
}
Optimize-iVIPermission -Entity $entry.ExtensionData.MoRef
}
}
}
Скрипт работает так, что пробегается по дереву объектов, обнаруживает избыточные разрешения и удаляет их. У скрипта есть удобный параметр WhatIf, который выводит операции по очистке разрешений, которые как бы применяются к дочерним объектам, но на самом деле не применяет их:
Optimize-VIPermission -Entity Test1 -WhatIf
Результатом будет список объектов, где разрешения будут очищены, в данном случае, если посмотреть на пример выше, это будет папка Test1131:
Можно запустить скрипт и на 2 папки сразу:
Optimize-VIPermission -Entity Test1,Test2 -WhatIf
Результат будет таким (в папке Test22 также есть дублирующиеся разрешения):
Также можно использовать и конструкции с масками, например:
Теперь неплохо было бы, если бы кто-то написал GUI к этой штуке, а также добавил туда функции поиска и удаления произвольных разрешений в выбранных объектах.