2009-07-18 67 views
3

我在SharePoint 2007中編寫了兩個功能。 一個作用域位於Site級別,它基本上將Web部件添加到激活的網站集。該功能部件部署在'bin'目錄下。 其次是Farm作用域,這是我的自定義SPPersistedObject並部署在管理中心中。該程序集已添加到GAC。從Web部件更新SPPersistedObject時出錯

從Web部件我需要更新我的自定義對象。這在大多數情況下工作正常。但是,遵循一些服務器上的最小特權管理域帳戶「 http://technet.microsoft.com/en-us/library/cc263445.aspx」我提示以下錯誤:

System.Security.SecurityException: 訪問被拒絕。在MyWebPart上的 Microsoft.SharePoint.Administration.SPPersistedObject.Update() 。 <> c__DisplayClass1.b__0() at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state)at Microsoft.SharePoint.SPSecurity。 <> c__DisplayClass4.b__2()(CodeToRunElevated 安全碼)在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback 安全碼,對象PARAM) 在 Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges (CodeToRunElevated 的SecureCode)在 MyWebPart.RenderWebPart(HtmlTextWriter的 作家)的組件 失敗的區域是:我的電腦

我是否需要設置任何權限或CAS政策,以防止這個錯誤?

下面是我爲web部件組件設置的當前CAS策略。我需要在這裏進行任何更改嗎?

<CodeAccessSecurity> 
    <PolicyItem> 
     <PermissionSet class="NamedPermissionSet" version="1" Name="MyPermission" Description="Permission set for my solution"> 
     <IPermission class="System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Level="Medium" /> 
     <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> 
     <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> 
     <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="AllFlags" /> 
     <IPermission class="Microsoft.SharePoint.Security.WebPartPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" Connections="true" /> 
     <IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" ObjectModel="true" UnsafeSaveOnGet="true" Impersonate="true"/> 
     <IPermission class="System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"> 
      <ConnectAccess> 
      <URI uri="$OriginHost$"/> 
      <URI uri="http://.*\.xyz\.com/.*"/> 
      </ConnectAccess> 
     </IPermission> 
     </PermissionSet> 
     <Assemblies> 
     <Assembly Name="MyWebPart" Version="1.0.0.0" PublicKeyBlob="0024000004800000940000000602000000240000525341310004000001000100df0e85cb8c660241cd3225eb653a590b91303ddbd37f8f1e661d2dffb840a258b899d6bacbbc55d03768d5ea0260ee4c8341fd447d7200abdb74b837733c3f756833e169cae803aef808530dd3ddad953a49492faee3eeba6f0dba66b0d66f1f9ca5266c69dcb799ed364db5e9e6ebcd4e81fb27365de962cbe6e7e7fba300dc"/> 
     </Assemblies> 
    </PolicyItem> 
    </CodeAccessSecurity> 

請指教。

問候, 賈格納

回答

6

賈格納,

您遇到的問題是由於這樣的事實,對於數據的後備存儲從SPPersistedObject派生類型是SharePoint場配置數據庫。在最少特權安裝中,除讀取此數據庫以外的任何內容的唯一帳戶是服務器場服務(計時器服務)帳戶。即使在您的代碼中提升特權也只會將您的安全上下文「提升」到在IIS中運行該網站的應用程序池帳戶的安全上下文。

我遇到你之前是這種情況,我只知道我有兩種方法來解決它:

  1. 找到一種方法的上下文中運行的應用程序代碼農場服務帳戶。這通常轉換爲將代碼作爲自定義計時器作業運行。

  2. 調整場配置數據庫權限以授予應用程序池帳戶(假定在作爲高級安全塊的一部分運行時)寫入權限。

在這兩個選項中,只有第一個選項保持真正的「最低權限」執行原則......但它確實需要重新設計代碼。

我一般都很好地創建了一個「掃描」自定義計時器作業,該作業被創建並計劃在特徵激活時運行。然後,該計時器作業將檢查網站集(通常會掃描整個Web應用程序)以查看是否需要持久化,更新等屬性。如果發現需要更新,則它們由計時器作業執行,因爲它具有所需的訪問權限水平。

的什麼我描述一個功能,我拿出在CodePlex上(http://blobcachefarmflush.codeplex.com/SourceControl/changeset/view/53851#797787)出現一個例子。我需要更新SPWebApplication實例上的Properties包,唯一的方法是在計時器作業的上下文中進行。當用戶從UI內的變化,一個標誌置位在網站集的RootWeb的屬性集合。定時作業,通過該網站集掃描,並且當它看到這樣的標誌設置,它需要進行從適當的安全上下文中進行必要的修改照顧。

我希望這有助於!

2
class MySett : SPPersistedObject 
{ 
    //... 
    protected override bool HasAdditionalUpdateAccess() { return true; } 
}