SharePoint 2010高并发下异常“此用户不存在或不唯一”处理
现象
在事件查看器的日志中,会有以下警告信息:
对象缓存: 未配置缓存使用的超级用户帐户。这可能会增加缓存未命中数,导致页面请求使用不必要的系统资源。
若要配置帐户,请使用以下命令 'stsadm -o setproperty -propertyname portalsuperuseraccount -propertyvalue account -url webappurl'。此帐户必须是对 SharePoint 数据库具有完全控制权限的任何帐户,而不是应用程序池帐户。
附加数据:
当前默认超级用户帐户: SHAREPOINT\system
当去访问一个发布页面时,页面会报错,事件查看器日志中会有以下警告:
Event code: 3005
Event message: 发生了未处理的异常。
Event time: 2012/11/13 11:52:38
Event time (UTC): 2012/11/13 3:52:38
Event ID: 497ba228589e4ff2a192bf6582f525c9
Event sequence: 310
Event occurrence: 2
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/1949916159/ROOT-1-129972506606997458
Trust level: WSS_Minimal
Application Virtual Path: /
Application Path: C:\inetpub\wwwroot\wss\VirtualDirectories\80\
Machine name: SJ-MOSS-04
Process information:
Process ID: 4684
Process name: w3wp.exe
Account name: XXXX\sharepoint_admin
Exception information:
Exception type: SPException
Exception message: 此用户不存在或不唯一。
Request information:
Request URL: http://xxxx.com/sites/informationcenter/SitePages/Home.aspx
Request path: /sites/informationcenter/SitePages/Home.aspx
User host address: 10.72.29.35
User: 0#.f|admembership|XXXX
Is authenticated: True
Authentication Type: Federation
Thread account name: XXXX\sharepoint_admin
Thread information:
Thread ID: 18
Thread account name: XXXX\sharepoint_admin
Is impersonating: False
Stack trace: 在 Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
在 Microsoft.SharePoint.Library.SPRequest.GetUserToken(String bstrUrl, String bstrLogin)
在 Microsoft.SharePoint.SPWeb.GetUserToken(String userName)
在 Microsoft.SharePoint.Publishing.CacheManager.<.ctor>b__0(SPSite newSite)
在 Microsoft.SharePoint.Publishing.CommonUtilities.<>c__DisplayClass1.<RunWithElevatedSite>b__0()
在 Microsoft.SharePoint.SPSecurity.<>c__DisplayClass4.<RunWithElevatedPrivileges>b__2()
在 Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)
在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param)
在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)
在 Microsoft.SharePoint.Publishing.CommonUtilities.RunWithElevatedSite(SPSite siteNonElev, Boolean allowUnsafeUpdates, ElevatedSiteProcessor callWithElevatedSite)
在 Microsoft.SharePoint.Publishing.CacheManager..ctor(SPSite site)
在 Microsoft.SharePoint.Publishing.CacheManager.GetManager(SPSite site, Boolean useContextSite, Boolean allowContextSiteOptimization)
在 Microsoft.SharePoint.Publishing.WebControls.CombinedBasePermissions..ctor()
在 Microsoft.SharePoint.Publishing.WebControls.ConsoleNode.CurrentPermissions()
在 Microsoft.SharePoint.Publishing.WebControls.ConsoleNode.CurrentState(Page currentPage, Boolean cacheResult)
在 Microsoft.SharePoint.Publishing.WebControls.EditingMenuActions.ConsoleAction.OnPreRender(EventArgs e)
在 System.Web.UI.Control.PreRenderRecursiveInternal()
在 System.Web.UI.Control.PreRenderRecursiveInternal()
在 System.Web.UI.Control.PreRenderRecursiveInternal()
在 System.Web.UI.Control.PreRenderRecursiveInternal()
在 System.Web.UI.Control.PreRenderRecursiveInternal()
在 System.Web.UI.Control.PreRenderRecursiveInternal()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
原因
- 所有的发布内容会启用缓存以提高访问性能。
- 环境配置了Form和AD认证,对象缓存用户帐户配置不正确。
- 对环境进行高并发测试时诱发了此问题。
解决办法
使用管理中心创建用户帐户
- 确认您拥有以下管理凭据:
- 若要在管理中心中创建用户帐户,您必须是运行 SharePoint 管理中心网站的计算机上 Farm Administrators 组的成员。
- 在管理中心网站上的“应用程序管理”部分,单击“管理 Web 应用程序”。
- 单击想要配置的 Web 应用程序的名称。
- 在“Web 应用程序”选项卡上的“策略”组中,单击“用户策略”。
- 在“Web 应用程序的策略”窗口中,单击“添加用户”。
- 从“区域”列表中,选择“所有区域”,然后单击“下一步”。
- 在“用户”框中,键入“门户超级用户”帐户的用户名。
- 单击“检查名称”图标以确保帐户名称可以被应用程序服务器上的身份验证提供程序解析。
- 在“选择权限”部分,选中“完全控制 - 拥有完全控制权限”框。
- 单击“完成”。
- 对“门户超级读者”帐户重复步骤 5 到步骤 8。
- 在“选择权限”部分,选中“完全读取 - 拥有完全只读权限”框。
- 单击“完成”。
- 记下“对象缓存超级读者”和“对象缓存超级用户”帐户的名称在“用户名”列中的显示方式。显示的字符串会有所不同,具体取决于您是否对 Web 应用程序使用声明身份验证。
使用 Windows PowerShell 向 Web 应用程序添加用户帐户
- 确认您满足以下最低要求:请参阅 Add-SPShellAdmin。
- 复制以下代码并粘贴到文本编辑器(如记事本)中:
$wa = Get-SPWebApplication -Identity "<WebApplication>"
$wa.Properties["portalsuperuseraccount"] = "<SuperUser>"
$wa.Properties["portalsuperreaderaccount"] = "<SuperReader>"
$wa.Update() - 将以下占位符替换为相应值:
- <WebApplication> 是要将帐户添加到的 Web 应用程序的名称。
- <SuperUser> 是要使用的“门户超级用户”帐户,显示在前面过程的步骤 14 中提到的“用户列”字段中。
- <SuperReader> 是要使用的“门户超级读者”帐户,显示在前面过程的步骤 14 中提到的“用户列”字段中。
- 保存文件,将其命名为 SetUsers.ps1。
注意: |
可以使用其他文件名,但必须将 ANSI 编码的文件保存为扩展名为 .ps1 的文本文件。 |
- 关闭文本编辑器。
- 在“开始”菜单上,单击“所有程序”。
- 单击“Microsoft SharePoint 2010 产品”。
- 单击“SharePoint 2010 Management Shell”。
- 转到保存该文件的目录。
- 在 Windows PowerShell 命令提示符处,键入以下命令: ./SetUsers.ps1
- 重置 Internet Information Services (IIS)。
参考资源:
配置对象缓存用户帐户:http://technet.microsoft.com/zh-cn/library/ff758656.aspx