使用 Windows PowerShell 管理 SharePoint Online

 

上次修改主題的時間: 2015-03-09

**摘要:**使用 Windows PowerShell,以使用 Windows PowerShell Cmdlet、指令碼和批次程序來管理 Office 365。

您可以使用 SharePoint Online 指令程式來管理 SharePoint Online。(看到了嗎?並非所有的軟體名稱都是含意模糊及隱匿的。)在其目前概念中,Windows PowerShell 的 SharePoint Online 實作有其限制:可供 Office 365 系統管理員使用的指令程式只有 30 個,且目前您無法使用 Windows PowerShell 來管理如 SkyDrive Pro、SharePoint Online 搜尋、SharePoint Online 字詞庫、使用者設定檔等項目。這是否意味著沒有理由使用 Windows PowerShell 來管理 SharePoint Online?我們先別這麼快下結論。從顯示的結果看來,SharePoint Online 中有幾個重要部分不僅可以透過 Windows PowerShell 進行管理,而且還可以透過 Windows PowerShell 獲得極佳的管理成效。

使用 Windows PowerShell 管理 SharePoint Online

本主題將涵蓋下列主題:

  • 使用 SharePoint Online 站台

  • 使用 SharePoint Online 使用者

  • 使用 SharePoint Online 站台群組

  • 與 ForEach-Object Cmdlet 相關的備註

如需使用 Windows PowerShell 來管理 SharePoint Online 的詳細資訊,您可以參閱 SharePoint Online 指令程式參照,您可以在此處找到一組說明主題。

另外,千萬別漏掉下面這兩篇文章,內容涵蓋許多適用於 SharePoint Online 的實用 Windows PowerShell 命令:

使用 SharePoint Online 站台

我們能否提供您可使用 Windows PowerShell 管理 SharePoint Online 相關區域的範例?當然可以。Windows PowerShell 的其中一項實用功能是協助您識別 SharePoint Online 站台的子集。在大型組織中有大量站台是極為常見的,甚至有數以千百計的站台。這有問題嗎?當然沒有。不過,假設您有幾百個站台,想要知道其中有多少個站台是 Wiki,也就是想要知道有多少個站台是使用企業 Wiki 範本 (正式名稱為 ENTERWIKI#0 的範本) 建立而成。您可使用 SharePoint Online 管理中心來尋找這些資訊嗎?我們不會說您無法使用這種方法來尋找此資訊,不過不會很容易就找到。且它絕對不會像執行此一 Windows PowerShell 命令那麼簡單:

Get-SPOSite | Where-Object {$_.Template -eq "ENTERWIKI#0"}

換句話說,我們使用 Get-SPOSite Cmdlet 傳回所有站台的資訊,然後使用 Where-Object Cmdlet 選擇範本內容等於 ENTERWIKI#0 的站台。

注意

我們怎麼知道企業 Wiki 範本的正式名稱為 ENTERWIKI#0?很簡單:只要執行此命令:
Get-SPOWebTemplate

或者,您可能想要列出儲存配額大於 1000 MB 或小於 250 MB 的所有站台。使用 Windows PowerShell 可以快速輕鬆辦到嗎?當然可以:

Get-SPOSite | Where-Object {$_.StorageQuota -gt 1000 -or $_.StorageQuota -lt 250}

這是目前為止較為複雜的查詢,不過一旦您知道其中的語法,便可了解運作方式。於此範例中,我們尋找符合下列其中一個準則的站台。只要站台:1) StorageQuota 大於 (-gt) 1000 MB;或 (-or) 2) StorageQuota 小於 (-lt) 250 MB。假設我們有 4 個站台:

網站 StorageQuota

站台 A

180

站台 B

700

站台 C

300

站台 D

1500

使用此範例日期,將傳回站台 A,因為 StorageQuota 小於 250。另外也將傳回站台 D,因為其 StorageQuota 大於 1000。站台 B 和 C 不符合準則,因此不會傳回這兩個站台。

另外還有一個有趣的範例。假設您想要列出非系統管理員擁有的所有站台,也就是擁有者等於我們範例中 admin@litwareinc.onmicrosoft.com 以外其他人的所有站台。很容易就可以撰寫該命令,幾乎毫不費力:

Get-SPOSite | Where-Object {$_.Owner -ne "admin@litwareinc.onmicrosoft.com"}

雖然很容易,但不代表沒有用,不是嗎?

使用 SharePoint Online 使用者

Windows PowerShell 是與 SharePoint Online 網站使用者一起工作的極有用工具。您可以使用 Windows PowerShell 和 Get-SPOUser Cmdlet,傳回所有已獲授與網站存取權的使用者清單。很簡單:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance"

您只需要呼叫 Get-SPOUser,其後接著感興趣的網站 URL。

或者,如果您只想要具有網站存取權的使用者 (而非群組),則可以使用此命令:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance" | Where-Object {$_.IsGroup -eq $False}

這也十分簡單:我們只要求 IsGroup 屬性設定為 False 的網站使用者。(在 Windows PowerShell 中,撰寫命令時,會使用 $True 和 $False,而非只是舊的 True 和 False。)

就像只傳回為網站管理員的使用者一樣簡單;亦即,IsSiteAdmin 屬性為 True 的使用者:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance" | Where-Object {$_.IsSiteAdmin -eq $True}

但這僅適用於一個網站。當您需要使用多個物件時 (就像多個網站),通常可以使用 Windows PowerShell 的功能。例如,最好有所有具有指定網站存取權的使用者清單。但反過來說呢:單一使用者具有存取權的所有網站清單又如何?您可以使用 Windows PowerShell 完成這項作業嗎?當然可以。以下為相當簡單的指令碼 (無可否認地,對具有一些 Windows PowerShell 經驗的人來說十分簡單),可傳回特定使用者 (在此範例中,是 Ken Myer) 具有存取權的所有網站名稱:

$x = (Get-SPOSite).Url

foreach ($y in $x)
    {
        $z = $Null
        $z = Get-SpoUser -Site $y | Where-Object {$_.DisplayName -eq "Ken Myer"}
        if ($z -ne $Null) {$y}
    }

注意

如何在 Windows PowerShell 中使用指令碼?如下所示:複製先前的程式碼,並將其貼入 [記事本] (或另一個文字編輯器),然後使用副檔名 .ps1 儲存檔案 (例如,C:\Scripts\SitesAUserCanAccess.ps1)。若要執行指令碼,請使用 Windows PowerShell 連線至 SharePoint Online,然後僅於 Windows PowerShell 命令提示字元中鍵入 .ps1 檔案的路徑,並按 ENTER 鍵:
C:\Scripts\SitesAUserCanAccess.ps1

或者,所有網站以及每個網站的系統管理員清單如何?使用單一命令,可以傳回該資訊:

Get-SPOSite | ForEach-Object {Write-Host $_.Url; Get-SPOUser -Site $_.Url | Where-Object {$_.IsSiteAdmin -eq $True}}

您應該會收到與下述類似的內容:

https://litwareinc.sharepoint.com/sites/communities
MOD Administrator  admin@litwareinc.com {Communities Members, Comm...}
Sara Davis  sarad@litwareinc.com {Communities Members, Communities...}

https://litwareinc.sharepoint.com/sites/finance
MOD Administrator admin@litwareinc.com {Excel Services Viewers, Hi...}

https://litwareinc.sharepoint.com/sites/hr
MOD Administrator  admin@litwareinc.com   {Contoso Beta Members, C...}

即使這不是最漂亮的輸出,但不用說,外表不代表任何事。而且,在您獲得更多經驗且略微熟悉如何使用 Windows PowerShell 時,將會了解如何使用各種很酷的方式來自訂該輸出。

最棒的是,Windows PowerShell 不只是擷取事物的方式:它也是設定事物的方式。假設您有數百個網站,而且需要將 Ken Myer 設為每個網站的系統管理員嗎?您要做的就是提出要求:

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

不錯吧?

使用 SharePoint Online 站台群組

不要擔心:我們不會忘記網站群組。實際上,Windows PowerShell 是一種管理 SharePoint 網站群組的好方法。SharePoint Online 系統管理中心有一些便於使用的方法來管理網站群組,但是要使用這些方法可能有些麻煩。例如,假設您想要查看網站 https://litwareinc.com/sites/finance 的群組和群組成員。則以下是您必須執行的作業:

  1. 從 SharePoint Online 系統管理中心的 [網站集合] 索引標籤上,按一下網站名稱。

  2. 在 [網站集合內容] 對話方塊中,按一下可開啟 https://litwareinc.com/sites/finance 的連結。

  3. 在網站頁面上,按一下 [設定] 圖示 (位於頁面右上角),然後按 [網站設定]:

    SharePoint Online 網站設定選項。

  4. 在 [網站設定] 頁面上,按一下 [網站和權限]。

然後針對下一個想要查看的網站,重複此程序。

因此,是否有其他方法可以取得指定網站中的所有群組和其使用者清單?是的,至少還有一種方法:

$x = Get-SPOSiteGroup -Site "https://litwareinc.com/sites/finance"

foreach ($y in $x)
    {
        Write-Host $y.Title -ForegroundColor "Yellow"
        Get-SPOSiteGroup -Site "https://litwareinc.com/sites/finance" -Group $y.Title | Select-Object -ExpandProperty Users
        Write-Host
    }

不可否認地,前一個指令碼比到目前為止顯示的大部分命令稍微複雜一點。而且,也稍微麻煩一點:歸根結底,您需要複製程式碼、將它貼到 [記事本] (或某個其他文字編輯器)、使用副檔名 .ps1 儲存檔案 (例如,C:\Scripts\SiteGroupsAndUsers.ps1),然後從 Windows PowerShell 執行指令碼。雖然,就像我們所說的,這會「稍微」麻煩一點,但是,歸根究柢,執行指令碼只包含輸入 .ps1 檔案的完整路徑:

C:\Scripts\SiteGroupsAndUsers.ps1

因此,是的,這需要投入一點努力。但是,看一下執行這極少量的工作所獲得的回饋:

網站群組和網站群組成員。

這些是已針對網站 https://litwareinc.com/sites/finance 建立的所有群組,以及指派給那些群組的所有使用者。(而且,為了更清楚地識別,我們用黃色顯示群組名稱,協助您區分群組和其成員資格清單。)

而且,如果您認為還有其他項目,則請等待,直到您看到此指令碼:

$x = Get-SPOSite

foreach ($y in $x)
    {
        Write-Host $y.Url -ForegroundColor "Yellow"
        $z = Get-SPOSiteGroup -Site $y.Url
        foreach ($a in $z)
            {
                 $b = Get-SPOSiteGroup -Site $y.Url -Group $a.Title 
                 Write-Host $b.Title -ForegroundColor "Cyan"
                 $b | Select-Object -ExpandProperty Users
                 Write-Host
            }
    }

該指令碼列出所有 SharePoint Online 網站 (每個網站) 的所有群組和所有群組成員資格。請試試,看看您自己的網站。

現在,您是否了解為何可能會想要使用 Windows PowerShell 來管理 SharePoint Online?

與 ForEach-Object Cmdlet 相關的備註

在使用 SharePoint Online 使用者一節中,您可能已經注意到我們將網站資訊輸送至 ForEach-Object Cmdlet:

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

這引發一個有趣的問題:為什麼這麼做?搭配 Azure Active Directory Cmdlet 使用時,我們會直接將資訊從 Get-MsolUser Cmdlet 傳送至 Set-MsolUser Cmdlet:

Get-MsolUser | Set-MsolUser -UsageLocation "FR"

那麼,為什麼我們不搭配使用 SharePoint Online 命令:

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

不使用的主要原因是沒有用。使用 Set-SPOUser Cmdlet 時,您必須明確包含 Site 參數,後面加上站台的名稱。例如:

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/communities" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

這表示,若您嘗試直接將資訊傳送至 Set-SPOUser,該 Cmdlet 將不會取得我們的所有站台,並使 Ken Myer 成為各個站台的系統管理員。它反而會提示我們輸入站台 URL:

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True
cmdlet Set-SPOUser at command pipeline position 2
Supply values for the following parameters:
Site: 

這表示,我們需將站台資訊傳送給 ForEach-Object Cmdlet。ForEach-Object 將取得各個傳送的項目 (各個站台),然後依指示的任何方式處理該項目。在此情況下,我們告訴它使用 Set-SPOUser Cmdlet 以使 Ken Myer 成為該站台的系統管理員:

Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

語法 $_.Url 代表站台的 URL。**$_.**表示我們正使用其他 Cmdlet 傳送至 ForEach-Object Cmdlet 的資訊。

搞混了嗎?以下是個快速的範例。假設有三個網站使用下列 URL:

當我們將這些資訊傳送至 ForEach-Object 時,該 cmdlet 會取得集合 (site1) 中的第一個項目,並對該站台使用 URL 來執行 Set-SPOUser Cmdlet。換句話說,它會執行此命令:

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/site1" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

完成後,它會接著取得第二個站台 (site2),並對該站台執行 Set-SPOUser:

Set-SPOUser –Site "https://litwareinc.sharepoint.com/sites/site1" –LoginName "kenmyer@litwareinc.com" –IsSiteCollectionAdmin $True

如您所見,現在它使用集合中第二個網站的 URL。最後,ForEach-Object 將會執行集合中所有的站台,並使 Ken Myer 成為各個站台的系統管理員。

如需詳細資訊,請參閱這篇文章。不用說,ForEach-Object 實際上是個相當方便的小 Cmdlet。例如,您嘗試將資訊從一個 Cmdlet 傳送到另一個時,會出現如下所示的錯誤訊息:

The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

這之所以發生,是因為並非所有 Cmdlet 都接受傳送的輸入。要如何解決這個問題?您知道的:使用 ForEach-Object。

另請參閱

使用 Windows PowerShell 管理 Office 365 的最佳方式