2007年8月19日,星期日

在新网站上自动设置自双色球推荐一注权限

这是三篇文章中的第三篇也是最后一篇文章,我将在此演示如何在网站创建过程中执行自双色球推荐一注处理。看到 “文章系列-具有网站双色球推荐一注的自双色球推荐一注权限” 有关文章系列的全文。具体来说,我想展示如何使用代码在创建网站时对其进行修改,以完成网站双色球推荐一注/网站模板通常无法完成的工作。在我使用的示例中,我在创建的网站上设置自双色球推荐一注权限。例如,假设您的组织正在以协作的方式使用SharePoint并且用户自己创建网站,则这种情况可能会有用,但是某些网站需要受到保护,以便将访问权限限制为特定用户。最终用户通常可能不了解SharePoint安全模型的详细信息,因此,如果我们能自动为他们解决这个问题,那就太好了。

解决方案

在上一篇文章中,网站双色球推荐一注-网站创建过程中的自双色球推荐一注代码”,我展示了如何将功能接收器与网站双色球推荐一注结合使用,以完成创建网站时可能要做的几乎所有事情。基于这种方法,我的解决方案基于以下方面:



  • 自双色球推荐一注列表,用于存储网站集的根网站中的授权用户列表。此列表存储用户到他们在创建的站点中应具有的权限的映射。
  • 定制网站双色球推荐一注,通过复制现有双色球推荐一注(如SDK中所述)创建。
  • 没有双色球推荐一注任何Feature元素但附加到Feature接收器的Feature。双色球推荐一注一个属性以传递权限列表的名称。
  • 功能接收者代码,该代码使用对象模型来迭代权限列表并向列出的每个用户授予适当的权限。

因此,让我们分解解决方案的每个元素。请注意,所有代码等都可以下载,并在文章末尾链接到该代码。首先,我们创建一个看起来像这样的列表(单击放大):



查看列表的编辑视图(如下所示),我们看到两个关键列是:

  • “用户”-人员或组数据类型
  • “权限级别”-选择数据类型,允许值为“所有者”,“贡献者”和“查看者”




如果我们要创建受限制的站点,则可能需要保护列表的安全性,以使好奇的用户无法添加自己,然后访问将来创建的任何受限制的站点。


这就是清单。在我的示例中,站点双色球推荐一注没有什么特别的事情,它只是“ BLANKINTERNET”双色球推荐一注的一个副本,以使示例更简单。但是,创建,部署和更新自双色球推荐一注网站双色球推荐一注”提供了有关您可以使用网站双色球推荐一注进行的各种自双色球推荐一注设置的更多信息。

特征被双色球推荐一注为引用我们正在创建的Feature接收器类。这样可以确保在激活功能后我们的自双色球推荐一注代码将运行。

<特征  标题="网站配置" ID="7C020FFF-FF42-4fe2-8A9B-9BCA0D5F8001" 描述= ="1.0.0.0" 范围="网页"

          ="真正" DefaultResourceFile="核心"

          接收器组件="COB.Demos.SiteDefinition,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = cd9b418c14cff42e"

          接收器类="COB.Demos.ProjectXSiteDefinition.SiteProvisioning" xmlns="http://schemas.microsoft.com/sharepoint/">

  <物产>

    <!-- 也可以通过作为属性传入并稍微修改代码来通过GUID检索列表 -->

    <属性 ="PermissionsListName" ="Project X权限" />

  </物产>

</特征>


“ 接收器组件”和“ 接收器类”属性具有指向包含我们的自双色球推荐一注代码的功能接收器类的值。还要注意,我们传入的值可以通过使用Feature属性在代码中检索。这可以用作对类中的值进行硬编码的一种更灵活的替代方法-在这种情况下,我们使用它以“授权用户”列表的名称传递,这意味着该功能可以在不同的需求中重复使用(这将使用不同的需求列表)。对代码和属性的细微调整将允许您根据需要使用列表GUID,但是请注意,如果在另一个SharePoint环境中重新创建列表,则列表GUID将有所不同。

因此,一切都很好,但是什么可以确保激活功能?自从上一篇文章以来,您已经失去了话题吧?当使用onet.xml文件的WebFeatures部分中的以下行的双色球推荐一注创建站点时,将自动激活功能,该文件指定站点双色球推荐一注包括:


<特征 ID="7C020FFF-FF42-4fe2-8A9B-9BCA0D5F8001">


最后,转到我们在功能接收器类中编写的代码:

使用 系统;

使用 Microsoft.SharePoint;

 

命名空间 COB.Demos.ProjectXSiteDefinition

{

    网站配置 : SPFeatureReceiver

    {

        上市 覆写 虚空 特征Activated(SPFeatureReceiverProperties 属性)

        {

            网页 currentWeb = 空值;

            网站 currentSite = 空值;

            目的 oParent = properties.Feature.Parent;

 

            //通过名称检索权限列表。

            sPermsListName = properties.Definition.Properties [“ PermissionsListName”]。值;

 

            //仅在使用网站双色球推荐一注在预期网站集中创建网站时才执行处理。

            如果 (properties.Feature.Parent 网页)

            {

                currentWeb = (网页)properties.Feature.Parent;

               currentSite = currentWeb.Site;

 

                清单 烫发sList = currentSite.RootWeb.Lists [sPermsListName];

 

                //确保将网络设置为使用唯一权限,我们不会从父网站复制现有权限。

                如果 (!currentWeb.HasUniqueRoleAssignments)

                {

                   currentWeb.BreakRoleInheritance();

                }

 

                前言 (清单Item 烫发 烫发sList.Items)

                {

                    sPermLevel =()烫发[“权限级别”];

 

                    SPFieldUserValue userValue =(SPFieldUserValue)perm.Fields [“用户”] .GetFieldValue(perm [“用户”] .ToString());

                    SP用户 用户= userValue.User;

                   setPermission(currentWeb,user,sPermLevel);

                }

 

               currentWeb.Update();

            }

        }

 

        私人的 虚空 setPermission(网页 currentWeb, SP用户 用户, sPermLevel)

        {

            SP集团 PermissionsGroup = 空值;

 

            开关 (sPermLevel)

            {

                案件 “所有者”:

                   PermissionsGroup = currentWeb.AssociatedOwnerGroup;

                    打破;

                案件 “游客”:

                   PermissionsGroup = currentWeb.AssociatedVisitorGroup;

                    打破;

                案件 “会员”:

                   PermissionsGroup = currentWeb.AssociatedMemberGroup;

                    打破;

                默认:

                    NotImplementedException(。格式(“组'{0}'尚未实现。”,sPermLevel));

                    打破;

            }

 

           PermissionsGroup.AddUser(用户);

      }

 

        上市 覆写 虚空 特征Deactivating(SPFeatureReceiverProperties 属性)

        {

        }

 

        上市 覆写 虚空 已安装功能(SPFeatureReceiverProperties 属性)

        {

        }

 

        上市 覆写 虚空 特征Uninstalling(SPFeatureReceiverProperties 属性)

        {

        }

    }

}


逐步执行代码,我们首先找到“授权用户”列表,告诉SharePoint我们不想继承正在创建的网站的权限,然后遍历该列表 找到用户后,将其分配给网络的相应安全组。请注意,SPWeb对象具有允许您轻松引用“所有者”,“访客”组等的属性。这些属性将以“ [我的网站名称]所有者”的形式命名,因此避免了您必须进行任何讨厌的字符串连接这里。

关于此类与其他文件的位置如何匹配,我将其存储在同一VS项目中。在此示例中,我没有使用VSeWSS创建解决方案,但是正如我上次提到的那样,这可以使事情变得更加简单。我之所以不选择此处,是因为我想使用Feature属性传递列表名称,并且在当前版本中,VSeWSS没有灵活性来支持此功能。无论如何,在同一个VS项目中拥有该类意味着在编译项目时,将构建接收器程序集并将其输出到同一项目的bin目录中。然后,将传递给makecab.exe的.ddf文件将此dll和所有其他文件添加到为部署而构建的解决方案包(.wsp)中。您可以选择使用构建后类型的解决方案(MSBuild,构建后脚本等),通过直接XCOPY或使用STSADM命令将其自动部署到每次编译时的本地环境中。构建和部署SharePoint解决方案包的文章对此有更多信息。因此,我的总体项目结构如下所示:




因此,对于部署,这意味着一切都在一个包中- 在部署时,程序集会在功能激活过程运行之前命中GAC,这意味着功能接收器代码已到位并将成功执行。部署后,可以使用站点双色球推荐一注,并可以从中创建新站点。如果我们继续创建站点,那么如果我们查看不同的安全组,则会看到已根据存储在“授权用户”列表中的配置数据添加了适当的用户。

车主组:



访客组:


就是这样了!现在,我们有了解决方案,使我们能够通过网站双色球推荐一注“打包”自双色球推荐一注权限。显然,我们可以将权限映射存储在其他存储中,例如数据库表或XML文件,但是在所有条件都相同的情况下,我强烈建议使用SharePoint列表存储此类数据。为您提供了用户界面,可以应用安全性以确保标准用户不知道列表的存在。

我使用的所有文件都可以从以下位置下载 http://sharepointchris.googlepages.com/sitedefinitionwithcustompermissions.

在使用文件方面,您可以按照以下过程使用该技术:

  • 从我提供的列表模板创建授权用户列表-'PermissionsListTemplate.stp'
  • 将您的用户和权限映射添加到列表中
  • 将站点双色球推荐一注文件添加到VS项目中的适当位置,并根据需要修改onet.xml文件等。
  • 如果已添加文件,请修改.ddf文件以包括这些文件并重建解决方案包
  • 使用STSADM部署软件包(zip中包含.bat文件),然后根据双色球推荐一注创建站点!

希望这个系列已经有所用处。虽然这种方法在我推出用于从中创建自动受保护的站点的站点双色球推荐一注的场景中肯定是有用的,但总的来说,您可以使用该技术在站点创建过程中进行所需的任何自双色球推荐一注处理。如有任何疑问,请发表评论!

张贴者 Chris O'Brien 22:51  

标签: , ,

13条评论:

匿名 said...
该评论已被博客管理员删除。
2007年8月21日,11:30
匿名 said...

很好的文章!

The example code 是 not linked from http://sharepointchris.googlepages.com/sitedefinitionwithcustompermissions but can be downloaded directly from http://sharepointchris.googlepages.com/COB.Demos.SiteDefinitionWithCustomPe.zip

2007年8月21日在16:13
西奥说过...

克里斯

在谷歌搜索中,我碰到了该页面,它似乎很接近我需要做的事情。

不幸的是,在没有答案之前,我没有足够的时间(以及对MOSS或.Net的了解)来尝试一下……但是我怀疑这可能是可行的。

我需要知道是否可以在网站创建时添加(作为功能或软件包)自双色球推荐一注权限,这些权限已经映射到预双色球推荐一注的组(我想是已添加到“新网站”的组)...有意义吗?

简而言之,在部署站点时,必须准备好使用这些组和权限。客户只需要将用户添加到组中。

请让我知道是否可以这样做。

干杯
西奥

2007年11月20日在03:32
克里斯·奥'Brien说过...

嗨西奥

是的,绝对有可能做您想做的事。我建议一种好的方法是使用本文中的技术,但是修改代码以应用您的自双色球推荐一注权限。

无需过于详细地研究它,我认为您需要执行以下操作:

-找到要添加自双色球推荐一注权限的每个列表
-然后调用SPList.BreakRoleInheritence()
-使用SPList.RoleAssignments.Add()添加自双色球推荐一注组

沿着这些路线看一下。

HTH,

克里斯。

2007年11月22日13:37
拉梅什·克里希南说过...

很棒的文章。关于该功能的属性用法,我有一个问题。您是否需要添加任何可序列化的代码来访问动态值?

2008年2月13日,00:54
克里斯·奥'Brien说过...

你好

不确定您的意思是什么-上面的代码显示了从Feature属性中检索值,但是如果您要执行其他操作,请给我更多详细信息,我将尝试理解/帮助。

干杯,

克里斯。

2008年2月17日在21:55
未知说过...

实际上,这是一篇很棒的文章。我曾尝试在WSS 3.0中执行此操作一段时间,但在找到一半解决方案后,我遇到了这个博客。好东西!

我有个问题。我正在运行所有程序,但是在从UI单击“创建”以创建网站之后,我立即收到“未知错误”。由于某些原因,当我运行代码时,组“成员”和“所有者”尚不存在,permissionGroup最终为“ 空值”(尽管存在“ Visitors”)。这将导致“对象引用未设置为对象的实例”异常,从而导致前端出现“未知错误”。我是否缺少某些配置?

2008年2月19日17:59
克里斯·奥'Brien说过...

嗨,埃尔顿,

很抱歉延迟回复。这似乎很不寻常-您是否确定使用提供的属性访问“所有者”和“成员”组(如我的代码所示)?如果是这样,我不确定为什么这些将不可用-除了我在本文中讨论的内容以外,没有其他配置。

您在不同的环境中会得到相同的效果吗?

干杯,

克里斯。

2008年2月22日在07:37
匿名 said...

埃尔顿,

我对WSS3.0也有类似的乐趣。我一直在使用功能和从SPWebProvisioningProvider继承的类进行测试,以从头开始创建网站集。

在Sharepoint为新网站集创建任何组之前,都将同时执行SPWebProvisioningProvider提供方法和功能激活方法。

您可以将自己的自双色球推荐一注组添加到集合并将其设置为关联组,但是Sharepoint将继续创建其自己的[siteName]所有者,成员和访客组。

2008年2月26日10:38
未知说过...

克里斯,您好,我希望您不介意,但我找到了您的博客,我想“是!!!!因此我正在按照说明实施功能,但是在MOSS日志中出现以下错误(我的权限列表在父网站中)。我使用了permLevels Owner,Visitor和Member,如代码示例中所述。我对可能发生的事情感到困惑-似乎找不到列表名称(?)-日志条目:“ 2008年7月25日16:22:09.45 w3wp.exe(0x1460)0x1BE8 Windows 的SharePoint Services功能基础结构88jm高功能接收器程序集'ClientInfo,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = add2ef901e07e5b1',类'ClientInfo.SiteProvisioning',功能'7c020fff-ff42-4fe2-8a9b-9bca0d5f8001'的方法'FeatureActivated'引发了异常:系统.ArgumentException:值不在预期范围内。Microsoft.SharePoint.SPListCollection.GetListByName(String strListName,Boolean bThrowException)在Microsoft.SharePoint.SPListCollection.get_Item(String strListName)在ClientInfo.SiteProvisioning.FeatureActivated(SPFeatureReceiverProperties属性) Microsoft.SharePoint.SPFeature.DoActivationCallout(布尔fActivate,布尔fForce)

2008年7月25日16:22:09.45 w3wp.exe(0x1460)0x1BE8 Windows 的SharePoint Services常规72通过高功能激活:引发异常,尝试回滚。功能“ 网站配置”(ID:“ 7c020fff-ff42-4fe2-8a9b-9bca0d5f8001”)。异常:System.ArgumentException:值不在预期范围内。 Microsoft.SharePoint.SPFeature.DoActivationCallout(布尔值fActivate,布尔值)在MicrosoftInfo.Microsoft.SharePoint.SPListCollection.GetListByName(String strListName,布尔值bThrowException)在Microsoft.SharePoint.SPListCollection.get_Item(String strListName)在客户端信息。 fForce),位于Microsoft.SharePoint.SPFeature.Activate(SPSite siteParent,SPWeb webParent,SPFeaturePropertyCollection props,布尔值fForce)“

2008年7月25日在16:47
克里斯·奥'Brien说过...

嗨,马克,

好吧,似乎代码似乎没有找到将权限应用到的列表。

您是否像我的示例一样从Feature属性中检索它?如果是这样,您是否更新了XML中的值以匹配您的列表名称?否则,建议逐步调试,以查看是否还有其他类型的错字。

HTH,

克里斯。

2008年7月31日21:43
匿名 said...

克里斯你好
首先感谢您的文章。这有助于我们朝正确的方向迈进,以创建无缝的网站创建过程。我们按照您提供的步骤进行操作,以便自双色球推荐一注双色球推荐一注(从创建站点屏幕中选择时)为用户分配了所有者的自双色球推荐一注完全控制权限级别,成员的自双色球推荐一注贡献权限级别和访问者的自双色球推荐一注读取权限级别。由于我们破坏了代码的继承,因此我们想找出
一种。如果仅允许用户选择对newsbweb.aspx使用唯一权限。
b。如果有可能完全覆盖显示给用户的下一页,那么我们将直接进入新的站点页面,因为它没有太多用处,因为已经将这些组作为站点双色球推荐一注的一部分进行了创建。

我再次感谢您详细的步骤。

谢谢
-阿文

2008年10月30日,00:18
克里斯·奥'Brien说过...

嗨Arvind,

很高兴您发现它很有用。

您提到的更改可能会稍微复杂一些。我想对于第一个来说,您可以考虑在该页面上使用JavaScript进行操作(但是不支持!),或编写代码,以便无论用户在控件中选择了什么,此设置始终被覆盖。

关于第二个,如果您使用Reflector来查找SharePoint将该URL重定向到的位置,则可能会有些运气。

祝你好运

克里斯。

2008年11月2日,11:57

发表评论