SharePoint / WSS:修改“创建者”字段?

时间:2009-06-18 17:53:04

标签: sharepoint permissions wss

全部 -

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

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

关于我如何允许HR在上传时修改“创建者”字段的任何想法,以便最终用户可以看到并编辑他们的简历,或者以不同的方式解决这个问题?

谢谢!

5 个答案:

答案 0 :(得分:7)

创建一个文档库来保存简历。然后给HR部门(SharePoint用户组)“读取/写入所有”库的权限,让其他人读/写你自己的“权利。创建一个名为”Resume“的内容类型,基于以下内容: box文档内容类型。然后将包含简历所关注的Employee(SPUser字段)的字段添加到内容类型(以及所需的任何其他字段,即名称,地址等)。在创建listitem时,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();

答案 1 :(得分:3)

为什么不直接使用文档库进行简历? (而不是带有附件的列表。)您可以为其内部的所有文档提供HR完整读/写,并且简历的所有者将仅对自己的简历提供权限。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

使用自定义上传屏幕,您可以在上传之前更改当前用户的上下文。它需要使用以下内容查找用户令牌(这些是工作代码的片段,其中包含错误处理和其他内容已删除)。请注意,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;
}

答案 4 :(得分:-1)

我有类似的情况(迁移到sharepoint),我必须将一个带有admin用户的文件添加到文档库,然后“更改”用户。我这样做了,可能会对你有所帮助:

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