【问题标题】:SharePoint/WSS: Modify "created by" field?SharePoint/WSS:修改“创建者”字段?
【发布时间】:2009-06-18 17:53:03
【问题描述】:

全部 -

我正在使用 WSS 3.0。目前,HR 会将员工的内部公司简历上传到我们网站上的文档库,但出于隐私原因,我们必须限制对该文档库的访问,这迫使用户每次想要更新简历时都必须通过 HR。

我的想法是创建一个启用附件的列表,允许用户仅查看/编辑自己的项目,然后授予 HR 管理所有条目的权限。这适用于 HR 需要创建初始列表项并附上简历的例外情况,这意味着列表项将“由 {hr} 创建”,并且附有简历的最终用户不可见/不可编辑。

我有什么想法可以让 HR 修改上传时的“创建者”字段,以便最终用户可以看到并编辑他们的简历,或者以不同的方式进行此操作?

谢谢!

【问题讨论】:

    标签: sharepoint permissions wss


    【解决方案1】:

    创建一个文档库来保存简历。然后赋予 HR 部门(SharePoint 用户组)对该库的“读/写所有”权限,赋予其他人读/写自己的“权限。根据外部创建一个名为“Resume”的 Content Type box 文档内容类型。然后在内容类型中添加一个包含简历涉及的员工(SPUser 字段)的字段(以及所需的任何其他字段,即姓名、地址等)。让 HR 在创建列表项时正确填写(填写必填字段)。

    然后,编写一个绑定到您刚刚创建的内容类型的 itemeventreceiver 并覆盖 ItemUpdated 事件。

    代码如下:

    public override void ItemUpdated(SPItemEventProperties properties)
    {
      SPSecurity.RunWithElevatedPrivileges(delegate
      {
        using (SPWeb web = properties.OpenWeb())
        {
           web.AllowUnsafeUpdates = true; 
           var item = web.Lists[properties.ListId].GetItemById(properties.ListItemId);
           if (item != null)
           {
             if (item.Fields.ContainsField("Employee"))
             {
               item["Author"] = item["Employee"]; 
               // Author is the internal name of the Created by field, 
               // always use Internal Names!
               DisableEventFiring();
               item.SystemUpdate();
               EnableEventFiring();
             }
           }
         }
       });
    }
    

    您可以使用 FeatureReceiver 将 ItemEventReceiver 绑定到内容类型,如下所示:

    SPContentType docCt = web.ContentTypes[new SPContentTypeId("CONTENTYPE ID GOES HERE")];
    docCt.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=TOKEN", "FULLY QUALIFIED CLASSNAME");
    docCt.Update();
    

    【讨论】:

      【解决方案2】:

      为什么不直接使用文档库来保存简历? (而不是带有附件的列表。)您可以授予 HR 对其中所有文档的完全读取/写入权限,并且简历的所有者将仅对他们自己的简历有贡献权限。

      【讨论】:

      • Jason,当然也可以,但问题仍然是如果 HR 始终是第一个上传简历的人,我如何告诉 SP 谁拥有简历? (我们不能指望用户添加他们自己的初始简历,但我们希望他们能够继续维护它们。)在这种情况下,SP 会假设 HR 是所有简历的所有者,而不是单个用户。因此,我相信我仍然需要一种方法来修改“创建者”字段或其他一些创造性的解决方法......
      • 您可以隐藏“创建者”字段,并添加您自己的“人员和组”列,称为“简历所有者”或类似名称。人力资源部只需要勤奋地用所有者的名字标记简历。
      • Jason - 也许我错过了什么……?我意识到我可以隐藏“创建者”字段并创建自己的自定义字段,但据我所知,我无法根据自定义列分配权限(例如,创建一个新的“人员和组”列,然后相关权限,表示员工只能查看/编辑“登录名 = 自定义列名”的项目)。假设我无法分配这些权限,那么我仍然卡住了......我无法允许用户查看/编辑他们的简历。请说明我是否遗漏了一些明显的东西!
      • 你越来越近了。从视图中隐藏文档实际上并不限制对它的访问。访问限制与包含其特定名称的字段无关。您需要使用“HR”组并授予他们对库中所有内容的完全访问权限。然后,您需要一个禁止访问库的“用户”或“简历所有者”组。此时,您可以逐项逐项,并取消对每个文档的权限,明确授予简历所有者访问其拥有的简历的权限。
      • 明白。感谢您的耐心等待。我希望有一种快速的点击方式来更新创建者,而不必为我们公司的每一份简历设置自定义权限,然后必须为每一个上传的新简历维护它。 (而且由于权限信息并不总是很明显,它似乎会导致 HR 忘记为用户创建权限等各种潜在问题。)哦,好吧。我也会看看下面的代码,看看它是否适合我们的目的。可惜这个用例不容易处理....再次感谢您的帮助!
      【解决方案3】:

      我找到了一种使用 SharePoint Designer 更改“创建者”字段以创建工作流的方法。

      1. 在您的列表中创建一个虚拟字段,并使用易于识别的名称,例如 某某。将其设为“个人或组”字段。
      2. 在 SharePoint Designer 中,为您的列表创建一个工作流。允许手动启动并在创建新项目时自动启动。
      3. 操作 -> 在当前项目中设置字段 -> 将 XYZZY 设置为列表中包含要放入创建者的用户帐户的字段。
      4. 点击完成
      5. 现在,使用记事本打开您的工作流 .xoml 文件。将“XYZZY”替换为“作者”。保存 .xoml 文件。
      6. 在 Designer 中打开工作流。单击完成,以便使用新代码重新处理。
      7. 从列表中删除虚拟字段。
      8. 对列表中的每个现有项目运行工作流。新项目会自动自我更正。

      【讨论】:

      • 呃,使用虚拟字段有点乱,我也反对在编译程序集时使用 SharePoint Designer 工作流。
      【解决方案4】:

      使用自定义上传屏幕,您可以在上传之前更改当前用户的上下文。它需要使用类似以下的方式查找用户令牌(这些是工作代码的 sn-ps,已删除错误处理和其他内容)。请注意, EnsureUser 将要求当前用户基本上是管理员/所有者。

      using (SPSite site = GetImpersonatedSite(runAsUser))
      {
          using (SPWeb web = site.OpenWeb())
          {
              // Do stuff here
          }
      }
      
      private SPSite GetImpersonatedSite(string username)
      {
          user = SPContext.Current.Web.EnsureUser(username);
          SPSite site = new SPSite(SPContext.Current.Web.Url, user.UserToken);
          return site;
      }
      

      【讨论】:

      • 当前用户始终是 HR,因为他们将上传简历
      【解决方案5】:

      我有类似的情况(迁移到共享点),我必须将管理员用户的文件添加到文档库,然后“更改”用户。我是这样做的,可能会对您有所帮助:

      using (var root = site.RootWeb)
       {
         var users = root.SiteUsers;
         var user = users["domain\username"];
         file.Item[SPBuiltInFieldId.Created_x0020_By] = user.ID;
         file.Item[SPBuiltInFieldId.Modified_x0020_By] = user.ID;
         file.Item.UpdateOverwriteVersion();
      

      【讨论】:

      • 这里SPBuiltInFieldId.Modified_x0020_By的使用是错误的。该字段包含用户 LoginName 值(字符串)而不是 ID。
      • 更好地使用file.Item[SPBuiltInFieldId.Editor] = user。我遇到了SPBuiltInFieldId.Modified_x0020_By 的问题。
      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多