将元素添加到特定用户的公告列表中

时间:2009-03-08 23:29:30

标签: sharepoint list impersonation

我有客户要求根据另一个数据库中的某些数据创建一些公告。大多数似乎很容易,但新元素应该由输入数据中指定的用户(登录)创建。 我打算使用列表Web服务添加公告,但我确实希望避免使用模拟以使创建用户正确。有没有办法在不使用模拟的情况下将正确的用户指定为创建者?

4 个答案:

答案 0 :(得分:2)

这可能不是您正在寻找的答案,但如果您在SharePoint服务器上的GAC中运行代码,则模拟非常简单。你不需要知道许多人没有意识到的密码,所以我会继续假设这是你不想冒充的原因。这是如何做到的。

您可以使用用于SPSite的典型构造函数连接到SharePoint,并查找相应的SPUser对象。完成后,您可以获取该SPUser的UserToken属性。然后,您将需要再次使用SPSite构造函数,但使用提供SPUserToken的重载。然后,您在SharePoint中执行的任何操作都将通过模拟完成。无需以提升的权限运行。

好的,现在我已经用语言说了,我会试着猜测代码。它应该是这样的:

// Just determine the user token for a particular user
SPUserToken userToken = null;
using (SPSite tempSite = new SPSite("http://sharepointurl"))
{
    using (SPWeb tempWeb = tempSite.OpenWeb())
    {
        // I think this next line works, but I'm going from memory
        // I believe the user needs to have already logged into the site at least once
        SPUser user = tempWeb.AllUsers["username"];
        userToken = user.UserToken;
    }
}

// Now do whatever we want impersonating that user
using (SPSite site = new SPSite("http://sharepointurl", userToken))
{
    using (SPWeb web = site.OpenWeb())
    {
        // Do whatever you want here
    }
} 

答案 1 :(得分:0)

我认为没有一种存档方法。

但也许这种解决方法可能有所帮助。我不得不承认我从来没有测试过这个,只知道如何解决你的问题。

你可以试试这个。使用admin用户或RunWithElevatedPrivileges()创建新公告。之后再次使用RunWithElevatedPrivileges()方法并将“created by”字段设置为应该是公告的实际创建者的用户。通过这种方式,只有“编辑者”字段才能显示“错误”用户。

我知道这不是一个非常优雅的解决方案,但它可能有用。 ;)

答案 2 :(得分:0)

我刚刚意识到我的要求实际上是绕过SharePoint中的审计跟踪,所以我当然希望无法完成: - )

我提出了另一个解决方案:我在公告列表中添加了一个新的用户或组字段,并将AD用户登录复制到此字段中。之前使用“创建者”字段的任何报告或视图现在都应使用新字段。

然后真实用户在公告列表中输入新元素的情况如何?这不会使用登录用户更新新字段!

嗯,我能想出的唯一解决方案是在列表中添加一个ListItem Add触发器。添加新元素时,我会检查新字段是否包含值,然后我不会使用登录用户的ID更新新字段。这样,新字段应始终包含有效的用户ID。

我知道这不是一个优雅的解决方案,但暂时它是我能想到的最佳解决方案。

答案 3 :(得分:0)

在答案的代码注释中提到,如果用户至少没有访问过该网站一次,那么就没有可用的用户元数据可以从中获取正确的用法。

使用SharePoint 2010,您可以使用SPWeb类提供的EnsureUser方法模拟用户访问(此代码段创建用户并稍微调整其配置文件):

SPUser alice = web.EnsureUser(@"MYDOMAIN\alice");
SPList userInfo = web.SiteUserInfoList; //metadata storage of user info

SPListItem item = userInfo.GetItemById(alice.ID);
item["About Me"] = "I am Alice from Mel's Diner";
item.Update();