SPFarm.Local.Solutions.Add - 异常 - “访问被拒绝”

时间:2009-02-11 14:16:38

标签: sharepoint sharepoint-2007

这是我的代码段:

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

3 个答案:

答案 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”

如果你有正确的权利,它会给你正确的错误。