向SharePoint文件夹添加用户时遇“Collection was of a fixed size”错误求助
嘿,我来帮你搞定这个困扰你的错误!你遇到的Collection was of a fixed size问题,根源其实是代码里把列表项集合(SPListItemCollection)当成了单个文件夹对象来操作了,咱们一步步拆解问题,再给你修复后的代码。
为啥会报错?
看你这段代码:
$FPfolder = $FPlist.GetItems($query) foreach($role in $FPfolder.RoleAssignments) {
$FPlist.GetItems($query)返回的是所有匹配查询条件的列表项组成的集合,不是单个文件夹对象!直接对这个集合调用RoleAssignments.Add()肯定会炸——集合本身的权限集合是固定大小的,根本不支持添加操作。
另外还有个小问题:原代码里只创建了权限分配对象,但没给它绑定具体的权限级别(比如只读、编辑),就算没报错,添加的用户也没实际权限,这部分咱们一起补上。
修复后的完整代码
ForEach ($FPfolderId in $FPfolderSplit) { $query = New-Object Microsoft.SharePoint.SPQuery # 修正了ViewXml的写法(原代码里的@和转义符没必要) $query.ViewXml = "<View Scope='RecursiveAll'><Query><Where><Eq><FieldRef Name='Title' /><Value Type='Text'>$FPfolderId</Value></Eq></Where></Query></View>" $FPfolderItems = $FPlist.GetItems($query) # 先检查有没有找到匹配的文件夹,避免白忙活 if ($FPfolderItems.Count -eq 0) { Write-Warning "没找到对应文件夹: $FPfolderId" continue } # 遍历每个匹配到的文件夹项 foreach ($folderItem in $FPfolderItems) { $userHasPermission = $false # 检查当前文件夹是否已经有目标用户的权限 foreach($role in $folderItem.RoleAssignments) { if ($role.Member.Name.Equals($userToAction)) { $userHasPermission = $true break } } if ($userHasPermission) { # 断开权限继承,保留现有权限设置 $folderItem.BreakRoleInheritance($true) $account = $web.EnsureUser("User1") $assignment = New-Object Microsoft.SharePoint.SPRoleAssignment($account) # 给权限分配绑定具体的权限级别,这里用编辑权限做示例,按需替换 $roleDefinition = $web.RoleDefinitions.GetByType([Microsoft.SharePoint.SPRoleType]::Contributor) $assignment.RoleDefinitionBindings.Add($roleDefinition) # 给单个文件夹项添加权限 $folderItem.RoleAssignments.Add($assignment) $folderItem.Update() Write-Host "成功给文件夹 $($folderItem.Title) 添加User1的权限啦!" } } }
关键修复点说明
- 变量名优化:把
$FPfolder改成$FPfolderItems,一眼就能看出这是个集合,避免混淆。 - 遍历单个项:现在先遍历查询到的每个文件夹列表项,再对单个项操作权限,就不会触发固定集合的错误了。
- 补全权限级别:新增了绑定权限级别的代码,确保添加的用户拥有实际的访问权限。
- 空集合检查:加了判断如果没找到对应文件夹就跳过,避免无效操作。
内容的提问来源于stack exchange,提问作者gymcode
相关产品推荐
相关产品推荐

