вторник, 22 ноября 2016 г.

Назначение прав на папки с помощью PowerShell

Сегодня поступила задача изменить права в библиотеке. Т.е. нужно назначить права на каждую папку в корне библиотеке и права на две вложенные папки.

структура такова:

Библиотека документов
                |
                |
                |- Вендор Avast (персональные права на папку)
                |                              |
                |                              |- Папка 1
                |                              |-Маркетинговые материалы (персональные права)
                |                              |-Лицензионные формы (персональные права)
                |                              |-Папка N
                |
                |- Вендор Eset (персональные права на папку)
                |                              |
                |                              |- Папка 1
                |                              |-Маркетинговые материалы (персональные права)
                |                              |-Лицензионные формы (персональные права)

                |                              |-Папка N





$web = Get-SPWeb http://sp-test/sites/site
$lib = $web.lists["Библиотека для портала"]
$rootFolder = $lib.RootFolder.SubFolders


function AddPermissionToFolderGroup ($folder, $GroupName, $PermissionLevel)
{    
    Write-Host $folder "/" $GroupName  "/" $PermissionLevel

    $group = $web.SiteGroups[$GroupName]
    $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($group)
    $roleDefinition = $web.RoleDefinitions[$PermissionLevel];
    $roleAssignment.RoleDefinitionBindings.Add($roleDefinition);
    $folder.Item.BreakRoleInheritance($true);
    $folder.Item.RoleAssignments.Add($roleAssignment);
      
}
function RemooveAllFolderPermission ($folder){ 
    $folder.Item.ResetRoleInheritance()
    $folder.Item.BreakRoleInheritance($false);
}

foreach($folder in $rootFolder){
    $groupName =  "Вендор "+$folder.Name

    # Определяем набор прав для папок
    $permissionsRootFolder = @(
  ($groupName,"Совместная работа"),
  ("Все пользователи","Read"),
  ("Технические специалисты","Совместная работа")
  );
    $permissionsSubFolderLicenseForm = @(
   ("Редакторы лицензионных форм","Совместная работа"),
   ("Все пользователи","Read")
   );
 $permissionsSubFolderMarketing = @(
   ($groupName,"Совместная работа"),
   ("Продуктовые маркетологи","Совместная работа"),
   ("Все пользователи","Read")
   );
    # удаляем права с папки верхнего уровня
    RemooveAllFolderPermission $folder
    # назначаем права на папку верзнего уровня
    foreach($perm in $permissionsRootFolder){
       Write-Host $perm[0] / $perm[1]
       AddPermissionToFolderGroup -folder $folder`
         -GroupName  $perm[0]`
         -PermissionLevel  $perm[1]  
    };
    foreach($subFolder in $folder.SubFolders){        
        if($subFolder.Name -eq "Маркетинговые материалы"){
            
            RemooveAllFolderPermission $subFolder

            foreach($perm in $permissionsSubFolderMarketing){
               Write-Host $perm[0] / $perm[1]
               AddPermissionToFolderGroup -folder $subFolder`
        -GroupName  $perm[0]`
        -PermissionLevel  $perm[1]  
            };    
        }; 
        if($subFolder.Name -eq "Лицензионные формы"){

            RemooveAllFolderPermission $subFolder

            foreach($perm in $permissionsSubFolderLicenseForm ){
               Write-Host $perm[0] / $perm[1]
               AddPermissionToFolderGroup -folder $subFolder `
          -GroupName  $perm[0]`
          -PermissionLevel  $perm[1]  
            };    
        };     
        
    }                           

}
$web.Dispose()

Вот такой код у меня получился. Помогает быстро назначить права на большое количество папок и можно переопределить права и запустить вновь.
Результат прав для папки верхнего уровня