2009-02-11 81 views
1

這裏是我的代碼片段:SPFarm.Local.Solutions.Add - 例外 - 「拒絕訪問」

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

堆棧跟蹤和給予的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); 

回答

1

您的主要問題可能就是您不是DBO的Sharepoint數據庫(_Config,如果我沒有錯的話)。向農場添加解決方案需要的不僅僅是訪問農場的權利。

確保運行此操作的用戶是適當數據庫的Farm Administrator和DBO。

如果您仍然有問題...嘗試運行

stsadm -o addsolution -filename "myWsp.wsp"

如果你有適當的權利,它會給你正確的錯誤。

1

你試過聲明呼籲RunWithElevatedPriviliges以外的代表?

編輯:忽略下方,因爲您似乎已檢查權限。

RunWithElevatedPriviliges將使用SP正在運行的應用程序池的標識。您是否確保此帳戶在您的環境中擁有足夠的權限?

+0

你的第一個問題是什麼意思? – 2009-02-11 14:51:56

+0

我的意思是基本上嘗試你以上所做的,儘管它似乎沒有奏效。 – Charlie 2009-02-11 14:56:48

+0

您是否像之前討論過的那樣在本地Web服務上運行此操作? – Charlie 2009-02-11 15:02:20

1

我確實認爲您遇到的問題是由於您使用靜態成員訪問SPFarm對象。我認爲它類似於運行SPcontext靜態類,它仍將在已登錄用戶的安全上下文下運行,而不是在提升的權限上下文(即本地應用程序池標識)下運行。

試試這個,而不是你的委託裏面:

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

編輯: 由於上述沒有再幫您的問題可能有與數據庫的權限配置數據庫做。 RunWithElevatedPriviliges將以應用程序池的代碼運行的身份運行。向服務器場添加解決方案會影響配置數據庫,因此您的應用程序池標識將需要訪問配置數據庫。作爲一個測試嘗試添加應用程序池標識到配置數據庫,並給它dbo權限。如果解決了這個問題,那麼您將需要找到每個應用程序池帳戶需要添加解決方案的最低權限數量(不要作爲dbo離開)