2017-07-21 1 views
2

J'utilise SP 2013.Set sous-dossier d'autorisation/action au groupe dans une bibliothèque powershell

Je dois définir des autorisations spécifiques aux sous-dossiers dans une bibliothèque de documents

Je le script suivant:

Add-PSSnapin Microsoft.SharePoint.PowerShell 

Function GetFiles($folder) 
{ 
    # Use recursion to loop through all subfolders. 
    foreach ($subFolder in $folder.SubFolders) 
    { 

     GetFiles($subFolder) 
    } 

    if($folder.Name -eq "C" -Or $folder.Name -eq "B3-B6" -Or $folder.Name -eq "C8" -Or $folder.Name -eq "D" -Or $folder.Name -eq "A5" -Or $folder.Name -eq "A1-A4") 
     { 
      Write-Host "+"$folder.Name 

      if($folder.Name -eq "C8") 
      { 
       $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($web.SiteGroups["HumanResources-HR - C8"]) 
      } 
      else 
      { 
       $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($web.SiteGroups["HumanResources-HR - Other"]) 
      } 
      #Get Permission Level, such as "Read", "Contribute", etc 

      $roleAssignment.RoleDefinitionBindings.Add($web.RoleDefinitions["Contribute"]) 
      $roleAssignment.RoleDefinitionBindings.Add($web.RoleDefinitions["Read"]) 
      #Grant Access to specified Group 
      $folder.RoleAssignments.Add($roleAssignment) 
      #To Remove Access: Call $item.RoleAssignments.Remove($group) . No Need for objects: roleAssignment, roleDefinition 
      $folder.Update(); 
      Write-Host "Successfully added $($PermissionLevel) to $GroupName group in $($folder.Name)" -foregroundcolor Green 
     } 
} 

    $web = Get-SPWeb -Identity "xxx.xxx.xxx/sites/xxx" 


$rfolder=$web.Lists["DOKUMENTNA KNJIŽNICA"].RootFolder 
GetFiles($rfolder) 

et je suis une erreur dans la ligne: $ folder.RoleAssignments.Add (roleAssignment $)

Vous ne pouvez pas appeler une méthode sur une expression à valeur nulle. À la ligne: 29 char: 13 + $ folder.RoleAssignments.Add ($ roleAssignment) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

et cela se produit avec tous les dossiers.

J'ai essayé le même code pour définir des autorisations sur l'ensemble de la bibliothèque et cela a fonctionné. Mais cela ne fonctionne pas avec les dossiers.

Merci de m'aider. Merci

+0

Bonjour. Pour les dossiers que vous pouvez utiliser: Set-Acl: [lien] (https://blogs.msdn.microsoft.com/johan/2008/10/01/powershell-editing-permissions-on-a-file-or-folder /) – Vitaly

+0

L'erreur indique qu'elle n'a aucune valeur. Pourriez-vous vérifier ce qui arrive dans '$ roleAssignment' et' $ folder.RoleAssignments' –

Répondre

0

Vous devez interrompre l'héritage sur les sous-dossiers avant d'attribuer de nouvelles autorisations.

$folder.BreakRoleInheritance("true")

Voir le script ci-dessous qui fait une chose semblable. De this link

J'ai corrigé la mise en forme et ont collé la chose entière ici pour une meilleure lecture:

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 
$site = new-object Microsoft.SharePoint.SPSite("http://myserver/") 
$web = $site.OpenWeb() 
function GrantGroupPermission($groupName) 
{ 
    [Microsoft.SharePoint.SPGroupCollection]$spgroups = $web.SiteGroups 
    [Microsoft.SharePoint.SPGroup]$spgroup = $groups[$groupName] 
    $sproleass=new-object Microsoft.SharePoint.SPRoleAssignment([Microsoft.SharePoint.SPPrincipal]$spgroup) 
    $folder.BreakRoleInheritance("true") 
    $sproleass.RoleDefinitionBindings.Add($web.RoleDefinitions["Contribute"]) 
    $folder.RoleAssignments.Add($sproleass); 
    Write-Host "Permission provided for group ", $groupName 
} 

function GrantUserpermission($userName) 
{ 
    [Microsoft.SharePoint.SPUserCollection]$spusers=[Microsoft.SharePoint.SPUserCollection]$web.SiteUsers 
    [Microsoft.SharePoint.SPUser]$spuser=$spusers[$userName] 
    $sproleass=new-object Microsoft.SharePoint.SPRoleAssignment([Microsoft.SharePoint.SPPrincipal]$spuser) 
    $folder.BreakRoleInheritance("true") 
    $sproleass.RoleDefinitionBindings.Add($web.RoleDefinitions["Contribute"]) 
    $folder.RoleAssignments.Add($sproleass); 
    Write-Host "Permission provided for user ", $userName 
} 

$doclib=[Microsoft.SharePoint.SPDocumentLibrary]$web.Lists["Shared Documents"] 

$foldercoll=$doclib.Folders; 
foreach($folder in $foldercoll) 
{ 
Write-Host $folder.Name 
if($folder.Name.Equals("f2")) 
{ 
    GrantUserPermission("raj") 
} 

} 
Write-Host "Completed...." 
$web.Close() 
$site.Dispose()