本文章是由機器翻譯。

取得控制權

使用 SharePoint 來管理您的 Windows 服務

Pav Cherny

可從 MSDN 程式庫 的程式碼下載
瀏覽線上的程式碼

本文將告訴您:

  • Windows Services 的 SharePoint 整合
  • Windows 服務和執行個體的類別
  • Windows 服務的處理序識別碼型別
  • 啟動和停止服務
本文將使用下列技術:
Windows SharePoint Services

內容

非整合的解決方案原型
與 SharePoint 整合
定義處理序的識別身分
Windows 服務的相依性
加入組態參數
最後的修飾和測試
設定加總

所有的 Windows Server 作業系統嚴重依賴 Windows 服務。這沒有變更,因為 Microsoft 首次引入具有 Microsoft Windows NT 3.1 服務在 1993 並且它可能不會變更在未來作業系統或是。即使 SharePoint 無法 Internet Information Services (IIS) 服務 (SRV) 和 SharePoint 的特定工作的其他服務的 Windows 服務不存在的。您可以利用內建的服務基礎結構,為 Windows SharePoint Services 的計時器 (SPTimerV3) 服務,自訂工作,但是如果您想要廣泛的資料處理、 連續的系統監控、 病毒掃描,網路通訊或代理程式為基礎的備份並還原操作的還是最好建立您自己個別的 Windows 服務。沒有難建置 Windows 服務。Microsoft Visual Studio 2008 會包含在必要的專案] 範本,以取得您開始與您的精靈,則可以實作服務邏輯使用 C / C ++ 以及 Managed 的語言。然而,不為直接與 SharePoint 中整合 Windows 服務。Windows SharePoint Services (WSS) 3.0 軟體開發套件 (SDK) 並未很涵蓋這個主題,、 有任何的精靈,並且您必須確保整合的結果執行不會危及 SharePoint 的安全性。

將在本文中,我會說明您 SharePoint 中整合 Windows Services–based 解決方案。結果可讓您提供、 啟動、 停止,及移除服務執行個體,透過 SharePoint 3.0 Central Administration] 和 [SharePoint 管理物件模型,維護服務設定集中在 SharePoint 組態資料庫中,,並確保在 SharePoint 伺服器陣列中所有的服務執行個體使用相同的安全性帳戶及組態參數。當您變更 SharePoint 中的組態設定時,您可以在伺服陣列中的所有伺服器一致地套用變更。不用說也可能是設定參數,分別為個別的服務執行個體必要。我的範例解決方案我選擇來執行機密作業反白顯示 SharePoint 的特定安全性考量的前端伺服器上。小幫手] 內容會包含原始程式碼,和在不同的階段的依據順序來完成我將討論以下的步驟中編譯檔案。如果您要遵循 [我的說明,在您自己的開發環境中,[小幫手] 資料也包含逐步的工作表。

非整合的解決方案原型

在最佳的作法來開發週期開始收集需求,分層顯示一般的解決方案設計,傳遞代表原型 (Prototype) 的形式證明是概念的。這特別需要較高的權限,在前端伺服器 」 或 「 應用程式伺服器上的安全性顧慮 SharePoint Services 的是。雖然您不需要管理的整合 SharePoint 原型 (Prototype),您原型 (Prototype) 就必須直接從 [開始,以避免複雜的設計問題,稍後處理 SharePoint 安全性相依性。即使看似簡單的解決方案可能會造成複雜的挑戰,在 SharePoint 環境中。

執行個體取得本文的範例方案。它可以解決需求,將合併來自自訂 SharePoint 清單中的前端伺服器的安全性事件記錄檔項目。看似簡單的工作: 解決方案註冊處理常式呼叫 EntryWrittenEventHandler 收到事件告知時作業系統會新增到安全性記錄新項目,然後,如果項目符合指定的篩選條件的準則,例如項目型別等於 FailureAudit] 或 [SuccessAudit,解決方案會加入到自訂的安全性稽核] 清單在 SharePoint 中對應項目本機電腦上事件記錄檔子系統中。沒有難以建置基本的 Windows 服務和自訂的 SharePoint 清單,這樣,但在服務帳戶必須在 SharePoint 網站加入至自訂清單的項目寫入權限] 與 [系統管理權限在本機伺服器上的註冊 EntryWrittenEventHandler — 而且這是在 SharePoint 伺服器安全性問題。

雖然您可以在 SharePoint 網站的應用程式集區帳戶的內容中執行您的 Windows 服務,以滿足 SharePoint 使用權限需求,您必須不是要授與 SharePoint 安全性帳戶的本機系統管理權限。如標題為 TechNet Magazine 1 月 2009 資料行中所述,授與安全性帳戶管理的權限,在前端伺服器上危害 SharePoint 的安全性 」SharePoint 的安全性帳戶."

所以,如何執行您避免提升權限如果您的解決方案必須執行安全性機密作業?一種好的技術是分成多個元件的解決方案,並使用安全的處理序間通訊機制,它們之間。然後,您可以執行 SharePoint 的安全性帳戶的內容中執行的其他元件時,需要在內容中,本機系統 」 帳戶管理的使用權限之元件。Microsoft 會使用這項技術在 SPTimerV3 服務中。SPTimerV3 會沒有系統管理權限,SharePoint 伺服器陣列帳號的 「 在內容中執行,並依賴 Windows SharePoint Services 管理 (SPAdmin) 服務在本機伺服器上執行系統管理工作。SPAdmin 服務會在本機系統帳戶的內容中執行。SPTimerV3 和 SPAdmin 使用處理程序之間的通訊的.NET 遠端處理,但您也可以在只要您在保護通訊) 功能的存取控制清單 (ACL) 使用例如具名管道,在亮權數機制。範例,解決方案中,我使用具名管道的方法。

請看一下 [圖 1 ] 中,整體解決方案架構。在解決方案有賴個別的安全性事件處理常式服務,包含上述 EntryWrittenEventHandler 回呼函式,從本機事件記錄檔的子系統接收通知。本機系統帳戶的內容中執行這項服務。其對應會是安全性事件接收器服務,SharePoint 網站的應用程式集區帳戶,在 [指定的安全性稽核] 清單中建立內容的項目的內容中執行的。當您啟動安全性事件接收者時,服務就會建立安全的具名的管道,將只有本機系統帳戶存取權限的權限授與。安全性事件處理常式服務會使用這個具名的管道,只要在 「 安全性事件記錄項目寫入 「 事件引發,與安全性事件接收者進行通訊。此設計會運作不提高權限的需求而不會危及 SharePoint 的安全性。這是只在更涉及比一般的整合型 Windows 服務架構。

[圖 1 分割設定 SharePoint 解決方案

您可能注意到在範例應用程式的 Microsoft.NET Framework 無法剖析安全性項目的描述。這是不重要這的篇文章的目的但考慮安裝 「 Microsoft 知識庫 」 文件中描述的 Hotfix 」使用 Windows NT 安全性事件記錄檔 API 的應用程式無法在執行 Windows Vista 或 Windows Server 2008 的電腦讀取的事件記錄檔訊息的描述."

與 SharePoint 整合

功能原型 (Prototype) 的傳遞是一個重要的里程碑,另一個是提供適當的管理工具,這是重點的 SharePoint 整合的 Windows Services]。而整合,很難控制已部署的服務執行個體] 或 [在伺服器陣列中的所有伺服器上,確保一致的服務行為。您可以使用整合,SharePoint 3.0 Central Administration,判斷伺服器,執行您的服務,並集中式設定的所有服務執行個體相關的參數。[圖 2 ] 顯示您已完成整合的所有步驟之後應用程式。它看起來一個小型的應用程式,但 SharePoint 整合提供功能完整 SharePoint 解決方案的所有特性。

[圖 2 與 SharePoint 整合

您需要與 SharePoint 中整合 Windows 服務的四個元件的基本上,: 識別服務,一個類別,可讓 SharePoint 來控制個別的服務之類別執行個體,SharePoint 組態中及 SharePoint 方案套件部署這些元件加入這兩個類別的物件的系統管理工具。

根據, [圖 1 ] 中所描述的解決方案架構,有兩個 Windows 服務: 安全性事件處理常式和安全性事件接收器。讓我們在新類別庫專案中建立對應的服務類別。我加入這個專案直接 SecurityAudit 方案我建置了 Visual Studio 中。它稱為 SecurityEventManagement。我在加入 Windows SharePoint Services 的程式庫的參考之後,我會建立一個新的類別,衍生自 SPWindowsService) 類別,為每個 Windows 服務。在初始 SecurityEventReceiverService 類別的實作中,請 SecurityEventHandlerService 類別有相同的結構,,只服務名稱是不同,您會發現如果您的分析小幫手] 內容中的 [步驟 2] 資料夾中的程式碼。

服務類別 (Class) 表示特定的 Windows 服務在 SharePoint 伺服器陣列中。它是一個全域的物件,為所有的服務例項,但也需要類別關聯特定 SharePoint 伺服器上的服務的執行個體。[SharePoint 管理物件模型定義了數個服務的基底類別和它們對應服務執行個體類別。SPWindowsService 類別是 Windows 服務,正確的選擇,且 SPWindowsServiceInstance 類別為服務的執行個體類別,向右的基底類別的因此: SecurityEventReceiverServiceInstance 和 SecurityEventHandlerServiceInstance。再次,類別定義是相當簡單。

現在請讓我告訴您如何建置系統管理工具將服務和服務執行個體的物件加入至 SharePoint 的組態。您可以達成這個目的應用程式的頁面在 SharePoint 3.0 Central Administration,Stsadm.exe 指令副檔名,或任何其他方法,例如透過 Windows PowerShell 的使用。我選擇建立.Stsadm.exe 指令副檔名,因為表示從手邊的工作的一些困擾的低負荷。如有關 Stsadm.exe 指令副檔名的詳細資訊,請參閱 「 」HOW TO: 擴充 STSADM 公用程式."

系統管理工具必須具現化保存服務和服務執行個體的物件。類別的建構函式會顯示如何在物件執行個體化。是值得注意的 SharePoint 服務的類別衍生自 SPPersistedObject 類別。當您呼叫 Update () 方法時,會保存這些物件。同樣地,如果您可以呼叫 delete() 方法之後 de-provisioning,這些物件移除一次。SecurityEventManagement 專案中的 SecurityEventServiceAdministration.cs 程式碼檔案會說明這些步驟。

而且,它 !您現在可以編譯解決方案,並透過 WSS 3.0 方案套件 (wsp) 使用的部署。如詳細說明如何使用 Visual Studio 和 MakeCab.exe 建立方案套件的我建議Andrew Connell 文件如何建立 WSS 方案檔的資訊。也請參閱的小幫手] 內容中的程式碼。

定義處理序的識別身分

SharePoint 整合的簡易性可能會是一個好的意外,不過的直接結果的需要採取充分利用 SharePoint 物件模型。您可以已經提供服務的執行個體,並將在 SharePoint 3.0 的中央管理使用 [管理] 連結 (請參閱 [圖 3 )。舉例來說,您可以啟動和停止安全性事件接收器服務,就安全性事件處理常式服務不一樣容易。這會是大小寫,因為當您按一下 [開始] 連結時,SharePoint 更新服務組態。預設的情況下,SharePoint 會設定在沒有註冊的 EntryWrittenEventHandler 權限在本機服務帳戶的內容中執行服務。因此,安全性事件處理常式服務會失敗。您會需要 hardwire 安全性事件處理常式服務以本機系統帳戶,而且應該會提供選項以提供與所需的應用程式集區帳戶以及安全性事件接收器服務。

[圖 3 3.0 的 SharePoint 管理中心

讓我們先請啟動與安全性事件處理常式服務,因為它直接 hardwire 系統帳戶。只要花三行程式碼在服務的建構函式。第一行將 「 系統 」 帳戶設定服務的處理序識別。其他兩個行會停用認證的部署,並更新,以變更 SharePoint 3.0 Central Administration 中的帳戶資訊時,防止系統管理員的認證。[服務帳戶] 網頁 (_admin/FarmCredentialManagement.aspx) 不再會列出這項服務在 Windows 服務的清單方塊。

public SecurityEventHandlerService(SPFarm spFarm)
       : base(ntServiceName, spFarm)
{
   base.ProcessIdentity.CurrentIdentityType = IdentityType.LocalSystem;
   base.ProcessIdentity.IsCredentialDeploymentEnabled = false;
   base.ProcessIdentity.IsCredentialUpdateEnabled = false;
}

安全性事件接收器服務是稍微複雜一點的因為您必須處理各種不同的安全性帳戶資訊,在提供的服務中。 安全性帳戶可以是網域使用者帳戶使用密碼] 或 [系統帳戶沒有密碼。 當您處理網域使用者帳戶時,請帳戶名稱必須遵循 NetBIOS 名稱慣例,並您應該確認密碼。 在 [我的實作程式碼會設定 [IsCredentialDeploymentEnabled] 和 [IsCredentialUpdateEnabled 屬性,這個類別為 true,讓 SharePoint 系統管理員可以變更 SharePoint 3.0 Central Administration 中的安全性帳戶之後提供的安全性事件接收器服務, 中的。

不用說您也必須擴充系統管理工具提供使用者名稱和密碼 SecurityEventReceiverService 物件。 簽出 SecurityEventServiceAdministration.cs) 檔案,在步驟 3 小幫手] 資料夾中。 它包含到 Stsadm.exe 命令擴充必要的修改。

Windows 服務的相依性

這時候您可以啟動和停止提供的服務執行個體,在 SharePoint 伺服器上以及服務會保留其安全性帳戶。 不過,如果您停止這兩個服務執行個體,並接著嘗試啟動 SecurityEventHandlerService 執行個體,而不需要第一個啟動 SecurityEventReceiverService 執行個體在選取的伺服器上,您遇到的錯誤指出 「 相依性的服務或群組無法啟動 」。 原因是安全性稽核安裝程式設定安全性事件處理常式服務依存於安全性事件接收器服務,以便在服務控制管理員 (SCM) 啟動安全性事件接收器服務自動啟動安全性事件處理常式的服務時)。 不過,SCM 如果其 [啟動類型已停用,並將 SharePoint 啟動類型設定為停用當您停止的服務執行個體時,無法啟動服務。 請考慮變更服務的安裝程式邏輯。 您可以避免這個錯誤,如果您移除所有的相依性和安裝與啟動型別的初始服務設定為停用。 這可確保一致的控制項行為在 SharePoint 3.0 的中央管理。

很棒,以避免吸的錯誤,但原始的相依性存在的。 畢竟,安全性事件處理常式的服務和安全性事件接收器服務互相依賴的正常運作的安全性會稽核解決方案。 如果您啟動,或停止一個您就應該也啟動,或停止其他。 您可以覆寫佈建和 Unprovision 服務執行個體方法,以達到這種行為。 在 SecurityEventReceiverServiceInstance 會嘗試尋找其 SecurityEventHandlerServiceInstance 對應相同的伺服器上的和啟動或停止它除了它自己的執行個體,如果找不到。 程式碼也會示範如何自訂 [開始] 和 [停止動作連結,在使用者,通知系統管理員有關受影響的服務介面中顯示訊息方塊。

如果您分析步驟 4 的小幫手] 資料夾中的原始程式碼時,您會注意到 SecurityEventHandlerServiceInstance 類別內容中不包含覆寫的佈建和 Unprovision 方法。 已足夠啟動和停止服務,透過 SecurityEventReceiverServiceInstance 類別。 而,我在 SecurityEventHandlerServiceInstance 標示系統服務會移除對應的啟動和停止連結隱藏服務可設定服務的清單。 SecurityEventHandlerService 參考是現在只會在服務的在 [伺服器] 頁面上所有檢視中顯示的。 下列程式碼會顯示如何將標記為系統服務服務執行個體:

public overrid  e bool SystemService
{
    get
    {
        return true;
    }
}

加入組態參數

解決方案,現在是 SharePoint 整數部分。 下一個步驟是將相關的組態設定從本機登錄移至 SharePoint 組態資料庫,,以提升跨整個的 SharePoint 伺服陣列的組態的一致性。 所有的服務執行個體都共用相同的組態資料庫。 您只需要修改讀取的參數,從組態資料庫,而不是登錄的 Windows 服務。 如在 WSS 3.0 SDK 中所述,請以維護組態資料庫中的參數,使用 [SPPersistedObject 類別 」 SPPersistedObject 類別 (Microsoft.SharePoint.Administration)."

SPWindowsService 和 SPWindowsServiceInstance 類別衍生自 SPPersistedObject 類別,因此我 SecurityEventReceiverService 和 SecurityEventReceiverServiceInstance 類別。 這表示您可以全域參數為永續性的屬性將直接加入至服務及服務執行個體的類別。 在我的範例,這些是參數 SiteURL、 ListName 和 EventFilter。 SecurityEventReceiverServiceInstance 類別會是正確選擇執行個體特定的參數,但我所有的服務執行個體應該要使用相同設定,因此我擴充 SecurityEventReceiverService 類別的方案中。

若要擷取參數的值中,,您需要存取組態資料庫。 SharePoint 會處理此您如果您保留您的服務處理序識別類別啟用部署認證的 (IsCredentialDeploymentEnabled = true)。 我的安全性事件接收器服務類別,這麼做,但 Windows 服務中必須也知道了如何使用 [服務] 類別。 您可以請注意這項需求的加入至 Visual Studio 專案,包含您的 Windows 服務類別的程式庫參考。 在我的範例中,這是 SecurityEventReceiver 專案。 請確定您標記為公用 SecurityEventReceiverService 類別,以便在 Windows 服務可以使用它,並部署中,全域組件快取 (GAC) 的類別程式庫的組件,您的 SharePoint 方案套件的方式。 您必須部署至 GAC 中,使用陣列的服務集合的 GetValue 方法,來擷取服務物件之前。 以下是存取 SecurityEventReceiverService 類別的組態屬性:

SecurityEventReceiverService EventReceiverService =
    SPFarm.Local.Services.GetValue<SecurityEventReceiverService>(
        SecurityEventReceiverService.ntServiceName);

if (EventReceiverService == null)
    throw new Exception("Unable to locate SecurityEventReceiverService"
                      + " in the local SharePoint farm.");
siteURL = EventReceiverService.SiteURL;
listName = EventReceiverService.ListName;
eventFilter = EventReceiverService.EventFilter;

現在的 Windows 服務可以讀取參數,從組態資料庫,剩餘的工作是設定它們。 許多系統管理員,慣用的選擇是自訂的應用程式頁面,加入至 SharePoint 3.0 Central Administration,並將繫結至在透過 [ManageLink] 屬性的服務,但您也可以使用 Stsadm.exe 指令副檔名或其他方法。 下列程式碼 ManageLink 屬性,加入至 SecurityEventReceiverServiceInstance 類別會使用。

public override SPActionLink ManageLink
{
    get
    {
      return new 
        SPActionLink("SecurityAudit/ManageSecurityAuditSettings.aspx");
    }
}

它會將服務的顯示名稱轉換成超連結,開啟 [_admin/SecurityAudit/ManageSecurityAuditSettings.aspx] 頁面中。 您可以在不同的類別庫,我稱為 ManageSecurityAuditSettings 中,找到 ManageSecurityAuditSettings.aspx 頁面。 如需如何建立自訂應用程式頁面的詳細資訊,請讀取 Ted Pattison 的文件 」 如果要在 Windows SharePoint Services 3.0 中建立的應用程式] 頁面." 請參閱 [步驟 5 的小幫手] 資料夾。

最後的修飾和測試

專案現在是接近完成,除了從完成修飾] 和 [適當的解決方案的測試。 例如,您可能想要變更您在 SharePoint 3.0 的中央管理的服務顯示名稱,因為 SecurityEventManagement.SecurityEventHandlerService 和 SecurityEventManagement.SecurityEventReceiverService 預設名稱不是非常好記的使用者。 不過,您無法達到所要的效果,藉由覆寫 DisplayName 屬性,在您的服務類別中。 顯示名稱而對應到 TypeName 屬性,因此不會依賴 TypeName == GetType().ToString() SharePoint 方案中。

請注意執行的服務和服務個體類別提供 TypeName 屬性因為它繼承自 SPPersistedObject] 類別中,但是 quasi-hierarchical 的關係。 服務執行個體使用其相關聯的服務的名稱,預設。 服務執行個體的類別會繼承自 SPServiceInstance 類別,會傳回在 TypeName 相關聯的服務類別的覆寫的 TypeName 屬性。 不用說您可以在您服務執行個體類別中再次例如變更根據特定條件,以顯示名稱,以表示遺漏重要的元件,覆寫 TypeName 屬性。

SharePoint 術語不一致,它可能是,但不是很難判斷虛擬的方法和屬性不論其名稱的目的。 判斷可用的屬性及方法 Visual Studio,例如 SPWindowsService 基底類別上按一下滑鼠右鍵,以及選取要定義,然後用滑鼠右鍵按一下 SPService,必須定義,等透過整個繼承階層架構。 您可能也會檢查 WSS 3.0 SDK。 不太涵蓋了 SPWindowsService 和 SPWindowsServiceInstance 類別但某些程度 (很有用的類別成員清單 SPWindowsService 成員SPWindowsServiceInstance 成員).

請記住,但是,使用成功的測試,服務的且單一的開發電腦上的服務執行個體實作不是 SharePoint 整合式 Windows Services 的足夠發行準則。 SharePoint 3.0 中央管理處理 Windows 服務相當不同伺服陣列中的遠端電腦上本機比電腦上。 在本機,SharePoint 3.0 Central Administration 所使用的登入 SharePoint Administrator 最有可能是本機系統管理員所有的必要使用權限,在 [服務] 上執行系統管理動作的安全性內容。 遠端,但是,SharePoint 3.0 Central Administration 使用計時器的工作和 SPTimerV3 服務。 如我稍早所述,SPTimerV3 服務的安全性帳戶是無法在本機上管理員在遠端的電腦因此 SPTimerV3 服務使用 SPAdmin 服務執行的本機系統帳戶內容中動作。 在為了確保差異在安全性內容中的不干擾您的 Windows 服務的操作狀態,我建議您完全在至少兩個前端伺服器與執行 SQL Server 在根據嚴格的安全性組態中,在不同的電腦伺服陣列環境中測試您的解決方案," Windows SharePoint Services 安全性帳戶的需求工作表。

設定加總

您需要解決方案設計 」 和 「 當您建立 SharePoint 整合式 Windows Services 的安全性,但指定適當的基礎,請特別注意,實際與 SharePoint 整合相當簡單。 在 SharePoint 的物件模型已經會包含必要的邏輯來佈建、 啟動、 停止,及 unprovision 在 SharePoint 的伺服器隻 C 的本機和遠端伺服器上的服務執行個體。 您必須只定義對應的服務] 和 [服務執行個體的類別] SharePoint 組態中整合您的 Windows 服務。 服務與服務的類別衍生自 SPPersistedObject 類別,這表示您可以使用這些類別,以維護服務參數,而非本機的登錄改善管理性與組態的一致性產生 SharePoint 組態資料庫的直接中的的執行個體。

整體,解決功能完整方案,會出現 SharePoint 緊密整合,必須包含 Windows 服務系統管理工具提供的服務物件,應用程式來延伸 SharePoint 3.0 Central Administration 及 SharePoint 方案套件部署 SharePoint 元件伺服陣列中,除了實際的 Windows 服務中的所有伺服器上的頁面。 Windows 服務是很重要的元件,在 Windows 伺服器上,,而且在 SharePoint 中可用的整合功能,它們可以會假設 「 SharePoint 環境中重要的功能。 如需詳細資訊,請參魷 \ cs6 \ f1 \ cf6 \ lang1024 www.microsoft.com/Sharepoint, msdn2.Microsoft.com/Sharepoint, Windows SharePoint Services SDK 文件blogs.msdn.com/Sharepoint.

Pav Cherny 是 IT 專業人員和作者,專精於 Microsoft 技術,協同作業的整合的通訊)。 他的出版物包含著重於 IT 作業] 及 [系統管理白皮書、 產品的手冊和書籍。 Pav 會是總裁的 Biblioso Corporation,公司的專長於 Managed 文件和當地語系化的服務。