Microsoft Press:使用 Windows PowerShell 執行和自動化伺服器陣列管理工作

 

適用版本: SharePoint Server 2010

上次修改主題的時間: 2017-01-20

本書摘節錄自 Microsoft Press 2010 年 8 月出版的《Microsoft SharePoint 2010 Administrator's Companion》(Microsoft SharePoint 2010 管理員手冊)。

購買此書(可能為英文網頁)

Microsoft SharePoint 2010 管理員手冊(可能為英文網頁) 的這份書摘將探討 SharePoint 2010 管理命令介面,以及如何使用 Windows PowerShell 來完成某些基本管理工作。

作者

Bill English

Bill English 擁有 MCTS、MCT、CTT+、GSEC 認證,是 SharePoint® Server 的 Microsoft® MVP。他經營一家領導性的教育訓練暨顧問公司,著有 10 多本書,並在 Microsoft® Office SharePoint® Conference、Comdex 及其他活動發表演說。

Brian Alderman

Brian Alderman 是電腦資訊系統專家,目前受雇於位在美國明尼蘇達州明尼亞波里聖保羅地區的 Mindsharp。自 1995 年起,他主辦過多項 Microsoft 認證,目前包括:MCT、MCTS for SharePoint、MCITP for SQL Server®、MCSA and MCSE for Windows Server® 以及他的 PMP 認證。他身兼資深技術講師及顧問,在網路、SQL Server 資料庫、SharePoint 技術及專案管理方面,擁有將近 15 年經驗。Brian 之前的著作包括《Windows 2000 Professional》及《SQL Server 2000 Administration》(SQL Server 2000 管理)。他是活躍於「SharePoint 星期六會議」及「SharePoint 最佳作法會議」等 SharePoint 工業會議的演講人。

Mark Ferraz

Mark Ferraz 是 SolutionsMark (www.solutionsmark.com) 總裁,SolutionsMark 是總部設在美國休士頓的顧問公司,專營以 Microsoft SharePoint 產品及技術為基礎之企業平台、解決方案和服務的設計、開發與實作。Mark 身兼資深資訊架構師、企業網路/系統架構師及開發者,擁有 10 年以上的經驗,為全世界最大的數家公司設計、管理和實作複雜的專案。除了是《Microsoft Office SharePoint Server 2007 Best Practices》(Microsoft Office SharePoint Server 2007 最佳作法) 的共同作者,Mark 在「SharePoint 最佳作法會議」及「SharePoint 技術會議」等工業會議,也是個活躍的演講人。

書摘 -- 第 5 章:<使用 Windows PowerShell 來執行及自動化伺服器陣列管理工作>

近兩年來,有些 SharePoint 管理員已經見識到 Windows PowerShell 的力量,並嘗試使用,但是在沒有內建支援的情況下,大部分管理員都覺得它太難了。Microsoft SharePoint Foundation 2010 及 Microsoft SharePoint 2010 現在包含了 Windows PowerShell 與 SharePoint 2010 管理命令介面的原生支援。本章將探討 SharePoint 2010 管理命令介面,以及如何使用 Windows PowerShell 來完成某些基本管理工作。第 12 章<使用 Windows PowerShell 以管理 Search Service 及 FAST Search>透過本章為建置基礎,使用搜尋管理工作及案例。

網路及出版的書籍中,有數量龐大的 Windows PowerShell 相關資訊可供使用。本章的目的不是要教您 Windows PowerShell,而是告訴您如何熟悉 SharePoint 2010 中所採用的新 Windows PowerShell Cmdlet (發音為 command-let)。然而,對 Windows PowerShell 還算是新手的人,本章要從檢閱基本概念開始。

本書摘內容

  • 使用 Windows PowerShell:基本概念

  • 使用 SharePoint 2010 管理命令介面

  • SharePoint 管理工作範例

使用 Windows PowerShell:基本概念

傳統上,要管理裝有 Microsoft 產品的伺服器,需要學習好幾種管理工具,例如以 Microsoft Management Console (MMC) 為基礎的圖形化介面,又稱為 MMC 嵌入式管理單元;許多命令列公用程式;也許還有管理員可使用 VBScript 來接合的 Windows Management Instrumentation (WMI) 提供者或元件物件模型 (COM) 物件。在 SharePoint 2010 發行之前,SharePoint 產品及技術的可用管理員工具數目與其他 Microsoft 產品並無不同。過去管理員需要依賴管理中心網站、SharePoint 產品設定精靈,以及命令列工具 stsadm 和 psconfig。沒有任何一項工具是萬能的。

每項 Microsoft 產品也都有自己的社群,能夠建立或擴充內建工具,讓管理員的生活能夠輕鬆一點。管理員有所需的工具可用,但他們在眾多的來源之間顯得亂無章法。現在一切都改變了,利用 Windows PowerShell,每一項管理工作都可能以指令碼執行或自動化。

Windows PowerShell 的概念植基於 Microsoft 在 2000 年代初期委託進行的研究。Windows PowerShell 原本是以 POSIX 命令介面為基礎 (如 IEEE 1003.2 中所指定,並受 Perl 及 UNIX 命令介面影響),現在則是遠比使用 Windows 命令提示字元 (cmd.exe) 更強大的命令介面及指令碼語言。管理員之所以會喜歡命令列工具,是因為可以將它們批次在一起,以自動執行重複的工作,或是確保一組工作可以完全按照前次執行的方式再度完成。Windows PowerShell Cmdlet 提供管理員這些好處。您仍可使用傳統的工具,但 Windows PowerShell 增加了傳統工具沒有提供的彈性及廣度。

提示

舊版 SharePoint 的社群主導開發案包括 stsadm 的擴充 (發佈於 https://stsadm.codeplex.com/(可能為英文網頁));Windows SharePoint Services 3.0 和 Microsoft Office SharePoint Server 2007 的 Windows PowerShell 指令碼 (可在 https://sharepointpsscripts.codeplex.com/(可能為英文網頁) 找到);以及 CodePlex 專案:Windows SharePoint Services 2.0 和 Microsoft SharePoint Portal Server 2003 的 "PowerShell SharePoint Provider" (可自 https://pssharepoint.codeplex.com/(可能為英文網頁) 取得)。

本節涵蓋下列 Windows PowerShell 主題。

  • Windows PowerShell 2.0 版的新功能

  • 架構

  • 安裝 Windows PowerShell

  • 遠端管理

Windows PowerShell 2.0 的新功能

Windows PowerShell 2.0 提供數項新功能,以及改良自 Windows PowerShell 1.0 的功能,包括

  • 新的 Cmdlet

  • 遠端管理及背景工作

  • Windows PowerShell 整合式指令碼環境 (ISE)

  • Windows PowerShell 偵錯工具

  • 模組

  • 進階功能

  • 交易

  • 可逐步執行的管線

  • 事件

  • 指令碼國際化

  • 線上說明

作為 IT 專業人員,應該會對許多的這些新功能感興趣。例如,可以從您的桌面遠端管理伺服器陣列中的所有伺服器,以及當您對 Windows PowerShell 能夠得心應手時,就可以使用 Windows PowerShell 指令碼語言 (之後可用作 Cmdlet) 來建立您自己的進階功能。在 Windows PowerShell 1.0 中執行這項操作,一定要與開發人員合作,使用程式碼,並將檔案部署到伺服器陣列上。

提示

如需 Windows PowerShell 2.0 新功能的詳細資訊,請參閱<What's New in Windows PowerShell>及 https://zh.wikipedia.org/zh-tw/Windows_PowerShell。如需其他資源,可使用您喜歡的網際網路搜尋引擎,輸入關鍵字「Windows PowerShell 2.0 新功能」或前面列出的功能名稱來進行搜尋。

Windows PowerShell 架構

Windows PowerShell 為什麼會如此重要?Windows PowerShell 指令碼語言是物件導向、建立在 .NET Framework (.NET Framework 3.5 for Windows PowerShell 2.0) 之上,並以 C# (發音為 C-sharp) 程式設計語言為基礎。這可以讓 Windows PowerShell 存取基礎物件模型,以將物件及其值 (屬性) 從一個 Windows PowerShell 命令傳遞至另一個 Windows PowerShell 命令。這表示您幾乎擁有開發人員的力量,但不需要撰寫、編譯及部署程式碼。缺點則是因為太簡單了,而造成安裝中的大災難。

當 Microsoft 產品小組在思考要提供給管理員的工具時,會先將工具建置在 Windows PowerShell 上。因此,隨著 SharePoint 2010 的安裝,自然會有大量的管理工作可以用 Windows PowerShell Cmdlet 來完成,而不需要安裝來自從社群主導開發案的軟體。如果需要任何其他 Cmdlet,您可以使用 Windows PowerShell 指令碼及 Windows PowerShell 2.0 中的「進階函數」功能以建立 Cmdlet,而組織中的開發人員也可以建立新的 Cmdlet。使用 Windows PowerShell 來協助管理 SharePoint 是未來的作法,所以儘快開始學習使用內建 Cmdlet 是很重要的。

一開始使用 Windows PowerShell 可能會有點令人怯步,但是如果您曾經使用過命令提示字元 (cmd.exe),或建立過批次檔,很快就會適應 Windows PowerShell 主控台。事實上,您甚至可以使用 Windows PowerShell 主控台來代替命令提示字元,因為您目前使用的所有命令,例如 dir、cd 和 ping,在 Windows PowerShell 主控台中運作得與在命令提示字元中一樣好。您可能需要用引號來括住命令列參數,才能從 Windows PowerShell 中使用命令,但那大概是您唯一需要做的修改。這樣一來,就不需要使用兩個不同的視窗來完成管理工作了。

注意

依預設,命令提示字元的背景為黑色,但這是可以變更的。在標題列上按一下滑鼠右鍵,然後選取 [內容]。所出現的 [內容] 對話方塊中有四個:[選項]、[字型]、[版面配置] 及 [色彩]。您可以變更字型、背景色彩、視窗大小等等。如需這兩種命令列介面相似處的詳細資訊,請參閱本章稍後的提要欄位標題<命令列捷徑>。

Windows PowerShell 的使用方式有兩種:一種是透過命令列介面,即所謂的 Windows PowerShell 主控台 (powershell.exe),一種是透過 Windows PowerShell 互動式指令碼環境 (ISE) 圖形化介面 (Powershell_ise.exe)。本章將著重在使用 Windows PowerShell 主控台。

提示

以下是 Windows PowerShell 相關資訊的一些資源。

命令列捷徑

您在 Windows PowerShell 主控台中,用於命令提示字元工作的所有相同捷徑。

  • 若要在命令撰寫輸出時暫停顯示,請按 Ctrl+S,然後按 Ctrl+S 恢復顯示,或按 Ctrl+C 終止執行。

  • 依預設,緩衝區中會儲存最多 50 個命令。您可以使用向上及向下鍵來捲動命令,以在緩衝區中移動,輕鬆地執行下一個或上一個命令。

  • 您可以按 F7,以從快顯視窗顯示緩衝的命令。使用方向鍵來選取您要執行的命令,再按 Enter 或按 F9,輸入您要執行的命令號碼,然後按 Enter。

  • 若要從命令列顯示緩衝的命令,您可以輸入所需命令的前幾個字元,然後按 F8。命令列介面會搜尋整個歷程記錄緩衝區,以尋找以您輸入之字元開頭的第一個命令。

  • 使用 Windows PowerShell 命令介面的自動完成功能,永遠都不需要輸入命令的完整名稱。輸入所需命令的前幾個字元,再按 Tab,以依字母順序來循環所有命令及可用的檔名和資料夾,或是按 Shift+Tab,以反向順序循環命令。

  • 若要複製及貼上文字,在命令列介面標題上按一下滑鼠右鍵,按一下 [標記],反白顯示您要複製的文字,然後在視窗標題上再按一下滑鼠右鍵,以將所選取的文字自動複製到剪貼簿中。

  • 命令不區分大小寫,而且可以批次在一起,並放在文字檔中。在命令列視窗中呼叫該檔案,就會執行檔案中的命令。這些文字檔的副檔名包括 .bat, .cmd, .vbs,如果是 Windows PowerShell 的話則為 .ps1。若要在命令視窗外執行這些檔案中的命令,可以從 [執行] 列來呼叫檔案,或是在 Windows 檔案總管中按兩下檔案。

  • 可以將引數傳送到所呼叫的命令檔。傳遞至命令檔的引數會儲存在記憶體中並且可使用變數來存取。您也可以建立變數以儲存完成工作所需的值。在 Windows PowerShell 中,您可以在變數名稱前面加上貨幣符號 ($),以參照變數。

  • 將命令的輸出可以導向至 > 右邊指名的檔案。如果該檔案已存在,這樣會覆寫檔案。若要將輸出重新導向,但要將其附加在檔案後面,請使用 >>。因執行命令而產生的錯誤訊息可重新導向至 2> 右邊指名的檔案;或是使用 2>>,將其附加在檔案後面;或是使用 2>&1,將其傳送到與標準輸出相同的目的地。

  • 您可以在同一行上執行許多命令。在 Windows PowerShell 中,要使用分號字元 (;) 來分隔命令。

  • 若要將一個命令的輸出重新導向成另一個命令的輸入,請用 '|' (又稱為縱線字元) 來分隔命令。例如,dir | sort | more 會顯示現行目錄中的檔案排序清單,一次一頁。在大部分鍵盤上,縱線字元是位在反斜線上方的符號。

  • 別名和捷徑可以替換成一般常用的命令。例如,ForEach-Object Cmdlet 可以替換成 ForEach,甚或是百分比字元 %。問號字元 ? 可以用來代替 Where 或 Where-Object。您也可以使用 Get-Alias 來傳回別名清單。請注意,在指令碼中使用別名會使其難以理解。

  • 在這整本書中,都可以找到這些捷徑的範例。

安裝 Windows PowerShell

執行 Windows 7 或 Windows 2008 R2 或更新版本的電腦,可包含 Windows PowerShell 2.0 及 Windows Remote Management (WinRM) 2.0。如果您要使用 Windows PowerShell,以在本機舊版作業系統或遠端管理電腦,則需要安裝 Windows PowerShell 2.0 及 WinRM 2.0。

安裝 Windows PowerShell 2.0 及 WinRM 2.0

Windows PowerShell 2.0 與 WinRM 2.0 一起的複本,可從 https://support.microsoft.com/kb/968929/zh-tw 下載。請確定您取得的是正確的版本;例如,若您將 SharePoint 安裝在 64 位元版的 Windows Server 2008 上,則需要下載及安裝 Windows 2008 x64 版的 Windows PowerShell 2.0 和 WinRM 2.0。安裝之後,您會在 %SystemRoot%\System32\WindowsPowerShell\v1.0 資料夾中找到 Windows PowerShell ISE 的可執行檔。

注意

如果您將會是 ISE 的重度使用者,請考慮將此程式的捷徑放在工作列上。在 [開始] 功能表上,以滑鼠右鍵按一下 Powershell_ise.exe,然後選取 [釘選到工作列] 或 [釘選到 [開始] 功能表]。

若要在 Windows 2008 R2 上使用 Windows PowerShell ISE,您需要新增 Windows PowerShell ISE 功能。您可以使用 Windows PowerShell 命令或伺服器管理員以新增此功能。安裝 SharePoint 2010 或 SharePoint Foundation 2010 之後,請執行下列步驟:

  • 若是使用 Windows PowerShell,請輸入下列命令。

    Import-Module Servermanager; Add-WindowsFeature "PowerShell-ISE"

  • 若是使用伺服器管理員,請完成下列程序。

    1. 啟動伺服器管理員,按一下 [功能],然後選取 [新增功能]。

    2. 在 [新增功能精靈] 的中間窗格中,選取 [Windows PowerShell 整合式指令碼環境 (ISE)] 的核取方塊 (如圖 5-1 所示),然後按 [下一步]。

安裝 Windows PowerShell

圖 5-1 安裝 Windows PowerShell 整合式指令碼環境 (ISE) 功能

  1. 在 [確認安裝選項] 畫面上,按一下 [安裝]。

  2. 在 [安裝結果] 畫面上,按一下 [關閉]。

在執行原則的範圍內工作

Windows PowerShell 是一個功能強大的工具,就像任何其他指令碼語言,要借用別人的程式碼或是從網際網路下載片段都太容易了。此外,由於程式碼檔案只是文字檔,所以任何人都可以輕易修改,並插入惡意程式碼。因此,Windows PowerShell 有一個叫做執行原則的內建安全性功能,可讓您依據個別使用者來設定,而且這些設定會儲存在登錄中。若要檢視執行原則,請在 Microsoft SharePoint 2010 管理命令介面中輸入下列命令。

如果您是在 SharePoint 伺服器上執行管理命令介面,則這種命令的輸出有可能是 RemoteSigned,意思就是您可以用互動的方式執行任何命令,並可使用儲存在您登入之電腦上的任何指令碼。然而,如果您要從遠端來源執行設定檔或指令碼,則需將其簽署。如果您是以管理員身分啟動 Windows PowerShell 主控台,並使用 Set-ExecutionPolicy Cmdlet,則可變更執行原則,否則您可以用下列方式來變更登錄機碼。

HKLM\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

安全性提示Security Note
與 Active Directory 群組原則搭配時,登錄機碼會很好用。請避免手動修改登錄,尤其是當 Microsoft 提供 Cmdlet 來設定 Windows PowerShell 執行原則時。

若要簽署指令碼,請使用 Set-AuthenticodeSignature Cmdlet,它可用來將 Authenticode 簽章新增至 Windows PowerShell 指令碼或其他檔案。

在擁有多個環境 (例如開發、系統整合、使用者接受度測試 (UAT)、實際執行前及實際執行) 的組織中,請考量在實際執行及 UAT 伺服器陣列上簽署程式碼的最小需求。您也應該要檢閱這些伺服器陣列的執行原則設定。您可以在以使用者或電腦為目標的群組原則物件中,設定執行原則,這樣一來,當有人登入您的 SharePoint 伺服器時,才不會將執行原則覆寫。

提示

如需 Windows PowerShell 執行原則及簽署指令碼的詳細資訊,請參閱 TechNet 文章<阻隔惡意程式碼>(位於 https://technet.microsoft.com/zh-tw/magazine/2008.01.powershell.aspx),或是在 Windows PowerShell 命令列介面中輸入 Get-Help about_Execution_Policies。還有一篇部落格文章也有詳細說明此程序。那就是<ALLSigned:簽署 PowerShell 指令碼>,網址為 https://sharepoint.microsoft.com/blogs/zach/Lists/Posts/Post.aspx?ID=53(可能為英文網頁)

注意

如果您是使用 Windows 7 來作為桌面,並想要從遠端管理 SharePoint 伺服器的 Windows Server 2008 R2,則需要遠端伺服器管理工具 (RSAT),它是新 [群組原則] 功能的必要項目,可支援 Windows PowerShell。您可以從 Microsoft 下載中心取得 RSAT,網址為 https://www.microsoft.com/downloads/zh-tw/default.aspx。如需詳細資訊,請至 https://technet.microsoft.com/zh-tw/library/dd367853(ws.10).aspxhttp://trycatch.be/blogs/roggenk/archive/2009/06/08/installing-windows-7-rsat-unattended.aspx(可能為英文網頁)

使用 WinRM 從遠端管理系統

Windows PowerShell 2.0 採用的一項新功能,可利用 WinRM 或 Internet Information Server (IIS),從您的桌面對系統進行遠端管理。WinRM 通常是管理員及本節主旨所使用的機制。遠端管理所牽涉到的不只是使用幾個可讓您將電腦名稱指定為選用參數的命令,以在您電腦本機上執行 Windows PowerShell 的能力;它還包含了名為收合傳送與展開傳送遠端處理以及背景工作的方法。

  • 收合傳送遠端處理 此方法可以讓許多管理員連線至在相同遠端伺服器上執行的 Windows PowerShell 執行個體 (這並不是 SharePoint 2010 中現成的支援方法)。

  • 展開傳送遠端處理 此方法可讓您傳送單一 Windows PowerShell 命令,以平行執行多個 Windows PowerShell 遠端執行個體,而且那些命令的結果會傳回至您的桌面。如果您需要在多部伺服器上完成相同的工作,就會使用此方法。您再也不需要輪流建立遠端桌面連線至每一部伺服器,然後在該伺服器本機上執行命令。您可以建立一組 Windows PowerShell 命令,再將伺服器名稱傳遞給那些命令,這樣就會針對您提供名稱的每部伺服器,連續完成相同的命令。

  • 背景工作 Windows PowerShell 2.0 可支援本機和遠端背景工作。這些工作是在背景非同步執行且無互動的命令。當您在背景執行命令時,會立即傳回命令提示字元,以讓您繼續執行其他命令。

設定 WinRM

您的本機電腦以及要從遠端執行命令的伺服器上,都必須啟動和設定 WinRM Windows 服務,才能進行遠端處理。若想知道您的伺服器是否執行 WinRM,請輸入

Get-service winrm

若要檢查遠端伺服器上是否執行 WinRM,請輸入

Get-service winrm -computername $server_name

在 SharePoint 伺服器上,應該會執行此服務;然而,如果您的本機電腦是執行 Windows 7 (或是已安裝 Windows PowerShell 2.0 和 WinRM 2.0 的 Windows Vista),則可能需要啟動此服務並啟用遠端處理。若要進行此操作,可以輸入一個命令:Enable-PSRemoting,它會執行其他兩個命令:WSManQuickConfig 和 Start-Service WinRM。

重要

如果其中一個網路連線類型是「公用」,則 Set-WSManQuickConfig 命令會提出「無效的作業例外狀況」。您需要將網路連線變更為「網域」或「私人」網路類型,才能繼續進行。

Enable-PSRemoting 命令的輸出看起來類似下列範例。

WinRM Quick Configuration
Running command "Set-WSManQuickConfig" to enable this machine for remote management
through WinRM service.
 This includes:
    1. Starting or restarting (if already started) the WinRM service
    2. Setting the WinRM service type to auto start
    3. Creating a listener to accept requests on any IP address
    4. Enabling firewall exception for WS-Management traffic (for http only).

Do you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default
is "Y"): y
WinRM has been updated to receive requests.
WinRM service type changed successfully.
WinRM service started.
Configured LocalAccountTokenFilterPolicy to grant administrative rights remotely to local users.
WinRM has been updated for remote management.
Created a WinRM listener on HTTP://* to accept WS-Man requests to any IP on this machine.
WinRM firewall exception enabled.

在執行 64 位元版 Windows 的電腦上,您可能會看到另一個確認訊息。

Are you sure you want to perform this action?
Performing operation "Registering session configuration" on Target "Session
configuration "Microsoft.PowerShell32" is not found. Running command
"Register-PSSessionConfiguration Microsoft.PowerShell32 -processorarchitecture x86 
-force" to create "Microsoft.PowerShell32" session configuration. This will restart
WinRM service.".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

若要判定 WinRM 的設定方式、驗證方法,以及它要存取的連接埠號碼,請使用下列命令。

winrm get winrm/config/service

這應該會產生類似下列的輸出。

Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GWGX;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 15
    EnumerationTimeoutms = 60000
    MaxConnections = 25
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = false
    Auth
        Basic = false
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint

您可以從 Windows PowerShell 主控台或 SharePoint 2010 管理命令介面執行 winrm 和與 winrm 相關的命令,例如 New-PSSession 命令。但是必須以管理員身分來執行這些命令。若要執行這項操作,請在 Windows PowerShell 主控台或 SharePoint 2010 管理命令介面上按一下滑鼠右鍵,然後選取 [以系統管理員身分執行]。您必須是遠端機器上的系統管理員群組的成員,或是能夠提供管理員認證,才能執行這項操作。

注意

當本機電腦和遠端電腦位在不同的非信任網域,或是在工作群組中,就需要額外的步驟來設定遠端處理。當 SharePoint Foundation 是為了外部共同作業而安裝,或是安裝在小型商業環境,而不是在一般的 SharePoint Server 安裝中,就有可能會發生工作群組案例。如需如何在兩台工作群組機器之間設定遠端處理的詳細資訊,請參閱此部落格文章:https://blogs.msdn.com/wmi/archive/2009/07/24/powershell-remoting-between-two-workgroup-machines.aspx(可能為英文網頁)

符合 SharePoint PowerShell 遠端處理的需求

若要在遠端機器上使用 WinRM 來執行 SharePoint PowerShell Cmdlet,還有另外幾項需求。

  1. 您必須能夠存取具有可執行那些命令之正確權限的使用者識別碼。無論您是要對伺服器進行遠端處理,還是要在本機執行 SharePoint Cmdlet,都適用這些需求。使用者識別碼必須符合下列準則。

    • 必須是執行命令之機器上的 WSS_ADM_WGP 本機安全性群組成員。

    • 必須是設定資料庫的 SharePoint_Shell_Access SQL Server 角色成員。

    • 必須能夠存取您要操作的內容資料庫。

    您可以使用 SPShellAdmin Cmdlet 來協助您管理這些需求。當您執行 Add-SPShellAdmin Cmdlet 來新增使用者識別碼至 SharePoint_Shell_Admin 角色時,您必須對應至 SQL 執行個體上的 Security_Admin 角色,以及相關資料庫的 db_owner 角色。您必須針對以該使用者識別碼存取的每一個內容資料庫,執行 Add-SPShellAdmin Cmdlet。

  2. 指定伺服器陣列中的一部伺服器,以作為一律用來進行遠端處理的伺服器。在該伺服器上,將 WinRM 設定選項 MaxMemoryPerShellDB 增加至較大的值 512 或 1024。此設定選項會限制單一遠端程序可以使用的記憶體數量。增加此值可讓執行時間長的命令順利執行,而不會發生 OutOfMemory 例外狀況錯誤。用來顯示設定選項值及範例輸出的命令如這裡所示。

    winrm get winrm/config/winrs

    Winrs
        AllowRemoteShellAccess = true
        IdleTimeout = 180000
        MaxConcurrentUsers = 5
        MaxShellRunTime = 2147483647
        MaxProcessesPerShell = 15
        MaxMemoryPerShellMB = 150
        MaxShellsPerUser = 5
     Winrs    AllowRemoteShellAccess = true    IdleTimeout = 180000    MaxConcurrentUsers = 5    MaxShellRunTime = 2147483647    MaxProcessesPerShell = 15    MaxMemoryPerShellMB = 150    MaxShellsPerUser = 5
    

    若要修改 MaxMemoryPerShellDB 設定,請在 SharePoint 2010 管理命令介面中輸入下列 Windows PowerShell 命令。

    Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024

  3. 您必須使用認證安全性提供者 (CredSSP) 驗證。此驗證機制 (隨 Windows Vista 導入) 可讓應用程式將認證從一台機器委派至另一台機器,這叫做雙躍點程序。如此可讓您提供認證,讓 SharePoint PowerShell Cmdlet 能夠傳達給主控 SharePoint 資料庫的 Microsoft SQL Server。如果您不使用 CredSSP,並嘗試從遠端執行 SharePoint Cmdlet,可能會收到表示無法使用伺服器陣列的訊息。在先前顯示之 Winrm get winrm/config/service 命令的輸出中,請注意 CredSSP 等於 False。修改 WinRM 設定選項的方式有好幾種,包括群組原則、登入指令檔及命令提示字元。若要在所有命令列介面中啟用 CredSSP 驗證,請完成下列工作。

    1. 在執行遠端處理的電腦上,例如 Windows 7 桌面,輸入下列命令,其中 Web1 是 SharePoint 伺服器。在提示您確認啟用 CredSSP 驗證時,請輸入 Y。

      Enable-WSManCredSSP -role client -DelegateComputer Web1

    2. 在您從遠端連線的 SharePoint 伺服器上,輸入

      Enable-WSManCredSSP -role server

    提示

    如需 WinRM 中多躍點支援的詳細資訊,請參閱 https://msdn.microsoft.com/zh-tw/library/ee309365(VS.85).aspx(可能為英文網頁)

使用 WinRM 遠端處理

在啟動遠端工作階段,以從遠端管理 SharePoint 伺服器陣列或單一特定 SharePoint 伺服器時,所需的命令類似下列範例中的命令。

$cred = Get-Credential contoso\spfarm
$sess = New-PSSession Web1 -Authentication CredSSP -Credential $cred
Invoke-Command -Session $sess -ScriptBlock '
   {ADD-PSSnapin Microsoft.SharePoint.PowerShell;}
安全性提示Security Note
若要限制使用者可以在遠端工作階段期間存取的 Windows PowerShell 命令,您可以使用 -ConfigurationName 參數搭配 New-PSSession Cmdlet,或是使用 Proxy Cmdlet。如需詳細資訊,請參閱部落格文章<使用 Proxy 來擴充及/或修改命令>,網址為 https://blogs.msdn.com/powershell/archive/2009/01/04/extending-and-or-modifing-commands-with-proxies.aspx(可能為英文網頁)

當您輸入第一個命令時,會出現一個對話方塊,您必須在裡面輸入密碼。此密碼和使用者名稱儲存在 $Cred 變數中,在第二個命令 New-PSSession 中會用到,此命令會與遠端伺服器建立永久性工作階段。使用 Windows PowerShell 遠端處理時,建立永久性工作階段並非必要,但是如果您沒有建立永久性連線,每當您呼叫含有 SharePoint Cmdlet 的遠端命令時,每個 Invoke-Command 也都需要包含 PSSnapin Cmdlet。第三個命令 Invoke-Command PSSnapin 可讓您在遠端伺服器上執行 SharePoint PowerShell Cmdlet。

永久性工作階段的參照儲存在變數 $sess 中。您可以使用此變數,將您想要的任何命令導向該遠端伺服器。在下列範例中,Cmdlet Get-SPServiceInstance 會在指令碼區塊 (大括弧 ({ }) 之間的區域) 中輸入。Get-SPServiceInstance Cmdlet 的輸出會傳回 SharePoint 伺服器陣列中的服務狀態。

Invoke-Command -Session $s -ScriptBlock {get-SPServiceInstance}

WARNING: column "PSComputerName" does not fit into the display and was removed.

TypeName                         Status   Id
--------                         ------   --
Business Data Connectivity       Online   3ad4d004-9ae3-4810-94bf-76cc43c9d507
Microsoft SharePoint Foundati... Online   81cc6474-fd6f-42ad-a932-25d67cff8cc1
Microsoft SharePoint Foundati... Disabled cb3b976c-b451-4abe-b808-0c6d191ccd3d
Microsoft SharePoint Foundati... Online   5bac9c93-483a-4901-ae46-f6f7ae0a12a8
Central Administration           Online   0c24457f-b58e-4daa-895e-4acd35ef7543
Microsoft SharePoint Foundati... Online   155570fa-0d4c-495d-9f31-5250e83bdd75
Microsoft SharePoint Foundati... Disabled c25ae170-c07d-48db-97b3-73b0d9b47e94
SharePoint Foundation Help Se... Online   8af8b8b1-92cb-48d2-8864-20a7e191d7c2

重要

您可以在指令碼區塊中輸入多個命令,可以在不同行輸入,也可以輸入在同一行上並用分號 (;) 隔開。如果在指令碼區塊中只輸入一個命令,則分號為選用性,但加入分號是個好習慣。您也可以使用本機變數來產生遠端指令碼區塊,如下列範例所示。

$url = "https://contoso.com"
$myscript = "get-spsite $url"
$sb = [scriptblock]::Create($myscript)
Invoke-Command $sess -ScriptBlock $sb

您可以使用 Windows PowerShell Invoke-Command Cmdlet,從您的桌面來與相同伺服器或不同伺服器上的許多工作階段通訊。此 Cmdlet 可讓您同時啟動多項管理工作,然後平行執行。然而,如果這些工作的執行時間很長,就要等到遠端機器上的命令完成,您才能取回控制權。這就是所謂的以互動方式執行命令。若要當作背景工作非同步執行,讓 Windows PowerShell 提示立即傳回,而您可以輸入其他命令,請在 Invoke-Command 後面附加 -AsJob 參數,或是使用 Start-Job Cmdlet。與連續執行命令相較,使用這項技巧可以減少完成管理工作的時間。這項技巧可以為您節省大量時間的例子之一,是在升級程序期間,每個工作階段都會執行 database-attach-upgrade,而完成所有資料庫升級所需的時間,僅受限於 SQL Server 的資源。

如果您在特定的伺服器上有許多執行時間短的工作,而且不想一直輸入 Invoke-Command,請使用下列其中一種方法。

  • 您可以輸入 Enter-PSSession $sess,進入與該伺服器的互動工作階段。命令提示字元會從 PS C:\Users\<使用者識別碼> (其中 <使用者識別碼> 是現行使用者的名稱) 變更為 [<遠端伺服器名稱>]: PS C:\Users\<遠端認證>\Documents (其中 <遠端認證> 是您用於 CredSSP 驗證的使用者識別碼)。命令提示字元會提醒您目前正在提交命令至遠端伺服器。若要回到本機電腦上的互動模式,請輸入 Exit-PSSession 或結束。

  • 使用 Import-PSSession 遠端處理 Cmdlet (又稱為隱含式遠端處理),將命令從遠端工作階段帶入本機 Windows PowerShell 工作階段。Import-PSSession 方法的另一項優點,就是您可以和本機檔案系統互動,並與 SharePoint 對話,就好像您在 SharePoint 伺服器本機登入一樣。依預設,Import-PSSession Cmdlet 會匯入所有命令,但名稱與現行工作階段中之命令相同的命令除外。您也可以匯入命令子集,並且前置您指定的單字,讓您自己可以很清楚地分辨哪些命令是本機,哪些是遠端。在下列範例中,會新增 Remote 這個字作為所有 SPSite Cmdlet 的前置字元。

    Import-PSSession -session $sess -CommandName *-spsite -Prefix Remote

    M ModuleType Name                      ExportedCommands                          
    ---------- ----                      ----------------                          
    Script     tmp_1833f7bc-b269-4229... {Set-SPSite, Backup-SPSite, Get-SPSite,...
    

    在此範例中,您可以使用所有 SPSite Cmdlet,就好像它們是本機命令一樣;例如,輸入 Get-RemoteSPSite 時,您可以傳回符合給定準則的所有網站集合。這些匯入的命令會儲存在暫時的模組中,工作階段結束時就會刪除。若要建立永久性的模組,以供未來的工作階段使用,請使用 Export-PSSession Cmdlet。匯入的命令仍會在其匯入來源的遠端工作階段中執行,因此,執行的時間可能會比本機命令長。

當您完成所有工作,可以輸入 Remove-PSSession $sess,以刪除本機電腦與遠端電腦之間的永久性連線。

提示

如需 Windows PowerShell 遠端處理的詳細資訊,請參閱《Windows PowerShell 2.0, Administrator's Pocket Consultant》(Windows PowerShell 2.0,管理員的口袋顧問) (作者:William Stanek,Microsoft Press 2009 年出版) 的第 4 章<使用工作階段、工作及遠端處理>,以及 TechNet Magazine 的文章<一窺 2.0 版中的遠端管理>,網址為 https://technet.microsoft.com/zh-tw/magazine/2008.08.windowspowershell.aspx。另外,也請看一下落格文章<一些好用的 WS-MAN (WinRM) 命令>,網址為 https://blogs.technet.com/otto/archive/2007/02/09/sample-vista-ws-man-winrm-commands.aspx(可能為英文網頁)

使用 SharePoint 2010 管理命令介面

若要開啟 SharePoint 2010 管理命令介面,請按一下 [開始],然後依序選取 [程式集]、[Microsoft SharePoint 2010 產品] 及 [SharePoint 2010 管理命令介面],如圖 5-2 所示。

啟動 Windows PowerShell

圖 5-2 存取 SharePoint 2010 管理命令介面

SharePoint 2010 管理命令介面是自訂的主控台;它和您開啟預設 Windows PowerShell 主控台 (通常放在工作列上的捷徑) 時所開啟的主控台不同。在檢閱 SharePoint 2010 管理命令介面捷徑的屬性時,會公開所執行的命令。

C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe  -NoExit  " &
   ' C:\Program Files\Common Files\Microsoft Shared\Web Server 
   Extensions\14\CONFIG\POWERSHELL\Registration\\sharepoint.ps1 ' "

捷徑會指向 Sharepoint.ps1 檔。這是 Windows PowerShell 設定檔的範例,與任何其他 Windows PowerShell 指令碼檔案相同,並可用來儲存需要在 Windows PowerShell 工作階段開始時自動載入的常用元素。因此,就像一般指令碼檔案一樣,設定檔可以包含功能、別名和變數,並可載入您可能需要的任何 Windows PowerShell 擴充、嵌入式管理單元或模組。Windows PowerShell 嵌入式管理單元 (PSSnapin) 是編譯至 DLL 檔中的 .NET 程式,其包含新的 Cmdlet、功能及/或提供者。Windows PowerShell 附有一些嵌入式管理單元,包括 Microsoft.PowerShell.Core、Microsoft.PowerShell.Host 和 Microsoft.PowerShell.WSMan.Management,以及 ActiveDirectory、FailoverClusters 和 WebAdministration 之類的模組。就像其他產品會安裝在您的電腦上一樣,附加的擴充也可供使用。

SharePoint 設定檔的主要目的,是要載入 Windows PowerShell for SharePoint 嵌入式管理單元,讓您能夠使用 SharePoint 特有的新 Cmdlet。SharePoint 設定檔包含下列程式碼,加上簽章。

$ver = $host | select version
if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}
Add-PsSnapin Microsoft.SharePoint.PowerShell
Set-location $home

此程式碼會取得 Windows PowerShell 的版本、確定其大於 1,如果沒錯,就會設定執行緒模型,讓第一個執行緒能夠重複使用、載入 SharePoint PowerShell 嵌入式管理單元,然後將目錄變更為主資料夾,例如 C:\users\<使用者識別碼>,其中使用者識別碼是目前登入的人員。如需 SharePoint、Windows PowerShell 和執行緒的詳細資訊,請參閱本章稍後的提要欄位標題<使用 Windows PowerShell 時的記憶體考量>。

SharePoint PowerShell 嵌入式管理單元並不是載入 SharePoint 2010 管理命令介面中的唯一嵌入式管理單元。因此,您不僅可以使用 SharePoint Cmdlet,還可以從載入的嵌入式管理單元中使用其他 Cmdlet。若要查看所有嵌入式管理單元,以及其載入順序,請輸入 Get-PSSnapin。您的輸出看起來應該會類似下列範例。

Name        : Microsoft.PowerShell.Diagnostics
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains Windows Eventing and
              Performance Counter cmdlets.

Name        : Microsoft.WSMan.Management
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains cmdlets (such as 
              Get-WSManInstance and Set-WSManInstance) that are used by the
              Windows PowerShell host to manage WSMan operations.

Name        : Microsoft.PowerShell.Core
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains cmdlets used to manage
              components of WindowsPowerShell.

Name        : Microsoft.PowerShell.Utility
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains utility Cmdlets used to
              manipulate data.

Name        : Microsoft.PowerShell.Host
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains cmdlets (such as Start-
              Transcript and Stop-Transcript) that are provided for use with the
              Windows PowerShell console host.

Name        : Microsoft.PowerShell.Management
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains management cmdlets used to
              manage Windows components.

Name        : Microsoft.PowerShell.Security
PSVersion   : 2.0
Description : This Windows PowerShell snap-in contains cmdlets to manage Windows
              PowerShell security.

Name        : Microsoft.SharePoint.PowerShell
PSVersion   : 1.0
Description : Register all administration Cmdlets for Microsoft SharePoint Server.

注意

如果您開發自己的指令碼,可從命令提示字元、或是在 Windows 檔案總管中按兩下檔案以呼叫,而且那些指令碼包含 Windows PowerShell for SharePoint 命令,請務必包含該命令來設定執行緒模型,並將 Windows PowerShell for SharePoint 嵌入式管理單元載入您的指令碼中。從 Windows PowerShell 主控台中呼叫指令碼時,您可以使用指令碼頂端的 #requires 標記。

真實世界:自訂您的主控台

一般作法是在指定的管理員機器上修改設定檔。可將設定檔更改,使其

  • 包含組織或部門中所有 IT 專業人員使用的所有嵌入式管理單元或模組。

  • 追蹤已執行的所有 Windows PowerShell 命令。

  • 變更提示以表示伺服器名字。在擁有許多伺服器的組織中,很容易就會在錯誤的伺服器上開始管理工作,所以只要是能夠幫助管理員識別其工作所在的伺服器,都是很有用的,例如設定視窗標題來列出伺服器名稱。

自訂設定檔範例可包含下列程式碼。

<# ***********************************************************
 Copyright (c)2010, Contoso, All Rights Reserved

*********************************************************** Contoso PowerShell Profile - ContosoProfile.ps1 Author: Peter Connelly Purpose: This profile sets the PowerShell window size, font and title and loads the SharePoint snap-in History: Version 1.0 01/02/2010 First version #> # Track all Windows PowerShell commands $profilename = $MyInvocation.MyCommand.Name $profilepath = $MyInvocation.MyCommand.Path $transcriptFile = "C:\Contoso\Logs\Powershell_$profilename.log" Start-Transcript $transcriptFile -append -force Write-Output "Starting profile: $profilepath"

# Command from SharePoint Server 2010 profile file - SharePoint.ps1
$ver = $host | select version
if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}
Add-PsSnapin Microsoft.SharePoint.PowerShell
Set-location $home

# Check that this is a command-line interface and not the ISE
if ($host.name -eq "ConsoleHost")
{
  $width = 80
  $sizeWindow = new-object System.Management.Automation.Host.Size $width,40
  $sizeBuffer = new-object System.Management.Automation.Host.Size $width,9999
  <# Check to adhere to the following rules:
  The buffer width can't be resized to be narrower than the window's current 
  width plus the window's width can't be resized to be wider than the 
  buffer's current width. #>
  $S = $Host.UI.RawUI
  if ($s.WindowSize.width -gt $width)
  {
        $s.WindowSize = $sizeWindow
        $s.BufferSize = $sizeBuffer
  } else {
        $s.BufferSize = $sizeBuffer
        $s.WindowSize = $sizeWindow
  }
}
# Set foreground, background color and window title
$s.ForegroundColor = "Yellow";$s.BackgroundColor = "DarkBlue";
$s.WindowTitle = "$env:computername"
# #############################################################
# End of ContosoProfile.ps1
# #############################################################

由於每次當您執行 SharePoint 2010 管理命令介面時,就會自動執行設定檔指令碼,所以應簽署設定檔指令碼。如需自訂主控的詳細資訊,請參閱 https://technet.microsoft.com/zh-tw/library/ee156814.aspx(可能為英文網頁)

了解 Cmdlet

Window PowerShell Cmdlet 是建置在應用程式介面頂端的公用程式,若是在 SharePoint 2010、SharePoint 物件模組及 SharePoint Web 服務中,則是可讓管理員完成許多工作的公用程式。

一般而言,Cmdlet 是使用「動詞-名詞」配對。名詞指定您要取得其相關資訊的物件,或是您要操作的物件,而動詞是描述您要對該物件做的事。動詞與名詞之間一律以不含空格的連字號隔開,而 SharePoint Cmdlet 動詞有前置詞 SP。例如,若您想要取得 (動詞) 伺服器陣列中所有內容資料庫 (名詞) 的相關資訊,您就會使用下列 SharePoint Cmdlet,而您會得到所顯示的輸出。

PS C:\Users\Peter> Get-SPContentDatabase

Id               : a1d5c96c-a41a-43b3-bc5d-3f8a93b26046
Name             : WSS_Content_a2fde53006e04bf5aae434ffd3c8a19c
WebApplication   : SPWebApplication Name=SharePoint - 80
Server           : SQL
CurrentSiteCount : 1

Id               : 363b11a3-6947-42f6-9df4-665eeff59c83
Name             : SPF_TeamsDB
WebApplication   : SPWebApplication Name=SPF_Teams
Server           : SQL
CurrentSiteCount : 1

Windows PowerShell 也有提供幾個 Cmdlet,可協助您使用其他 Cmdlet。其中兩個範例為 Get-Command (可簡寫成 gcm) 及 Get-Help (可簡寫成 help) (Cmdlet 的簡寫名稱就叫做別名)。Get-Command 可讓您尋找 Cmdlet,然後 Get-Help 可提供您 Cmdlet 擷取之後的基本資訊。(您將會在本章稍後的<取得說明>一節中,看到如何使用 Get-Help Cmdlet。) 在下列範例中,Get-Command 會尋找與 SharePoint 相關聯的所有 Cmdlet。

PS C:\Users\Peter>Get-Command -PSSnapin "Microsoft.SharePoint.PowerShell" |
>>sort noun, verb |Format-Wide -Column 3
>><ENTER>

注意

當您輸入單行 Windows PowerShell 指令碼,或是您尚未提供所有必要參數時,Windows PowerShell 會提示您提供參數,或是以 >> 起始新的一行,讓您可以輸入更多命令。當您完成輸入時,請按 Enter,讓 Windows PowerShell 執行程式碼。因為頁面大小限制的關係,本章中有許多命令雖然顯示成數行,但可以輸入在同一行,所以請切記,只有要執行指令碼時,才按 Enter。

先前顯示的命令集取用 Get-Command cmdlet 的輸出,並將其輸送至 sort Cmdlet。sort Cmdlet 會以先名詞後動詞的順序來將資料排序,讓操作相同物件的所有 SharePoint Cmdlet 都列示在一起。然後操作相同物件的 Cmdlet 會依動詞順序排序。為了減少 SharePoint 2010 管理命令介面中所需的捲動數量,所排序的資料會輸送至整個格式的 Cmdlet。這樣的 Windows PowerShell Cmdlet 組合相當常見。命令集的輸出類似下列範例。

Start-SPAdminJob           Get-SPAlternateURL         New-SPAlternateURL
Remove-SPAlternateURL      Set-SPAlternateURL         Install-SPApplicationC...
Start-SPAssignment         Stop-SPAssignment          Get-SPAuthenticationPr...
New-SPAuthenticationPro... Get-SPBackupHistory        Move-SPBlobStorageLoca...
Get-SPBrowserCustomerEx... Set-SPBrowserCustomerEx... Copy-SPBusinessDataCat...
.....(not all output shown)
Set-SPWebApplicationHtt... Get-SPWebPartPack          Install-SPWebPartPack
Uninstall-SPWebPartPack    Get-SPWebTemplate          Install-SPWebTemplate
Set-SPWebTemplate          Uninstall-SPWebTemplate    Get-SPWorkflowConfig
Set-SPWorkflowConfig

注意

還有另一個類似 Get-Command 的 Cmdlet 可協助您使用 Cmdlet,而且您會覺得它很好用,尤其是您在建立自己的命令或指令碼時。它是 Measure-Command Cmdlet。此命令可讓您測量執行 Cmdlets 或指令碼所花費的時間。您可能也會覺得 Trace-Command Cmdlet 對短指令碼區塊偵錯很有用。

使用物件

SharePoint 中有大量的物件可供使用,而且如您所預期的,SharePoint Server 中的可用物件比 SharePoint Foundation 多。透過閱讀本書,您可能已經判定這些物件之間的關係。例如,SharePoint 伺服器陣列可以包含許多 Web 應用程式,而每個 SharePoint 伺服器陣列各有一個設定資料庫。許多 SharePoint Cmdlet 使用您可以輕易識別的名稱,以便判定其將操作的物件。舉例來說,SPFarm Cmdlet 可讓您擷取 SharePoint 伺服器陣列的相關資訊,以及備份或還原 SharePoint 伺服器陣列。例如,SPFarmConfig Cmdlet 可讓您擷取及設定伺服器陣列的屬性。

然而,有少數 Cmdlet 名稱可能會讓您混淆。例如,SPSite Cmdlet 可讓您操作網站集合,而第 2 章<了解 SharePoint 2010 的架構>說明除非您有 Web 應用程式,否則無法建立網站集合,意思就是要使用 SPWebApplication 物件。建立網站集合之後,您要選擇網站範本來建立網站。在 SharePoint 物件模型中,此網站 (site) 是指 web 而不是 site;因此,該物件命名為 SPWeb。這會相當混淆,因為 "website" (網站) 這個詞常會縮寫成 "site",而在 SharePoint 物件模型中,"site collection" (網站集合) 也縮寫成 "site"。因為這個專門用語已經延用了很多版的 SharePoint,而開發人員也都是這麼用,所以 IT 專業人員比較容易採納這種用法。

  • web 是網站 (website),並可使用 SPWeb 物件來操作。

  • 網站集合 (site collection) 包含 web 的集合,並可使用 SPSite 物件來操作。

圖 5-3 顯示最常見的物件及其關係,但還有其他的,例如 SPSiteCollection,是 SPSite 的集合。

目前選取的內建 Cmdlet 並沒有完全包含所有 SharePoint 物件,但是您可以撰寫新的 Cmdlet 來操作這些物件。若要判定與 SharePoint PowerShell Cmdlet 相關聯的物件,以及每個物件的 Cmdlet 數,請使用下列範例中的命令,其中有顯示部分輸出。

PS C:\Users\peter> Get-Command -PSSnapin "Microsoft.SharePoint.PowerShell" |
>>sort noun, verb | group-object -property noun
>><ENTER>

Count Name                      Group
----- ----                      -----
    1 SPAdminJob                {Start-SPAdminJob}
    4 SPAlternateURL            {Get-SPAlternateURL, New-SPAlternateURL, Rem...
    1 SPApplicationContent      {Install-SPApplicationContent}
    2 SPAssignment              {Start-SPAssignment, Stop-SPAssignment}
...(not all output shown)
    6 SPWeb                     {Export-SPWeb, Get-SPWeb, Import-SPWeb, New-...
    4 SPWebApplication          {Get-SPWebApplication, New-SPWebApplication,...
    1 SPWebApplicationExtension {New-SPWebApplicationExtension}
    2 SPWebApplicationHttpTh... {Disable-SPWebApplicationHttpThrottling, Ena...
    2 SPWebApplicationHttpTh... {Get-SPWebApplicationHttpThrottlingMonitor, ...
    3 SPWebPartPack             {Get-SPWebPartPack, Install-SPWebPartPack, U...
    4 SPWebTemplate             {Get-SPWebTemplate, Install-SPWebTemplate, S...
    2 SPWorkflowConfig          {Get-SPWorkflowConfig, Set-SPWorkflowConfig}

一般 SharePoint 物件及其關係

圖 5-3   一般 SharePoint 物件及其關係

了解屬性及方法

對物件的所有了解,都儲存在稱為屬性的資料元素及值中,它也會描述該物件的狀態。例如,SPContentDatabase 物件包含伺服器陣列中之內容資料庫的所有相關資訊。

物件不僅擁有屬性,還包含了決定其操作方式的動作。在物件導向的專門用語中,這些動作 (或是對物件執行動作的不同方式) 就稱為方法。若要判定 SPSite 物件的屬性和方法,請使用下列範例中的 Cmdlet,其中有顯示部分輸出。

PS C:\Users\peter> Get-SPSite | Get-Member

   TypeName: Microsoft.SharePoint.SPSite

Name                                  MemberType Definition
----                                  ---------- ----------
AddWorkItem                           Method     System.Guid AddWorkItem(Sys...
BypassUseRemoteApis                   Method     System.Void BypassUseRemote...
CheckForPermissions                   Method     System.Void CheckForPermiss...
Close                                 Method     System.Void Close()
ConfirmUsage                          Method     bool ConfirmUsage()
Delete                                Method     System.Void Delete(), Syste...
Dispose                               Method     System.Void Dispose()
...
ToString                              Method     string ToString()
UpdateValidationKey                   Method     System.Void UpdateValidatio...
VisualUpgradeWebs                     Method     System.Void VisualUpgradeWe...
AdministrationSiteType                Property   Microsoft.SharePoint.SPAdmi...
AllowDesigner                         Property   System.Boolean AllowDesigne...
AllowMasterPageEditing                Property   System.Boolean AllowMasterP...
....(not all output shown)
WarningNotificationSent               Property   System.Boolean WarningNotif...
WebApplication                        Property   Microsoft.SharePoint.Admini...
WorkflowManager                       Property   Microsoft.SharePoint.Workfl...
WriteLocked                           Property   System.Boolean WriteLocked ...
Zone                                  Property   Microsoft.SharePoint.Admini...

重要

絕不要錯過將 Get-SP<名詞> Cmdlet 輸送至 Get-Member Cmdlet 的機會。有時候物件所能擷取到的資訊會讓人感到驚喜。

真實世界:執行 Windows PowerShell 命令時的效能問題

如果您想要找到伺服器陣列中的所有網站集合,可以輸入 Get-SPSite。然而,您將看到的輸出只有網站集合的 URL。就效能的理由而言,URL 屬性是預設顯示的唯一屬性。這是因為網站集合有許多屬性;如果要為大量網站集合顯示所有的這些屬性,將會耗用大量記憶體,而命令要花很長的時間來執行。只顯示 URL 屬性幾乎即時的,因為它是快取而來。因此,您應避免執行此命令來顯示太多其他屬性。

若要顯示比預設更多的屬性,您可以使用 select Windows PowerShell Cmdlet 來搭配縱線 (|) 字元。您也可以使用萬用字元 (*) 來搭配 SELECT 陳述式,以列出所有屬性值,如下列範例所示。

PS C:\Users\Peter> Get-SPSite "http://teams" | select *

ApplicationRightsMask                 : FullMask
ID                                    : cbf3290e-000e-4768-953c-99a983430283
SystemAccount                         : SHAREPOINT\system
Owner                                 : CONTOSO\spadmin
SecondaryContact                      : CONTOSO\peter
GlobalPermMask                        : FullMask
IISAllowsAnonymous                    : False
Protocol                              : http:
HostHeaderIsSiteName                  : False
HostName                              : teams
Port                                  : 80
...(not all output shown)
AllowDesigner                         : True
AllowRevertFromTemplate               : False
AllowMasterPageEditing                : False
ShowURLStructure                      : False

若要同時取得伺服器陣列中的所有網站集合清單,以及其儲存所在的內容資料庫名稱 (輸出只會提供網站集合的 URL 和內容資料庫名稱),可以使用下列範例中顯示的命令,其中也會顯示範例輸出。

PS C:\Users\peter> Get-SPSite | select url, contentdatabase

Url                                     ContentDatabase
---                                     ---------------
http://MySite                           SPContentDatabase Name=Contoso_MySiteDB
http://MySite/personal/peter            SPContentDatabase Name=Contoso_PersonalDB
http://MySite/personal/erin             SPContentDatabase Name=Contoso_PersonalDB
http://intranet.contoso.msft            SPContentDatabase Name=Contoso_IntranetDB
http://teams                            SPContentDatabase Name=Contoso_TeamsDB
http://teams/sites/Finance              SPContentDatabase Name=Contoso_TeamsDB

使用動詞

SharePoint 使用與其他 Cmdlet 集常見的動詞;SharePoint 中也有增加一些您沒看過的新動詞。同樣地,您可以使用 Get-Command Cmdlet 來尋找這些動詞,如下所示。

PS C:\Users\Peter>Get-Command -PSSnapin "Microsoft.SharePoint.PowerShell" |
>>sort verb | group verb | sort count -descending
>><ENTER>

Count Name                      Group
----- ----                      -----
  139 Get                       {Get-PluggableSecurityTrimmer, Get-SPAccessS...
  104 Set                       {Set-SPAccessServiceApplication, Set-SPAlter...
   88 New                       {New-SPAccessServiceApplication, New-SPAlter...
   77 Remove                    {Remove-PluggableSecurityTrimmer, Remove-SPA...
   11 Update                    {Update-SPFarmEncryptionKey, Update-SPInfoPa...
   10 Add                       {Add-PluggableSecurityTrimmer, Add-SPClaimTy...
   10 Install                   {Install-SPApplicationContent, Install-SPDat...
    8 Start                     {Start-SPAdminJob, Start-SPAssignment, Start...
    8 Import                    {Import-SPBusinessDataCatalogModel, Import-S...
    8 Export                    {Export-SPBusinessDataCatalogModel, Export-S...
    8 Uninstall                 {Uninstall-SPDataConnectionFile, Uninstall-S...
    7 Disable                   {Disable-SPBusinessDataCatalogEntity, Disabl...
    6 Enable                    {Enable-SPBusinessDataCatalogEntity, Enable-...
    6 Clear                     {Clear-SPLogLevel, Clear-SPMetadataWebServic...
    5 Stop                      {Stop-SPAssignment, Stop-SPEnterpriseSearchQ...
    4 Move                      {Move-SPBlobStorageLocation, Move-SPProfileM...
    3 Initialize                {Initialize-SPContentDatabase, Initialize-SP...
    3 Upgrade                   {Upgrade-SPContentDatabase, Upgrade-SPEnterp...
    3 Backup                    {Backup-SPConfigurationDatabase, Backup-SPFa...
    3 Restore                   {Restore-SPEnterpriseSearchServiceApplicatio...
    2 Resume                    {Resume-SPEnterpriseSearchServiceApplication...
    2 Test                      {Test-SPContentDatabase, Test-SPInfoPathForm...
    2 Suspend                   {Suspend-SPEnterpriseSearchServiceApplicatio...
    2 Revoke                    {Revoke-SPBusinessDataCatalogMetadataObject,...
    2 Mount                     {Mount-SPContentDatabase, Mount-SPStateServi...
    2 Grant                     {Grant-SPBusinessDataCatalogMetadataObject, ...
    2 Dismount                  {Dismount-SPContentDatabase, Dismount-SPStat...
    1 Merge                     {Merge-SPLogFile}
    1 Receive                   {Receive-SPSharedServiceApplicationInfo}
    1 Disconnect                {Disconnect-SPConfigurationDatabase}
    1 Unpublish                 {Unpublish-SPServiceApplication}
    1 Connect                   {Connect-SPConfigurationDatabase}
    1 Rename                    {Rename-SPServer}
    1 Restart                   {Restart-SPEnterpriseSearchQueryComponent}
    1 Copy                      {Copy-SPBusinessDataCatalogAclToChildren}
    1 Ping                      {Ping-SPEnterpriseSearchContentService}
    1 Publish                   {Publish-SPServiceApplication}

如您所見,最常用的 SharePoint 相關動詞為

  • Get 查詢特定物件或物件集合,以及擷取該物件的相關資訊。例如,您可以用它來擷取所有服務應用程式的相關資訊。只有 Get 命令會傳回一或多個物件;其他所有命令都一次只對一個物件執行。

    Get-SPServiceApplication

  • Set 修改物件的特定設定。例如,您可以用它來設定特定網站集合的網站集合擁有人。

    Set-SPSite http://teams -OwnerAlias contoso\peter

  • New 建立物件的新執行個體,例如建立新的網站集合。

    New-SPSite http://teams/sites/HR -OwnerAlias contoso\peter
    -Name "HR Team" -Template STS#0
    
  • Remove 移除 (刪除) 物件的執行個體,例如網站集合及其所有子網站。因為此動詞的危險本質,您通常必須使用 -confirm 參數來確認此動作。如果此參數不存在,則您會看到訊息要求您確認動作,如下所示。

    PS C:\Users\Peter> Remove-SPSite http://teams/sites/HR
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Remove-SPSite" on Target "http://teams/sites/Finance".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
    (default is "Y"):y
    

這裡顯示的範例中,到處都有使用參數。參數就是前置連字號 (-) 的字詞。在下一節中,您將會看到 Get-Help Cmdlet,並了解它如何協助您找出這些參數的相關資訊,包括哪些參數可以用於不同的 Cmdlet。

取得說明

Windows PowerShell 包含龐大的內建說明系統,只要在命令列介面中輸入 help,即可快速存取。這是 Get-Help Cmdlet 的別名。您甚至可以輸入 Get-Help Get-Help 來取得 Get-Help 的相關說明。這類命令的輸出會列出 Cmdlet 的說明、Cmdlet 使用的語法、參數說明、範例,以及其他相關注意事項。您也可以使用 Get-Help Cmdlet 來取得基本 Windows PowerShell 語言的說明。例如,您可以使用下列命令來取得特定主題的相關說明:Get-Help foreach、Get-Help substring 或 Get-Help variables。

注意

學習 Windows PowerShell 的最佳方法,就是使用其內建說明系統。如果您或您的開發人員建立新的 Windows PowerShell Cmdlet,請務必建立您自己的說明檔。除了內建說明之外,網際網路上也有很多資源。例如,您可以下載適用於 32 位元或 64 位的免費 Windows PowerShell Help 2.0,網址為 https://www.primaltools.com/downloads/communitytools/(可能為英文網頁)

說明檔

Get-Help 會使用安裝在伺服器上的可延伸標記語言 (XML) 檔,來尋找所要顯示的資訊。當您安裝 SharePoint 時,說明檔會隨著 Windows PowerShell 嵌入式管理單元一起安裝。您可以在 %CommonProgramFiles%\Microsoft Shared\Web Server Extensions\14\CONFIG\PowerShell\Help 或 %CommonProgramFiles%\Microsoft Shared\Web Server Extensions\14\CONFIG\PowerShell\Help\<地區> 中找到這些檔案,其中地區是定義電腦的語言,例如 en-us。這些檔案使用的命名慣例為 <DLL 檔案名稱>-help.xml,例如 Microsoft.SharePoint.PowerShell.dll-help.xml、Microsoft.SharePont.Search.dll-help.xml 及 Microsoft.Office.Access.Server.dll-help.xml。若想知道哪些 Cmdlet 使用哪個 XML 說明檔,請輸入

PS C:\Users\Peter>Get-Command -PSSnapin "Microsoft.SharePoint.PowerShell" |
>>sort helpfile, name |
>>Format-Wide name -column 2 -groupby helpfile | more
>><ENTER>

  

   :

Get-SPExcelBlockedFileType        Get-SPExcelDataProvider  
Remove-SPExcelDataProvider        Remove-SPExcelUserDefinedFunction
Set-SPExcelFileLocation

   HelpFile: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions
\14\CONFIG\PowerShell\Help\microsoft.office.access.server.dll-help.xml

Get-SPAccessServiceApplication    New-SPAccessServiceApplication 
Set-SPAccessServiceApplication

   HelpFile: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions
\14\CONFIG\PowerShell\Help\Microsoft.Office.Excel.Server.MossHost.dll-help.xml

Get-SPExcelDataConnectionLibrary   Get-SPExcelFileLocation
Get-SPExcelServiceApplication      Get-SPExcelUserDefinedFunction
New-SPExcelBlockedFileType         New-SPExcelDataConnectionLibrary
New-SPExcelDataProvider            New-SPExcelFileLocation
New-SPExcelServiceApplication      New-SPExcelUserDefinedFunction
Remove-SPExcelBlockedFileType      Remove-SPExcelDataConnectionL...
Remove-SPExcelFileLocation         Set-SPExcelDataConnectionLibrary
Set-SPExcelDataProvider            Set-SPExcelServiceApplication  
-- More -

提示

您可以在下列網址找到 cmdlet XML 說明檔格式的相關資訊,以及如何建立自己的說明檔來補充您建立的新 Cmdlet:https://blogs.msdn.com/powershell/archive/2006/09/14/Draft-Creating-Cmdlet-Help.aspx(可能為英文網頁)https://blogs.msdn.com/powershell/archive/2008/12/24/powershell-v2-external-maml-help.aspx(可能為英文網頁)

ISE 說明

除了命令列說明功能之外,還有一個圖形化說明檔 (WindowsPowerShellHelp.chm) 位在 %SystemRoot%\Help\mui\<LCID>,其中 LCID 是安裝的地區設定識別碼或語言,例如 0409。若要在使用 ISE 時存取圖形化說明檔,請選取要取得其說明的命令,然後按 F1。隨即開啟 chm 檔並顯示該命令的說明,如圖 5-4 所示。

然而,此 chm 檔只包含核心 Windows PowerShell Cmdlet 的說明。如果您需要 SharePoint 特有的說明,則應使用 SharePoint 2010 管理命令介面及 Get-Help Cmdlet。

提示

如需 Windows PowerShell 中的 [說明] 功能,以及如何加以設定來顯示別名的說明,或是如何停用本機說明,並強制 ISE 直接從 TechNet 取得說明的詳細資訊,請參閱 https://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2009/01/31/using-help-in-powershell-ise.aspx(可能為英文網頁)。Microsoft 建議您經常檢查線上說明,以尋找最新資訊及範例。當您使用 Get-Help 命令時,可以在「相關連結」區段找到線上版本的連結。

Windows PowerShell 說明

圖 5-4 Windows PowerShell 圖形化說明

使用參數

若想知道哪些參數可用於 Cmdlet,請輸入 Get-Help <Cmdlet> 或 Get-Command <Cmdlet> -syntax,其中 <Cmdlet> 是您要取得其參數資訊的 Cmdlet 名稱。例如,Get-Help New-SPSite 或 Get-Command New-SPSite -syntax 將會提供與 New-SPSite 相關聯之參數的詳細資訊。Get-Help Cmdlet 也有數個與其相關聯的參數,您可以依據您想要的資訊量,將那些參數與 Get-Help 命令搭配使用。如果您非常熟悉某個 Cmdlet,而不想要該 Cmdlet 行為的描述性說明,可能只想查看如何使用該 Cmdlet 的一些範例,若是如此,您可以輸入 Get-Help New-SPSite -examples。

若要了解哪些參數可用於 Cmdlet,請檢閱說明結果的語法區段,如下列輸出所示。選用性參數會以方括弧 ([ ]) 括起來,而要傳遞給參數的值會以角括弧 (<>) 括起來。下列範例顯示 Get-SPSite Cmdlet 的語法區段。

SYNTAX
    Get-SPSite [-AssignmentCollection <SPAssignmentCollection>] 
    [-Confirm [<SwitchParameter>]] [-Filter <ScriptBlock>] [-Limit <String>]
    [-WebApplication <SPWebApplicationPipeBind>] [-WhatIf [<SwitchParameter>]]
    [<CommonParameters>]

    Get-SPSite -Identity <SPSitePipeBind> [-AssignmentCollection
    <SPAssignmentCollection>] [-Confirm [<SwitchParameter>]] [-Filter <ScriptBlock>]
    [-Limit <String>] [-Regex <SwitchParameter>] [-WhatIf [<SwitchParameter>]]
    [<CommonParameters>]

    Get-SPSite -ContentDatabase <SPContentDatabasePipeBind> [-AssignmentCollection
    <SPAssignmentCollection>] [-Confirm [<SwitchParameter>]] [-Filter <ScriptBlock>]
    [-Limit <String>] [-WhatIf [<SwitchParameter>]] [<CommonParameters>]

    Get-SPSite -SiteSubscription <SPSiteSubscriptionPipeBind> [-AssignmentCollection
    <SPAssignmentCollection>] [-Confirm [<SwitchParameter>]] [-Filter <ScriptBlock>]
    [-Limit <String>] [-WhatIf [<SwitchParameter>]] [<CommonParameters>]

請注意,使用 Get-SPSite 的方法有四種,而每一種語法都有 -AssignmentCollection 參數。-AssignmentCollection 參數與內建 SharePoint Cmdlet 的某個重要層面相關,本章稍後的提要欄位標題<使用 Windows PowerShell 時的記憶體考量>中將有詳細審視。

上述清單中顯示的第一個語法範例沒有必要參數,所以 Get-SPSite Cmdlet 會有伺服器陣列或 Web 應用程式範圍。其他三個語法有必要參數,如下列程式碼所示,可將範圍定義為網站集合、內容資料庫,或是訂閱共用設定、功能和服務之網站集合的集合。就像在其他 SPSite Cmdlet 中一樣,在大型安裝中,此 Cmdlet 會輸出大量資訊,而對許多內容資料庫的查詢會嚴重影響 SharePoint 伺服器的效能。因此,依預設,輸出只會報告前 20 個物件。

您可以使用 -limit 參數來更改此輸出限制,如下列範例所示,它會輸出儲存在 Contoso_TeamsDB 內容資料庫中的所有網站集合。

Get-SPSite -ContentDatabase Contoso_TeamsDB -limit all

您可以提供這些範圍參數的值,或者如果是使用 -identity 參數 (值為 URL),您可以使用萬用字元 (*)。不含參數的預設說明會提供有限的命令說明。

如需詳細資訊,請使用 -detailed 或 -full 參數。-full 參數會提供該參數的相關資訊。例如,顯示在下一頁上的 -identity 參數相關資訊。

PARAMETERS
    -Identity <SPSitePipeBind>
        Specifies the URL or GUID of the site collection to get.

        The type must be a valid URL, in the form http://server_name or http://
        server_name/sites/sitename, or a valid GUID (for example, 12345678-90ab
        -cdef-1234-567890bcdefgh).

        Required?                    true
        Position?                    1
        Default value
        Accept pipeline input?       True
        Accept wildcard characters?  false

如果您去看輸出的最後 5 行,會看到它提供如何使用 -identity 參數的詳細資訊。例如,必要值等於 True,表示 -identity 參數是 Get-SPSite Cmdlet 的必要參數。然而,位置值等於 1,表示如果您在 Get-SPSite Cmdlet 後面緊接著網站集合的 URL,就不需要使用 -identity 參數,因為會將該 URL 解讀成網站集合的 identity (URL),其中會顯示個人管理路徑下存在的網站集合之所有屬性值,如下列範例所示。

Get-SPSite http://MySite/personal/* | Select *

許多參數都有用角括弧包含的值,並以 PipeBind 為字尾。這表示該參數可以接受特定類型的物件變數。例如,[-ContentDatabase <SP 內容資料庫管道繫結>] 表示 -ContentDatabase 參數可以接受 SharePoint 內容資料庫物件,而此物件可以傳遞至 ContentDatabase 物件以作為變數,或是可從另一個 Cmdlet 的結果輸送進來。當您將物件輸送至 Cmdlet 中時,不需要輸入或使用變數。當您將物件從一個 Cmdlet 輸送至另一個 Cmdlet 中時,則不需要指定參數,因為 Windows PowerShell 會檢查物件的類型,並將它與正確的參數配對。下面的範例列出名稱中任何地方有 oso 字元的任何內容資料庫中,所儲存的所有網站集合。

Get-SPContentDatabase | where {$_.name -match "oso"} | Get-SPSite -Limit 50

Get-SPContentDatabase 會傳回內容資料庫集合,然後您需要檢查每個內容資料庫,看它是否符合我們的條件。Where-object Cmdlet (別名為 where 或 ?) 的行動像個迴圈,所以它會檢查從 Get-SPContentDatabase Cmdlet 傳回的每個內容資料庫物件。變數 $_ 代表一個內容資料庫物件,而 .name 是需要符合我們查詢的內容資料庫屬性。運算子為 -match。

Windows PowerShell 有一些運算子,例如 -eq (等於)、-ne (不等於)、-lt (小於)、-ge (大於或等於)、-like (符合萬用字元模式) 及 -notlike (不符合萬用字元模式)。-like、-notlike、-match 及 -notmatch 運算子可用於模式比對。-match 及 -notmatch 運算子會使用規則運算式來判斷一個值是否包含運算式的相符項目。

提示

如需 Windows PowerShell 運算子的詳細資訊,請參閱《Windows PowerShell 2.0, Administrator's Pocket Consultant》(Windows PowerShell 2.0,管理員的口袋顧問) (作者:William Stanek,Microsoft Press 2009 年出版) 第 5 章<瀏覽核心 Windows PowerShell 結構>中,標題為<使用運算式及運算子>的小節。

可用來替代 WHERE 陳述式的另一個方法就是 -filter 參數,它使用與 WHERE 陳述式相同的語法,並可產生相同的結果。然而,-filter 參數是在伺服器上執行。將 Get-SPContentDatabase Cmdlet 的結果以管道輸送至 WHERE 陳述式,會導致 SQL 來回至 Windows PowerShell 用戶端執行的任何地方。使用 -filter 參數會導致效能變快,讓命令可以運用 SQL 的篩選功能,而不會嘗試進行本機搜尋。然而,當您使用 -filter 參數時,只能為 SPSite Cmdlet 存取 Owner、SecondaryOwner 及 LockState 屬性。有些 Cmdlet 有其他參數可讓您篩選結果輸出。例如,SPWeb 有提供參數來篩選網站 (web) 的範本或標題輸出。儘管如此,在許多情況下 -filter 參數還是可以為您節省時間,例如,在有 4300 個網站 (web) 的伺服器陣列中,使用 -filter 參數來尋找所有部落格網站 (site) 大約需要 1.2 秒,但是如果使用 WHERE 陳述式大約需要 15 分鐘。以下是使用 -filter 參數的幾個範例。

  • 此範例會傳回主要擁有人的使用者名稱為 peter 的所有網站集合。

    Get-SPSite -Filter {$_.Owner -eq "contoso\peter"}

  • 此範例會傳回 http://teams/sites/HR 網站集合中,使用「空白會議工作區」範本來建立的所有網站。

    Get-SPSite http://teams/sites/HR | Get-SPWeb -Filter {$_.Template -eq "STS#03"}

注意

當您建立新的網站集合時,如果沒有指定範本或找不到範本,則需要建立網站來當作網站集合的根網站。若要執行此操作,可以使用 New-SPWeb 命令,或在瀏覽器中第一次顯示網站集合時選取適當的網站範本。

若要尋找所安裝之範本的詳細資料,以及適當的範本識別碼,請使用 Get-SPWebTemplate Cmdlet。此命令的輸出範例如下。

Name                 Title                                    LocaleId   Custom
----                 -----                                    --------   ------
GLOBAL#0             Global template                          1033       False
STS#0                Team Site                                1033       False
STS#1                Blank Site                               1033       False
STS#2                Document Workspace                       1033       False
MPS#0                Basic Meeting Workspace                  1033       False
MPS#1                Blank Meeting Workspace                  1033       False
MPS#2                Decision Meeting Workspace               1033       False
MPS#3                Social Meeting Workspace                 1033       False
MPS#4                Multipage Meeting Workspace              1033       False
CENTRALADMIN#0       Central Admin Site                       1033       False
WIKI#0               Wiki Site                                1033       False
BLOG#0               Blog                                     1033       False
SGS#0                Group Work Site                          1033       False
TENANTADMIN#0        Tenant Admin Site                        1033       False
ACCSRV#0             Access Services Site                     1033       False
ACCSRV#1             Assets Web Database                      1033       False
ACCSRV#3             Charitable Contributions Web Database    1033       False

在 Get-SPSite 及 Get-SPSiteAdministration 上,提供另外兩個使用 SQL 導向篩選作業的篩選:「萬用子元 URL」及規則運算式 (-RegEx) 參數,例如:

  • Get-SPSite http://intranet/sites/*

  • Get-SPSite "http://intranet/(sites|teams)/HR" -RegEx

使用 Windows PowerShell 時的記憶體考量

Windows PowerShell 的預設行為是它會執行多執行緒環境,而且每一行、功能或指令碼都會在自己的執行緒內執行 ($host.Runspace.ThreadOptions == "Default")。這樣會導致記憶體遺漏,但如同您在本章稍早的<使用 SharePoint 2010 管理命令介面>一節中所看到的,SharePoint 2010 管理命令介面會執行第一個執行緒 ($host.Runspace.ThreadOptions ="ReuseThread") 中的每一行、功能或指令碼,這就減輕了問題,但是仍會發生記憶體遺漏的情況。因此,您應學會使用的兩個 SharePoint Cmdlet 為 Start-SPAssignment 和 Stop-SPAssignment。這些都與可以搭配許多 SharePoint Cmdlet,以傳回「可處置的物件」的 -SPAssignmentCollection 參數相關。用開發人員的話來說,這些是實作「IDisposable 介面」的物件。如果沒有正確處置這些物件,可能會導致記憶體遺漏。尤其是這還關係到 SPSite、SPWeb 及 SPSiteAdministration 物件。如果您在單一管道中使用與這些物件相關聯的 Cmdlet,而且沒有使用變數來儲存物件,則在管道結束時會自動處置所使用的記憶體。如果您有取得許多物件的長管道,這樣會導致 SharePoint 伺服器上的記憶體短缺,而在向該伺服器要求頁面時,會有顯著的影響。

當您在變數中儲存上述三個物件中的任何一個時,必須處置指派給該物件的記憶體。下列範例顯示這些物件與變數搭配使用的主要方法,以及如何處置記憶體。

  • 使用 SPAssignment Cmdlet 的簡單用法,這會將所有物件保存在呼叫 Stop-SPAssignment Cmdlet 時所釋出的全域記憶體存放區中。

    Start-SPAssignment -Global
    $sc = Get-SPSite http://intranet
    $sc.Title
    Stop-SPAssignment -Global
    
  • 使用 SPAssignment Cmdlet 的進階用法,並要求它追蹤指派給特定變數的記憶體。在下列範例中,Start-SPAssignment Cmdlet 會建立以 $o 指向的命名存放區,而變數 $sc 會與該命名存放區相關聯,並填入網際網路網站集合物件的相關資訊。然後 Stop-SPAssignment Cmdlet 會釋出與命名存放區相關聯的記憶體。

    $o = Start-SPAssignment
    $sc = $o | Get-SPSite http://intranet
    Get-SPSite -Limit all
    $sc.Title
    $o | Stop-SPAssignment
    
  • 如果您習慣在 SharePoint 平台上開發,則可使用您在程式碼中使用的類似技巧來克服這個問題。例如,在一個 Windows PowerShell 命令列中使用變數,並在該命令列結束時處置變數。

    $sc = New-SPSite("http://Intranet"); $sc.Title; $sc.Dispose()
    

    這會將網站集合物件儲存在變數 $sc 中。然後下一個命令會印出內部網路網站集合的標題,而最後一個命令會釋出儲存網站集合物件的記憶體。

    注意

    使用下列語法可以安全地執行這個相同的命令。
    New-SPSite(http://intranet) | Select Title

請注意,這裡所顯示的 SPAssignment 簡單呼叫方法可能會造成記憶體問題。您在 Stop 與 Stop SPAssignment 命令之間取得的任何物件,都會保留在全域指派存放區中,而且在執行 Stop-SPAssignment Cmdlet 之前都不會釋出,而當您使用 SPAssignment 的進階呼叫方法時,只會保留與您要求 SPAssignment 追蹤之變數相關聯的記憶體,且一直保留到執行 Stop-SPAssignment Cmdlet 而止。因此,如果您需要在完成工作時檢視大量資訊,而不想耗盡 SharePoint 伺服器的記憶體,則最好使用 SPAssigment 的進階用法。如需詳細資訊,請使用 Get-Help About_SPAssignment。

SharePoint Foundation 2010 的 Cmdlet

SharePoint Foundation 2010 包含超過 240 個與 SharePoint 相關的 Cmdlet。若想知道確切的數目,請輸入下列命令。

@(Get-Command -PSSnapin "Microsoft.SharePoint.PowerShell").count

這些 Cmdlet 最常操作的物件為 SPSite、SPServer、SPWeb、SPBusinessDataCatalogue 及 SPConfigurationDatabase 物件。因為 Windows PowerShell 主要是管理員的工具,而這些是管理員管理的元件,所以 Cmdlet 的擴張並不是非預期的。在建置於 SharePoint Foundation 頂端的 SharePoint 2010 中,也可以找到這些 Cmdlet。

提示

本書隨附的媒體中包含「Microsoft SharePoint Foundation 2010 Cmdlet 參照」文件。此文件包含您在 SharePoint 2010 管理命令介面中輸入下列命令時,所看到的輸出。

PS C:\Users\Peter>Get-Command -PSSnapin Microsoft.SharePoint.PowerShell | 
>>Sort Noun, Verb | Get-Help -detailed > CmdletHelp.txt
>><ENTER>

此命令會產生 Cmdlet 說明主題清單 (依名詞排序)。此清單包含您輸入下列命令時,可以在 SharePoint 2010 管理命令介面中檢視之每個 Cmdlet 的相同 [說明]。

Get-Help <Cmdlet-Name> -detailed

此文件包含製作文件當時最新的說明資訊。Microsoft 建議您經常檢查線上說明,以尋找最新資訊及範例。當您使用 Get-Help 命令時,可以在「相關連結」區段找到線上版本的連結。

SharePoint 2010 的 Cmdlet

如果您使用上一節中顯示的相同 Windows PowerShell 命令以決定 SharePoint 2010 中可用的 Cmdlet 數目,會發現有超過 530 個與 SharePoint 2010 相關聯的 SharePoint 相關 Cmdlet。明確地說,那是與 SharePoint 2010 企業版完整安裝 (不含 FAST Search 安裝) 相關聯的 Cmdlet 數目。若要識別 SharePoint 提供的附加 Cmdlet,Windows PowerShell 可以再次提供協助。在已安裝 SharePoint Foundation 及某版本 SharePoint Server 的電腦上,輸入下列命令,變更重新導向檔案的名稱以反映 SharePoint 安裝。

PS C:\users\peter>Get-Command -PSSnapin "Microsoft.SharePoint.PowerShell" | 
>> Sort noun, verb |group -Property noun -NoElement > cmdlet_sps.txt
>><Enter>

將檔案複製到相同的伺服器,然後輸入下列命令。

PS C:\Users\Peter>Compare-Object -ReferenceObject $(Get-Content .\cmdlet_sps.txt) ' 
>>-DifferenceObject $(Get-Content .\cmdlet_spf.txt)
>><ENTER>

您會看到類似下列範例的輸出。

InputObject                                                 SideIndicator
-----------                                                 -------------
    8 SPContentDatabase                                     =>
    3 PluggableSecurityTrimmer                              <=
    3 SPAccessServiceApplica...                             <=
    9 SPContentDatabase                                     <=
    5 SPContentDeploymentJob                                <=
    4 SPContentDeploymentPath                               <=
    4 SPDataConnectionFile                                  <=
    1 SPDataConnectionFileDe...                             <=
    2 SPEnterpriseSearchAdmi...                             <=
    3 SPEnterpriseSearchLang...                             <=
    4 SPEnterpriseSearchMeta...                             <=
...

只有未同時出現在兩種安裝上的那些物件,以及每個物件的 Cmdlet 數相異的那些物件,才會出現在此清單中。SideIndicator 欄會表示物件及其 Cmdlet 計數來自哪個檔案。

在 SharePoint 2010 中,Cmdlet 最常操作的物件與 SharePoint Foundation 中的類似。然而,SharePoint 2010 中可用的主要附加命令,是協助您管理搜尋程序的那 131 個 Cmdlet (只有 4 個 cmdlets 與 SharePoint Foundation 的搜尋相關聯)。請輸入下列命令,以自行檢查。

PS C:\Users\Peter>@(gcm -PSSnapin "Microsoft.SharePoint.PowerShell" | 
>>where {$_.name -like "*search*"}).count
>><ENTER>

SharePoint 2010 包含的應用程式服務比 SharePoint Foundation 多,例如 Excel Services、InfoPath Services、Secure Storage、State Service、Microsoft Visio 及 PerformancePoint。因此,在 SharePoint Server 伺服器陣列上,有較多的 Cmdlet 可讓您用來建立、操作及刪除應用程式服務物件。

執行基本管理工作

SharePoint 安裝中需要兩種類型的管理工作:一種是需要從任何伺服器完成一次的工作,例如建立新的 Web 應用程式、設定網站集合的主要擁有人,或是刪除特定網站;另一種是需要在一部特定伺服器或多部伺服器上完成多次的工作,例如啟動伺服器上的服務、新增或移除伺服器陣列中的伺服器,或是將伺服器連線至特定設定資料庫。身為 SharePoint 管理員所要完成的大部分工作是第一種類型,而且由於您可以從任何伺服器完成工作,所以您登入哪一部伺服器並不重要。

Windows PowerShell 讓完成這兩種管理工作都變得很容易。您可以循環大量物件,並將指令碼納入自動化工作中,讓管理工作可以在較少的時間內完成。不過,正因為管理工作可以用 Windows PowerShell 輕易完成,所以不應該讓它使用於規避您既有的控制項。這些全伺服器陣列的工作,有些是非常危險的;它們會影響整個安裝。在實際執行環境中,這類工作應受到嚴格的變更管理。

重要

很多組織只允許使用遠端存取生產環境以完成管理工作。電腦室的存取受到嚴格控管,所以很少允許在伺服器主控台進行互動式存取,通常只允許處理硬體相關問題。在這樣的環境中,甚至是對生產伺服器的遠端存取,也限制在少數的管理電腦,而管理員必須使用 VPN 或遠端桌面來連接這些電腦。管理電腦應設定為僅允許特定使用者或 IP 位址來引動遠端桌面工作階段。如果這是您的情況,使用 Windows PowerShell 從遠端管理 SharePoint 安裝的工作,也應會限制在該系統管理電腦。Windows PowerShell 有一些內建功能,可協助您降低會影響整個 SharePoint 安裝工作的風險;這些工作可參照本章稍早的<使用 WinRM 從遠端管理系統>一節。

Windows PowerShell 提供一些可列為最佳作法的「自願性」功能。在下一節中,您將進一步了解其中兩項功能:-whatif 參數和記錄。

使用 -whatif 參數

Windows PowerShell 是一種功能強大的工具,就像任何其他指令碼語言,要借用別人的程式碼或是從網際網路下載片段都太容易了。您可能會在不清楚其功能的情況下執行。使用簽署的指令碼和 Windows PowerShell 執行原則,以及限制誰可以將指令碼檔案上傳至 SharePoint 伺服器,都是可以保護資源的方式。

Windows PowerShell 提供一種機制,可讓您在執行命令之前先試用,那就是 -whatif 參數。請輸入下列命令。

PS C:\Users\Peter> Get-SPSite http://teams/sites/* | Remove-SPSite -whatif

此命令會產生下列範例輸出,列出所有網站集合,以及如果您在不使用 -whatif 參數的情況下執行指令,將會對這些物件執行的作業。

What if: Performing operation "Remove-SPSite" on Target "http://teams/sites/Sales".
What if: Performing operation "Remove-SPSite" on Target "http://teams/sites/Blogs".
What if: Performing operation "Remove-SPSite" on Target "http://teams/sites/Finance".
What if: Performing operation "Remove-SPSite" on Target "http://teams/sites/Wikis".
What if: Performing operation "Remove-SPSite" on Target "http://teams/sites/HR".

使用 -whatif 參數來嘗試命令,並不會刪除任何東西。此參數會要求 Remove-SPSite Cmdlet 顯示會受命令影響的物件,而不會執行命令。在此範例中,其顯示會永久刪除的物件。

產生記錄

一對 Windows PowerShell Cmdlet:Start-Transcripts 及 Stop-Transcripts,可讓您記錄在提示中輸入的所有命令及輸出。在 start 與 stop 命令之間的所有活動都會記錄下來。如果您沒有輸入 stop,則要在主控台工作階段終止時,記錄才會終止。在實際執行環境中 (整部機器的設定檔包含 Start-Transcript Cmdlet,以記錄所有使用者的 Windows PowerShell 活動) 這會非常好用。當使用者結束主控台,記錄至記錄檔的工作即完成。

重要

在實際執行環境中,第一次請勿使用 Windows PowerShell Cmdlet 或指令碼。此外,也請儘量保持簡單;如果要由 Windows PowerShell 的新手管理員來支援指令碼,請勿使用或建立別名;當您建立或修訂指令碼時,請一律使用 Windows PowerShell 命令。

真實世界:如果不使用 –whatif 參數會怎麼樣?

有時候,即使是有經驗的 IT 專業人員,都可能會因為不正確地使用內建的 Cmdlet,而造成嚴重的後果,尤其是將 Cmdlet 與縱線字元組合使用時。例如,若您輸入 Get-SPSite | Remove-SPSite,將會永久刪除伺服器陣列中的所有網站集合。清單和文件庫中的所有資料,以及網站中的所有內容,所有東西就這麼不見了。此動作的可能結果之一,就是客服中心的所有電話線會立刻響起。如果消失的其中一個網站是主要電子商務網際網路網站,您的公司會快速損失一大筆錢,而且可能更重要的是,公司會流失潛在的客戶,而且永遠不會再回來。若要還原伺服器陣列,您需要最新的良好備份磁帶。此範例的課程很簡單:一律先使用 –whatif 參數!

SharePoint 管理工作範例

許多管理工作必須依每日完成,有些是偶爾需要,再來則是很少需要的少數工作。Windows PowerShell 可協助處理所有這些類型的工作;事實上,您可能會發現,為很少執行的工作撰寫指令碼,比為每天執行的工作撰寫指令碼還棘手。這可能是因為您需要迅速且正確地執行那項少有的工作,即使是不小心犯個小錯,完成這項工作可能會是個大災難。在這整本書中,您會看到許多使用 Windows PowerShell 的時機和方法的範例。在下列各節中,您將探索可能在其他地方還沒看過的某些範例。

提示

有一段 Microsoft 指令碼中心 (https://gallery.technet.microsoft.com/ScriptCenter/zh-tw(可能為英文網頁)) 包含 SharePoint 相關的指令碼。

使用 Windows PowerShell 指令碼來部署 SharePoint 2010

在 SharePoint 安裝的生命週期間,可能有很多工作是您必須只完成一次的 (希望如此),例如安裝 SharePoint 及建立伺服器陣列。然而,在擁有各種環境和許多開發人員可支援的大型組織中,您可能會發現,要開發用來建置 SharePoint Web 前端 (WFE) 伺服器及 SharePoint 應用程式伺服器 (用以主控應用程式服務,例如 InfoPath Services,以及搜尋查詢和索引服務) 的指令碼,從一開始就要很小心謹慎。在舊版 SharePoint 中,您可以使用批次檔及 SharePoint 命令列工具 psconfig 和 stsadm 來完成這類工作。您仍可使用這些工具來自動化安裝 SharePoint 2010 及 SharePoint Foundation 2010 伺服器。您可以在第 4 章<安裝 SharePoint 2010>中,找到使用這些工具的相關資訊,所以這裡就不再重複細節。Microsoft 已開發一個指令碼,其確實是使用 Windows PowerShell 以從頭建立 SharePoint 伺服器陣列的最佳作法。這些命令和參數的順序相當微妙,所以 Microsoft 建議您使用 Microsoft TechNet 文件庫文章<使用 Windows PowerShell 安裝 SharePoint Server 2010>中所記載的 Windows PowerShell 模組 (SPModule)。

提示

如需 SharePoint 自動化以及 psconfig、stsadm 和 Windows PowerShell 用法的詳細資訊,請參閱 http://stsadm.blogspot.com/(可能為英文網頁)

當您在安裝 SharePoint 時,需要合併記錄檔。Windows 作業系統有提供事件記錄來協助您執行管理工作,而且您可以使用 Windows PowerShell Get-Eventlog Cmdlet 來取得那些記錄中的詳細資訊。SharePoint 也有提供統一登入服務 (ULS)。ULS 包含所有應用程式記錄事件,您也可以將協力廠商記錄軟體整合其中。SharePoint 2010 包含數個可擷取資訊及設定 ULS 的 Windows PowerShell Cmdlet。若想知道如何在伺服器陣列上設定 ULS,請輸入下列命令 (這裡也有顯示此命令的範例輸入)。

Get-SPDiagnosticConfig

AllowLegacyTraceProviders                   : False
CustomerExperienceImprovementProgramEnabled : True
ErrorReportingEnabled                       : True
ErrorReportingAutomaticUploadEnabled        : True
DownloadErrorReportingUpdatesEnabled        : True
DaysToKeepLogs                              : 14
LogMaxDiskSpaceUsageEnabled                 : True
LogDiskSpaceUsageGB                         : 3
LogLocation                                 : %CommonProgramFiles%\Microsoft Sh
                                             ared\Web Server Extensions\14\LOG
                                             S\
LogCutInterval                              : 30
EventLogFloodProtectionEnabled              : True
EventLogFloodProtectionThreshold            : 5
EventLogFloodProtectionTriggerPeriod        : 2
EventLogFloodProtectionQuietPeriod          : 2
EventLogFloodProtectionNotifyInterval       : 5
ScriptErrorReportingEnabled                 : True
ScriptErrorReportingRequireAuth             : True
ScriptErrorReportingDelay                   : 60
 AllowLegacyTraceProviders                   : FalseCustomerExperienceImprovementProgramEnabled : TrueErrorReportingEnabled                       : TrueErrorReportingAutomaticUploadEnabled        : TrueDownloadErrorReportingUpdatesEnabled        : TrueDaysToKeepLogs                              : 14LogMaxDiskSpaceUsageEnabled                 : TrueLogDiskSpaceUsageGB                         : 3LogLocation                                 : %CommonProgramFiles%\Microsoft Sh                                             ared\Web Server Extensions\14\LOG                                             S\LogCutInterval                              : 30EventLogFloodProtectionEnabled              : TrueEventLogFloodProtectionThreshold            : 5EventLogFloodProtectionTriggerPeriod        : 2EventLogFloodProtectionQuietPeriod          : 2EventLogFloodProtectionNotifyInterval       : 5ScriptErrorReportingEnabled                 : TrueScriptErrorReportingRequireAuth             : TrueScriptErrorReportingDelay                   : 60

在診斷問題時,您可以使用與 SPLogEvent 物件相關聯的 Cmdlet。您需要有電腦管理員權限,才能執行這些 Cmdlet,所以您可能需要使用 [以系統管理員身分執行] 以啟動 SharePoint 2010 管理命令介面。然後您再以類似下列範例中顯示的步驟來使用命令。

  1. 例如,設定兩個變數來儲存開始日和結束日期。

    $SDate = Get-Date -Day 13 -Month 04 -Year 2010
    $EDate = Get-Date -Day 14 -Month 04 -Year 2010
    

    或者日期可以是今天的日期,但是事件大概發生在現行時間之前的 15 分鐘。在此情況下,您要將變數設為現行時間之前的 20 分鐘,以及現行時間之前的 10 分鐘。

    $SDate = (Get-Date).AddMinutes(-20)
    $EDate = (Get-Date).AddMinutes(-10)
    
  2. 取得這兩個日期和時間之間的事件清單。

    Get-SPLogEvent -StartDate $SDate -EndTime $Edate

    如果沒有提供 -EndTime 參數,事件記錄會顯示到現行的日期和時間。

追蹤號碼 (又稱「相互關聯識別碼」) 與您對 SharePoint 提出的每個要求相關聯。此號碼會儲存成與 SPLogEvent 物件相關聯的屬性值。SQL Profiler 追蹤也會顯示「相互關聯識別碼」。此號碼會顯示在 [錯誤] 頁面上,如圖 5-5 所示。

SharePoint Foundation 錯誤訊息

圖 5-5 顯示「相互關聯識別碼」的錯誤頁面

在大型或用量大的 SharePoint 安裝中,在發生問題期間,可能會產生許多記錄檔。您可以使用「相互關聯識別碼」來協助排解錯誤疑難,減少傳回至與意外相關聯之那些項目的記錄資訊量。再一次,設定 $sdate 和 $edate 變數,以反映發生意外的時間。若發生您無法重製,而您的使用者之一卻始終能夠重製的意外,您可以請服務中心要求該使用者擷取錯誤頁面的螢幕畫面,以確保您取得確實的「相互關聯識別碼」。然後您可以將步驟 2 中顯示的命令結果輸送至 Where-Object Cmdlet,如下列範例所示。

PS C:\Users\Peter>Get-SPLogEvent -StartDate $SDate -EndTime $EDate |
  where {$_.Correlation -eq "68bc5cf4-5a8c-4517-a879-86e35e57c862"}

輸出只會顯示這兩個日期之間,與該「相互關聯識別碼」相關聯之問題的事件記錄。

管理 SharePoint Services

在執行 [SharePoint 2010 產品設定精靈] 來將 SharePoint 安裝在伺服器上之後,您可以使用 SharePoint 2010 管理中心網站來啟動 [伺服器陣列設定精靈]。雖然它可以讓您非常快速地啟動並執行,但可能不會依您的需求設定伺服器陣列;例如,它建立的資料庫名稱格式為 name_GUID,其中 GUID 是隨機產生的全域唯一識別碼。此外,伺服器陣列精靈會使用輸入為預設內容 Web 應用程式之「應用程式集區身分識別」的帳戶,並依預設啟動 Web Analytics Service;在實際執行伺服器陣列上,不會想要有上述這兩種情形。

如果您要建立快速的原型,或者您是在開發人員環境中使用 SharePoint,則可能使用精靈就夠了。然而,如果其中有任何環境的 CPU 能力或記憶體數量有限,伺服器陣列精靈可能就不適合了。例如,Web Analytics Service 會使用大量 CPU,所以開發人員可能會想要停止該服務。他們可能會想要定期啟動及停止其他服務,尤其是如果他們將其電腦用作日常桌面連線的話,他們會在該電腦上讀取電子郵件及完成文件,也會執行 SharePoint 來進行開發或原型作業。

您可以使用管理中心網站之類的工具來管理設定;然而,您可能會忘記執行完成設定變更所需的所有工作。或者,您可以使用 Windows PowerShell 指令碼 (在您測試過,確定您沒有忘記任何工作之後),這樣應該會讓管理設定變更的工作更加可靠,也比較不會出錯。在開發這些指令碼之後,應將其儲存在中心位置,以便共事的管理員使用及納入其環境中。您的開發人員可能也會感謝您開發這些指令碼。這類自動化工作可能包含下列項目:

  • 若要快速刪除特定 Web 應用程式,請輸入

    Get-SPWebApplication http://teams | Remove-SPWebApplication –Confirm

  • 若要移除 Web 應用程式、IIS 網站及所有相關聯的資料庫,請輸入

    Remove-SPWebApplication http://teams –Confirm –DeleteIISSite ' -RemoveContentDatabases

如果您不執行 [伺服器陣列設定精靈],可能會發現您需要一個本來認為不需要的服務。例如,若沒有啟動任何應用程式服務,而您嘗試使用其中一個 SharePoint 2010 工作流程,則將不會顯示工作流程進度的 Microsoft Visio 圖表。然而,若要解決此問題,您就不只要建立 Visio Application Service 了。這還牽涉到其他相依項目,其中一項就是 State Service 應用程式。您只能使用伺服器陣列精靈,在管理中心網站中建立狀態服務,這是您會避免以管理員身分來執行的工作。若要使用 Windows PowerShell 來建立狀態服務,請輸入下列命令。

PS: C:\Users\Peter>New-SPStateServiceDatabase -Name Contoso_StateService_DB |
>>New-SPStateServiceApplication -Name Contoso_StateService |
>>New-SPStateServiceApplicationProxy -Name Contoso_StateService_Proxy -Default
>><ENTER>

注意

如果相關聯的服務執行個體沒有執行,此命令無法在您的環境中運行。如需較全面性的指令碼,請參閱<SP+PS 2010:用來建立服務應用程式的 PowerShell>,網址為 https://sharepoint.microsoft.com/blogs/zach/Lists/Posts/Post.aspx?ID=50(可能為英文網頁)

每個服務應用程式都有些微不同。例如,並非服務應用程式都需要資料庫。第 7 章<擴充 SharePoint 伺服器陣列>有包含更多相關資訊。然而,每個服務都需要服務應用程式 Proxy,以將 Web 應用程式連線至服務應用程式。

在升級程序期間使用 Windows PowerShell

以下各節提供您在升級期間,可能會覺得很好用的一些 Windows PowerShell 命令的相關資訊。第 22 章<升級至 SharePoint 2010>中有較詳細的升級程序說明。

準備升級

在安裝 SharePoint 2010 之後,升級之前,您可以使用 Test-SPContentDatabase Cmdlet 來檢查 SharePoint Server 2007 資料庫是否有現行或潛在的問題,例如孤立的資料、遺漏的網站定義、遺漏的功能或遺漏的組件。此 Cmdlet 可補充第 22 章中提到的升級前檢查程式報告。檢查這些問題並不會中斷 SharePoint 安裝,而且此 Cmdlet 也可以測試 SharePoint 2010 資料庫的狀態,以協助您維持環境的健康狀況。下列範例顯示該命令及其範例輸出。

Test-SPContentDatabase -name W_intranet -WebApplication http://www.contoso.msft

Category        : SiteOrphan
Error           : True
UpgradeBlocking : False
Message         : Database [W_intranet] contains a site (Id = [46ad6d70-9a5c-4d
                  e0-8daa-0f73f2466a6a], Url = [/]) whose id is already associa
                  ted with a different database (Id = [6987d2d8-6291-4ead-9eb0-
                  aefe7097a58e], name = [W_Intranet]) in the site map. Consider
                  deleting one of these sites which have conflicting ids.
Remedy          : The orphaned sites could cause upgrade failures. Try detach a
                  nd reattach the database which contains the orphaned sites. R
                  estart upgrade if necessary.

Category        : SiteOrphan
Error           : True
UpgradeBlocking : False
Message         : Database [W_intranet] contains a site (Id = [46ad6d70-9a5c-4d
                  e0-8daa-0f73f2466a6a], Url = [/]) whose url is already used b
                  y a different site, in database (Id = [6063e77c-991f-4c4b-b3a
                  c-68cb62e66502], name = [w_Internet]), in the same web applic
                  ation. Consider deleting one of the sites which have conflict
                  ing urls.
Remedy          : The orphaned sites could cause upgrade failures. Try detach a
                  nd reattach the database which contains the orphaned sites. R
                  estart upgrade if necessary.

執行升級後工作

升級程序分為兩個元件:內容資料庫升級和視覺更新。將這兩個元件分開,可讓 SharePoint 小組決定在使用者不會注意到變更的情況下升級 Microsoft Office SharePoint Server 2007 Web 應用程式,因為其網站會維持舊的外觀與風格。他們可以使用瀏覽器來預覽採用新的 SharePoint 2010 外觀與風格時的網站外觀,然後再決定何時要永久轉換成該視覺更新。轉換之後,瀏覽器就不會允許他們換回 SharePoint Server 2007 外觀與風格。

Set-SPWeb Cmdlet 沒有任何參數可以幫助此工作;您將需要使用 SPWeb 物件的屬性來完成此工作。如果您要將網站轉換回舊的外觀與風格,請輸入下列命令。

Start-SPAssignment -Global
$web = Get-SPWeb http://teams ;
$web.UIVersion = 3;
$web.UIVersionConfigurationEnabled = $true;
$web.Update();
Stop-SPAssignment

注意

之前在本章中,您建立了變數來儲存值和物件。變數名稱前面會加上貨幣符號 $。在這裡顯示的範例程式碼中,您會看到其使用 $true。這種搭配一些看起來像變數的其他關鍵字是特殊變數的範例。特殊變數應視為保留字,不能用在指令碼中來儲存值或物件。特殊變數 $true 代表值 True,$false 代表 False,$null 代表 null,而本章中也有使用 $_,其包含現行管線物件。它是用在指令碼區塊、篩選及 Where Cmdlet 中。

執行這些命令之後,網站將會回復成 SharePoint Server 2007 外觀與風格。例如,[網站動作] 按鈕會在右上角,而不是在左上角。[網站動作] 功能表將會有 [視覺更新] 選項,但是在網站集合層級可能不會啟用 [視覺更新] 選項。若要在網站集合層級啟用 [視覺更新] 選項,請使用下列命令。

$site = Get-SPSite http://teams
$site.UIVersionConfigurationEnabled = $true

在更新 SPSite 物件的屬性時,並沒有更新方法;對 SPSite 屬性的變更會立即生效。您可以輸入下面這行命令來替代上面兩行命令。

(Get-SPSite http://teams).UIVersionConfigurationEnabled = $false

若要將網站集合中的所有「小組」網站重設回 SharePoint Server 2007 外觀與風格,請使用下列命令。

PS C:\Users\zzspfarm> Get-SPsite http://teams |
>> Get-SPWeb -Filter {$_.Template -eq "STS#0}|
>> ForEach-Object {
>> $_.UIVersion =3;
>> $_.UIVersionConfigurationEnabled = $false;
>> $_.Update();
>> }
>><ENTER>

注意

這些命令也可以在尚未升級的網站或網站集合上執行 (亦即,在建立成第 4 版網站的網站上),進而使 SharePoint 2010 網站看起來像 SharePoint 2007 網站。

摘要

本章說明如何熟悉 SharePoint 2010 採用的新 Windows PowerShell Cmdlet。它將探索 SharePoint 2010 管理命令介面,以及如何使用單行 Windows PowerShell 命令來完成一些簡單但功能強大的管理工作。

SharePoint Cmdlet 有 500 個以上。本章不可能一一說明每個命令;其目的是要提供一些通用準則和好的作法,以在實際執行環境中使用 SharePoint PowerShell,例如遠端管理的設定和使用、記錄的自願性使用,以及 –whatif 參數的使用。第一次請勿在實際執行環境中練習或測試 Windows PowerShell 命令。如果是要由不熟悉 Windows PowerShell 的管理員來支援指令碼,請讓指令碼保持簡單、使用註解來記載您的指令碼,並且不要使用或建立別名。

本章涵蓋兩個重要 Cmdlet:Start-SPAssignment 及 Stop-SPAssignment,並詳細說明。這兩個 Cmdlet 有助於 Cmdlet 傳回可處置物件,例如 SPSite、SPWeb 及 SPSiteAdministration。介紹其他 SharePoint Cmdlet 是為了擴展您對 Windows PowerShell 技巧的知識。第 12 章以本章為基礎,使用搜尋案例。下一章將繼續討論 SharePoint 2010 伺服器陣列管理,尤其是管理中心介面。