Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sharepoint 向特定用户的公告列表中添加元素_Sharepoint_List_Impersonation - Fatal编程技术网

Sharepoint 向特定用户的公告列表中添加元素

Sharepoint 向特定用户的公告列表中添加元素,sharepoint,list,impersonation,Sharepoint,List,Impersonation,我有一个客户请求根据另一个数据库中的一些数据创建一些公告。大多数看起来都很简单,但是新元素应该由输入数据中指定的用户(登录名)创建。 我计划使用列表web服务添加公告,但我确实希望避免使用模拟,以获得正确的创建用户。有没有一种方法可以在不使用模拟的情况下将正确的用户指定为创建者?我认为没有一种方法可以将其存档 但也许这种变通方法会有所帮助。我必须承认,我从来没有测试过这个,这只是一个想法,你可以如何解决你的问题 你可以试试这个。使用管理员用户或RunWithElevatedPrivileges(

我有一个客户请求根据另一个数据库中的一些数据创建一些公告。大多数看起来都很简单,但是新元素应该由输入数据中指定的用户(登录名)创建。
我计划使用列表web服务添加公告,但我确实希望避免使用模拟,以获得正确的创建用户。有没有一种方法可以在不使用模拟的情况下将正确的用户指定为创建者?

我认为没有一种方法可以将其存档

但也许这种变通方法会有所帮助。我必须承认,我从来没有测试过这个,这只是一个想法,你可以如何解决你的问题

你可以试试这个。使用管理员用户或RunWithElevatedPrivileges()创建新公告。之后,再次使用RunWithElevatedPrivileges()方法,并将“创建人”字段设置为应该是公告的实际创建者的用户。这样,只有“编辑人”字段应显示“错误”用户


我知道这不是一个非常优雅的解决方案,但它可能会奏效

我刚刚意识到,我的要求实际上是绕过SharePoint中的审计跟踪,所以我当然希望不能这样做:-)

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

那么,当一个真正的用户在公告列表中输入一个新元素时,情况又如何呢?这将不会使用登录用户更新新字段

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


我知道这不是一个优雅的解决方案,但目前这是我能想到的最好的解决方案。

这可能不是您要寻找的答案,但如果您在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
    }
} 

正如答案的代码注释中提到的,如果用户至少没有访问过该站点一次,那么就没有用户元数据可用于派生适当的usertoken

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


现在看起来很有趣。我会尝试一下,然后回复柯克,我惊呆了。您提出的想法非常有效,但起初我认为这是一个主要的漏洞,因为审计跟踪的有效性现在是无效的。经过再三考虑,我意识到恶意代码必须访问系统的核心才能使用这个“漏洞”。是的,当我得知这个漏洞存在时,我也感到惊讶。正如您所说,您的代码必须具有特定的代码访问安全级别(当然是在GAC中),因此我认为这样可以:-)。另一个有趣的是SPListItem.SystemUpdate()。
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();