【发布时间】:2014-04-30 17:11:21
【问题描述】:
我有一个 Sharepoint 库,我有一个 Powershell 脚本将文件放入其中进行处理。 Powershell 脚本到达 Active Directory,并返回组成员信息。然后,该脚本使用组所有者的名称在我的库中为组所有者(如果不存在)创建一个文件夹,并将特定组中包含的所有用户的 .CSV 文件放入该文件夹中。
这里的需要是仅向组的所有者授予“读取”权限,这将是我们正在使用的文件夹的名称。理想情况下,该文件夹将被隐藏,但是我知道在与 Sharepoint 合作。
例如:
John Doe,用户:jdoe 将能够访问 Z:/jdoe/IT.csv 但不能 Z:/someuser/HR.csv
我目前已将我的 Sharepoint 库映射到 Z:/,以便让我的 Powershell 生活更轻松。
我执行了get-command Module Microsoft.SharePoint.PowerShell | ft name 并浏览了Sharepoint 命令列表。
然后我偶然发现了Grant-SPObjectSecurity Cmdlet,我认为这是我想在 Powershell 端使用的,在创建文件夹时,仅将 Sharepoint 权限应用于为其创建文件夹的用户.
从开始到结束的过程是:Powershell 脚本“Get_Group_Members”执行,每行读取一个包含 Active Directory 组名称的文本文件。对于找到的每个组,该脚本会识别该组的所有者,创建一个以所有者 AD 名称命名的文件夹,并将一个 .CSV 文件放入列出该组所有成员的文件夹中。然后,我(无论如何现在)手动启动下一个脚本“Import_CSV”,它将所有信息拉入一个不相关进程的 Sharepoint 列表。
希望这有助于了解正在发生的事情。我是否正确地假设我应该在 Powershell 端处理这个问题,而不是在 Sharepoint 端?如果是这样,我是否与Grant -SPObjectSecurity 朝着正确的方向前进?
谢谢!
更新:
按照我在下面评论中提供的链接,这是我想出的:
function GrantUserpermission($strOwnerName)
{
[Microsoft.SharePoint.SPUserCollection]$spusers=[Microsoft.SharePoint.SPUserCollection]$web.SiteUsers
[Microsoft.SharePoint.SPUser]$spuser=$spusers[$strOwnerName]
"Strowner name: " + $strOwnerName
# Get the SPWeb object and save it to a variable
$web = Get-SPWeb -identity $WebURL
if ($strOwnerName -ne $null)
{
$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 ", $strOwnerName
}
else
{
Write-Host "User ""$userName"" was not found in this web!"
}
}
这里是与我的代码相关的错误:
完整代码可以在这里找到:http://pastebin.com/iBpj6V1U
更新 #2
#apply permissions to folder
"Strowner name: " + $strOwnerName
function GrantUserpermission($strOwnerName)
{
$web = Get-SPWeb -identity $WebURL
[Microsoft.SharePoint.SPUser]$spuser=$web.EnsureUser($strOwnerName)
"Strowner name in Function: " + $strOwnerName
更新代码 #2:http://pastebin.com/DzP1hVce
【问题讨论】:
-
提供的链接为如何授予文件夹权限提出了正确的解决方案。你试过吗?你有任何错误吗?
-
1) 您收到此错误是因为您的 $web 变量是在您尝试访问用户集合后声明的。将“$web = Get-SPWeb -identity $WebURL”放在函数的开头。 2)您需要为 BreakRoleInheritance 方法提供布尔值而不是字符串。将 "$folder.BreakRoleInheritance("true")" 替换为 $folder.BreakRoleInheritance($true) 3) 我建议使用 EnsureUser 方法按名称获取用户,而不是直接查找 SiteUsers 集合。[Microsoft.SharePoint.SPUser]$ spuser=$web.EnsureUser($strOwnerName)
-
您的 GrantUserpermission 函数和脚本范围有重叠 - $strOwnerName。删除 GrantUserpermission 函数的参数。授予用户权限()
-
我没有在您的代码中看到您初始化 $folder 变量。错误所说的 - $folder 变量未初始化。
-
执行
$Target = $Web.Folders | ?{$_.Name -eq $strOwnerName},然后将$Folder.BreakRole和$Folder.RoleAssign行更改为$Target.BreakRole和$Target.RoleAssign以修复对象类型引用错误。
标签: security powershell sharepoint csv sharepoint-2010