模拟

上次修改时间: 2010年4月14日

适用范围: SharePoint Foundation 2010

模拟是 Windows SharePoint Services 3.0 中的一项新功能,它使您能够代表另一名用户执行操作。有些情况下,模拟功能非常有用,例如,执行计时器操作,这些操作需要在用户已停止使用网站(即,他们的工作流已完成)很长一段时间后,代表该用户异步更新某些内容。

备注

有关挂起模拟的信息,请参阅避免挂起调用用户模拟

当您使用 Microsoft.SharePoint 命名空间以编程方式创建 SharePoint 网站时,可以提供用户标记以便在特定用户上下文中创建对象。通过提供从 Microsoft.SharePoint.SPUser 对象获取的用户的用户标记,您可以模拟该用户。用户标记 SPUserToken 是一个二进制对象,它包含用户的标识和域组成员身份。

因此,您可以使用 Microsoft.SharePoint.SPSite 构造函数来实例化网站集对象,该网站集对象运行时就好像用户正在进行某些更改一样。

通常不必为存储用户凭据而增强安全性。可以通过使用系统帐户特权或适当的用户信息特权运行的代码查看这些凭据。

请注意,用户标记通常会在大约 24 小时后过期。如果您打算执行长时间延迟的操作,则可能需要将用户 ID 保存到数据库中并在稍后检索它。但是,这可能会降低性能,因为会增加从数据库中检索信息的开销。如果您希望该操作"稍微不同步"(例如,如果该操作 5 分钟后运行),则不必这么做。

由于它需要双向信任关系,因此还请注意,如果与 SharePoint 数据库交互的 Web 前端服务器位于其他两个网络之间的服务器上,则模拟功能不可用。在这种情况下,该 Web 前端服务器只具有单向信任关系。此外,不会筛选组安全 ID (SIDS),这可能会导致 SID 筛选策略在域之间产生冲突。

尽管模拟功能可提供用于管理安全性的强大技术,但应小心使用此功能,以确保不能执行模拟操作的用户不会执行不需要的活动。

备注

若要在代码中执行模拟操作后在网站上继续使用对象,您必须重新实例化 SPSite 对象。

管理用户标记

SharePoint 从 SharePoint 数据库中提取用户标记信息。如果用户从未访问过该网站或者该用户的标记生成时间已远远超过 24 小时,则 SharePoint 会通过尝试刷新该用户所属的组列表来生成新的用户标记。

如果用户帐户是一个 NT 帐户,则 SharePoint 将使用 AuthZ 接口来查询 TokenGroups 属性的 Active Directory 目录服务。如果 SharePoint 在 Extranet 模式下运行并且无权查询此属性的 Active Directory,则查询操作可能会失败。

如果用户帐户是一个成员资格用户,那么 SharePoint 会查询该用户所属的所有角色的 ASP.NET RoleManager。如果当前的可执行文件不具有适当的 .config 文件,该操作可能会失败。

如果 SharePoint 不能从 Active Directory 或 <roleManager> 获取用户的组成员身份,则新生成的标记将只包含该用户的唯一安全 ID (SID)。不会引发任何异常,但会在 ULS 服务器日志中写入一项。同时会将新的标记写入 SharePoint 数据库,以便不会在 24 小时内重新生成该标记。

从 SharePoint 数据库或通过生成新标记获取一个全新的标记之后,SharePoint 会将时间戳设置为当前时间,然后将该标记返回给调用方,这可以保证该标记在 24 小时之内始终是新的。 

SPUserToken 对象返回给调用方后, 调用方应负责确保不在该标记过期后使用它。您可以编写一个帮助实用程序,以便通过记录标记获取时间来跟踪标记过期期限,并比较当前时间和 SPWebService.TokenTimeout 之间的差值。

如果使用一个过期的标记创建 SharePoint 网站,则会引发异常。默认标记超时值为 24 小时。可以通过 SPWebService.TokenTimeout 获取该值。

还可以使用 Stsadm 来获取或设置标记超时值。下面的命令从用户标记返回一个值:

stsadm -o getproperty -propertyname token-timeout

下面是结果:

<Property Exist="Yes" Value="1440" /> // 1440 minutes is 24 hours

下面的命令设置用户标记值:

stsadm -o setproperty -propertyname token-timeout -propertyvalue 720

请参阅

概念

提示和已知问题