1

这是我的代码片段:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    SPSolution newSolution = SPFarm.Local.Solutions.Add(@fullPath);                            
});

stacktrace 和 innerexception 没有提供进一步的线索。Exception.Source 说Microsoft.SharePoint

SPFarm.Local.CurrentUserIsAdministrator() 为用户 ID 返回 TRUE。

用户 ID 位于 Farm Administrators 组中。

有任何想法吗?

编辑

我已将代码更改为以下内容,但仍然收到拒绝访问错误:

private void AddSolution()
{
   SPSolution newSolution = SPFarm.Local.Solutions.Add(@fullPath);
}

SPSecurity.CodeToRunElevated elevatedAddSolution = new SPSecurity.CodeToRunElevated(AddSolution);
SPSecurity.RunWithElevatedPrivileges(elevatedAddSolution);
4

3 回答 3

1

您是否尝试在 RunWithElevatedPriviliges 调用之外声明委托?

编辑:忽略下面,因为您似乎已检查权限。

RunWithElevatedPriviliges 将使用 SP 在其下运行的应用程序池的标识。您是否确保此帐户在您的环境中具有足够的权限?

于 2009-02-11T14:25:25.417 回答
1

我确实相信您遇到的问题是由于您使用静态成员来访问 SPFarm 对象。我认为它类似于运行 SPcontext 静态类,它仍将在登录用户的安全上下文下运行,而不是在提升的权限上下文(即本地应用程序池标识)下运行。

在你的委托中试试这个:

SPFarm spFarm = SPWebService.AdministrationService.Farm;
SPSolution newSolution = spFarm.Solutions.Add(@fullPath);

编辑:由于上述内容没有帮助,那么您的问题可能与配置数据库的数据库权限有关。RunWithElevatedPriviliges 将以运行代码的应用程序池的身份运行。向您的场添加解决方案会影响配置数据库,因此您的应用程序池身份将需要访问配置数据库。作为测试尝试将应用程序池身份添加到配置数据库并为其授予 dbo 权限。如果这样可以解决问题,那么您将需要找到每个应用程序池帐户添加解决方案所需的最低权限(不要保留为 dbo)

于 2009-02-11T16:12:21.977 回答
1

您的主要问题可能只是您不是共享点数据库的 DBO(如果我没记错的话,_Config)。向场添加解决方案需要更多权限,而不仅仅是访问场。

确保运行此程序的用户是适当数据库的农场管理员和 DBO。

如果您仍然有问题...尝试运行

stsadm -o 添加解决方案-文件名“myWsp.wsp”

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

于 2009-02-12T05:03:05.397 回答