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

Posted

技术标签:

【中文标题】将元素添加到特定用户的公告列表【英文标题】:Add elements to an an announcements list for a specific user 【发布时间】:2009-03-08 23:29:30 【问题描述】:

我有一个客户请求,要根据另一个数据库中的一些数据创建一些公告。大部分看起来很容易,但新元素应该由输入数据中指定的用户(登录名)创建。 我计划使用列表 Web 服务添加公告,但我肯定想避免使用模拟来获得创建用户的权利。有没有办法在不使用模拟的情况下将正确的用户指定为创建者?

【问题讨论】:

【参考方案1】:

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

【讨论】:

现在看起来很有趣。我会尝试并恢复 柯克,我惊呆了。您建议的想法很好,但起初我认为这是一个重大漏洞,因为审计跟踪的有效性现在无效。转念一想,我意识到恶意代码无论如何都必须获得对系统核心的访问权才能使用这个“漏洞”。 是的,当我得知这个漏洞存在时,我也很惊讶。正如您所说,您的代码必须具有某些代码访问安全级别(当然,在 GAC 中可以完成这项工作),所以我认为这可以:-)。另一个有趣的是 SPListItem.SystemUpdate()。【参考方案2】:

我不认为有存档的方法。

但也许这种解决方法可能会有所帮助。我不得不承认我从未测试过这个,这只是一个想法,你可以如何解决你的问题。

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

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

【讨论】:

【参考方案3】:

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

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

那么真实用户在公告列表中输入一个新元素的情况呢?这不会使用登录用户更新新字段!

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

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

【讨论】:

【参考方案4】:

正如答案的代码 cmets 中所提到的,如果用户至少一次没有访问过该站点,那么就没有可用的用户元数据来派生适当的用户令牌。

使用 SharePoint 2010,您可以使用 SPWeb 类中可用的 EnsureUser 方法模拟用户访问(此 sn-p 创建用户并稍微调整其个人资料):

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

【讨论】:

以上是关于将元素添加到特定用户的公告列表的主要内容,如果未能解决你的问题,请参考以下文章

SharePoint 2013 查询特定内容类型

Laravel 分页:添加新元素

在列表中添加元素

当我尝试从网页添加 DOM 元素时,我的数组得到 0 值,如何将值添加到 .each 函数中的列表?

列表 CellTable/ Pager 顶部的特定元素

在将焦点转移到某个元素之前,如何等待公告完成?