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