我有一个客户要求根据另一个数据库中的一些数据创建一些公告。大部分看起来很容易,但新元素应该由输入数据中指定的用户(登录)创建。我计划使用列表 Web 服务添加公告,但我肯定想避免使用模拟来获得创建用户的权利。有没有办法在不使用模拟的情况下将正确的用户分配为创建者?
4 回答
这可能不是您要寻找的答案,但如果您在 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
}
}
我不认为有存档的方法。
但也许这种解决方法可能会有所帮助。我不得不承认我从未测试过这个,这只是一个想法,你可以如何解决你的问题。
你可以试试这个。使用管理员用户或 RunWithElevatedPrivileges() 创建新公告。之后再次使用 RunWithElevatedPrivileges() 方法并将“创建者”字段设置为应该是公告的实际创建者的用户。通过这种方式,只有“编辑者”字段应该显示“错误”用户。
我知道这不是一个非常优雅的解决方案,但它可能会奏效。;)
我刚刚意识到我的要求实际上是绕过 SharePoint 中的审计跟踪,所以我当然希望它不能完成 :-)
我想出了另一个解决方案:我在公告列表中添加了一个新的用户或组字段,并将 AD 用户登录复制到该字段中。以前使用“创建者”字段的任何报表或视图现在都应使用新字段。
那么真实用户在公告列表中输入一个新元素的情况呢?这不会使用登录用户更新新字段!
好吧,我能想出的唯一解决方案是在列表中添加一个 ListItem Add 触发器。添加新元素时,我检查新字段是否包含值,然后我使用登录用户的 ID 更新新字段。这样,新字段应始终包含有效的用户 ID。
我知道这不是一个优雅的解决方案,但目前它是我能想到的最好的解决方案。
正如答案的代码注释中所提到的,如果用户至少一次没有访问过该站点,那么就没有可用的用户元数据来派生适当的用户令牌。
使用 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();