这是我的代码段:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPSolution newSolution = SPFarm.Local.Solutions.Add(@fullPath);
});
stacktrace和innerexception没有提供进一步的线索。 Exception.Source说 Microsoft.SharePoint 。
SPFarm.Local.CurrentUserIsAdministrator()为用户标识返回TRUE。
用户标识位于Farm Administrators组中。
有什么想法吗?
修改
我已将代码更改为以下内容,但仍然会收到“拒绝访问”错误:
private void AddSolution()
{
SPSolution newSolution = SPFarm.Local.Solutions.Add(@fullPath);
}
SPSecurity.CodeToRunElevated elevatedAddSolution = new SPSecurity.CodeToRunElevated(AddSolution);
SPSecurity.RunWithElevatedPrivileges(elevatedAddSolution);
答案 0 :(得分:1)
您是否尝试过在RunWithElevatedPriviliges调用之外声明代理?
编辑: 忽略下方,因为您似乎已检查权限。
RunWithElevatedPriviliges将使用运行SP的应用程序池的标识。您是否确保此帐户在您的环境中拥有足够的权限?
答案 1 :(得分:1)
我确实认为您遇到的问题是由于您使用静态成员访问SPFarm对象。我认为它类似于运行SPcontext静态类,它仍然在登录用户的安全上下文下运行,而不是在提升的privledges上下文(这是本地应用程序池标识)下运行。
请在您的代理中尝试此操作:
SPFarm spFarm = SPWebService.AdministrationService.Farm;
SPSolution newSolution = spFarm.Solutions.Add(@fullPath);
编辑: 由于上述方法没有帮助,因此您的问题可能与配置数据库的数据库权限有关。 RunWithElevatedPriviliges将在代码运行的应用程序池标识下运行。向服务器场添加解决方案会影响配置数据库,因此您的应用程序池标识将需要访问配置数据库。作为测试尝试将应用程序池标识添加到配置数据库并为其授予dbo权限。如果这样可以解决问题,那么您需要找到每个应用池帐户添加解决方案所需的最小权限(不要留为dbo)
答案 2 :(得分:1)
您的主要问题可能只是您不是共享点数据库的DBO(如果我没错,则为_Config)。向服务器场添加解决方案需要更多权限,而不仅仅是访问服务器场。
确保运行此用户的用户是适当数据库的Farm Administrator和DBO。
如果您仍有问题...请尝试运行
stsadm -o addsolution -filename “myWsp.wsp”
如果你有正确的权利,它会给你正确的错误。