将权限/共享子文件夹设置为使用powershell

时间:2017-07-21 06:09:52

标签: powershell sharepoint sharepoint-2013

我正在使用SP 2013。

我必须为文档库中的子文件夹设置特定权限

我有以下脚本:

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)

我收到错误:$ folder.RoleAssignments.Add($ roleAssignment)

  

您无法在空值表达式上调用方法。在行:29 char:13 + $ folder.RoleAssignments.Add($ roleAssignment)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull

所有文件夹都会发生这种情况。

我尝试使用相同的代码来设置整个库的权限,并且它有效。但它不适用于文件夹。

请帮助我。谢谢

1 个答案:

答案 0 :(得分:0)

在分配新权限之前,您需要在子文件夹上中断继承。

$folder.BreakRoleInheritance("true")

请参阅下面的脚本,它做了类似的事情。来自this link

我已经更正了格式并在此处粘贴了整个内容以便更好地阅读:

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()