Windows PowerShell を使用した SharePoint Online の管理

 

**概要:**Windows PowerShell を使用して Office 365 を管理する際に Windows PowerShell コマンドレット、スクリプト、およびバッチ プロセスを使用します。

SharePoint Online は、SharePoint Online コマンドレットを使用して管理することができます。(このとおり、すべてのソフトウェアの名前が不可解で曖昧なわけではありません。)Windows PowerShell の SharePoint Online 実装には、現在のところ多少の制約があります。具体的には、Office 365 管理者が使用できるコマンドレットは 30 に限られていて、現時点では Windows PowerShell を使用して OneDrive Pro、SharePoint Online 検索、SharePoint Online 用語ストア、ユーザー プロファイルなどを管理することはできません。つまり、Windows PowerShell を使用して SharePoint Online を管理する理由がないということですか。もっとじっくり考えましょう。結局のところ、SharePoint Online には、Windows PowerShell を使用して管理できるというだけでなく、Windows PowerShell を使用するからこそ極めて効率的に管理できる重要な部分があります。

SharePoint Online の管理に Windows PowerShell を使用する

このトピックでは、以下のトピックについて説明します。

  • SharePoint Online サイトの操作

  • SharePoint Online ユーザーの操作

  • SharePoint Online サイト グループでの作業

  • ForEach-Object コマンドレットに関するクイック ノート

Windows PowerShell を使用して SharePoint Online を管理する方法の詳細については、SharePoint Online コマンドレット リファレンスのヘルプ トピックを参照してください。このリファンレスには、ここからアクセスできます。

また、SharePoint Online に役立つ Windows PowerShell コマンドが満載されている以下の 2 つの記事も忘れずに参照してください。

SharePoint Online サイトの操作

Windows PowerShell を使用して管理できる SharePoint Online 関連の領域の例を挙げてもよいでしょうか。以下のとおりです。Windows PowerShell が本領を発揮するのは、SharePoint Online サイトのサブセットを特定するときです。大規模な組織には多数のサイトがあり、数百や数千のサイトも珍しいことではありません。それに関して何か問題があるでしょうか。もちろん、ありません。ただし、数百のサイトがあって、その中の Wiki の数を知りたい、つまり、エンタープライズ Wiki テンプレート (公式には、ENTERWIKI#0 という名前のテンプレート) を使用して構築されたサイトの数を知りたいとします。この情報を SharePoint Online 管理センターを使用して見つけることができますか。その方法では見つけることができないとは言いませんが、簡単ではありません。次の 1 つの Windows PowerShell コマンドを実行するほど簡単ではないことは確かです。

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

つまり、Get-SPOSite コマンドレットを使用して、すべてのサイトに関する情報を返してから、Where-Object コマンドレットを使用して Template プロパティが ENTERWIKI#0 と等しいサイトのみを抽出します。

注意

エンタープライズ Wiki テンプレートが正式に ENTERWIKI#0 という名前であることはどうしたわかったのですか。答えは簡単です。次のコマンドを実行しただけです。
Get-SPOWebTemplate

または、ストレージ クォータが 1000 MB より大きいか、250 MB より小さいすべてのサイトのリストが欲しいとします。Windows PowerShell 使用すれば、これをすばやく簡単に実行できますか。もちろん、できます。

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

これは、今まで見たなかでは少し複雑なクエリですが、専門用語がわかれば、その動作を難なく理解できるはずです。この例では、2 つの条件のうちのどちらかを満たしているサイトを探します。サイトは、1) StorageQuota が 1000 MB より大きい (-gt)か (-or)、2) StorageQuota が 250 MB より小さい (- lt) かのどちらかです。次の 4 つのサイトがあるとします。

サイト StorageQuota

サイト A

180

サイト B

700

サイト C

300

サイト D

1500

このサンプル データを使用すると、StorageQuota が 250 未満であるためサイト A が戻ります。サイト D の StorageQuota は 1000 より大きいため、サイト D も戻ります。サイト B と C はどちらの基準も満たさないため戻りません。

ここで、別の例を示します。管理者が所有していないすべてのサイト、つまり、この例では Owner が admin@litwareinc.onmicrosoft.com 以外の誰かと等しいすべてのサイトのリストが欲しいとします。このコマンドを、次に示すように疑いたくなるほど簡単に書けます。

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

それが簡単だからといって役に立たないというわけではありません。そうでしょう。

SharePoint Online ユーザーの操作

Windows PowerShell は、SharePoint Online サイトのユーザーに対する操作を行うための非常に便利なツールです。たとえば、Windows PowerShell と Get-SPOUser コマンドレットを使用して、あるサイトへのアクセス権が付与されたすべてのユーザーの一覧を返せます。答えは簡単です。

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}

しかしこれらの例は、1 つのサイトだけが対象となる場合です。Windows PowerShell の (言うならば) 力は、複数のサイトなど、複数のオブジェクトを対象に作業するときに明らかになります。たとえば、特定のサイトにアクセスできるすべてのユーザーの一覧を受け取ることができます。しかし、逆の場合はどうでしょうか。ある単一のユーザーがアクセスできるすべてのサイトの一覧の場合です。この場合も、Windows PowerShell を使用して一覧を受け取れますか。もちろん、できます。次に示すのは、特定のユーザー (この例では Ken Myer) がアクセスできるすべてのサイトの名前を返す、簡単で小さなスクリプトです (簡単といっても、それは Windows PowerShell の使用経験が幾らかある場合です)。

$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 でスクリプトをどのように使用するのでしょうか。以下のようにします。前述のコードをコピーして、メモ帳 (または別のテキスト エディター) に貼り付け、そのファイルを .psl ファイル拡張子を使用して保存します (例: 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. [サイトの設定] ページで、[サイトとアクセス許可] をクリックします。

参照する次のサイトでも、このプロセスを繰り返します。

では、特定のサイトからすべてのグループと、そのユーザーの一覧を取得する別の方法があるのでしょうか?少なくとも 1 つの方法があります。

$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 サイトの、すべてのグループとグループ メンバーシップの一覧を示します。ぜひお試しになって、ご自分の目で確かめてみてください。

これで、SharePoint Online を管理する際に Windows PowerShell を使用する理由がお分かりいただけたでしょうか?

ForEach-Object コマンドレットに関するクイック ノート

「SharePoint Online ユーザーの操作」セクションで、サイト情報を ForEach-Object コマンドレットにパイプしたことに気付いた人もいるでしょう。

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

ここで、「なぜそうしたのか」という素朴な疑問が生まれます。やはり、Azure Active Directory コマンドレットを使用したときも、Get-MsolUser コマンドレットから Set-MsolUser コマンドレットに直接情報をパイプしました。

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

それでは、なぜ SharePoint Online コマンドでは同じことをしなかったのでしょうか。

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

そうしなかった主な理由は正しく機能しない可能性があるからです。Set-SPOUser コマンドレットを使用する場合は、明示的に、サイト名の前に Site パラメーターを追加する必要があります。たとえば、

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

情報を直接 Set-SPOUser にパイプしようとしても、このコマンドレットがすべてのサイトを取得して 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 コマンドレットにパイプする必要があるということです。ForEach-Object は、渡された項目を (サイトごとに) 取得してから、その項目に対する指示を実行に移します。この場合は、Set-SPOUser コマンドレットを使用して Ken Myer をそのサイトの管理者にするように指示します。

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

構文の $_.Url はサイトの URL を表します。$_. は、別のコマンドレットによって ForEach-Object コマンドレットにパイプされた情報を使用することを示します。

混乱していませんか。ここで、簡単な例を示します。次のような URL を持つ 3 つのサイトがあるとします。

この情報を ForEach-Object にパイプすると、このコマンドレットはコレクション内の最初の項目 (site1) を取得して、そのサイトの URL を使用して Set-SPOUser コマンドレットを実行します。つまり、次のコマンドを実行します。

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

このコマンドは、2 つ目のサイト (site2) を取得して、そのサイトに対して Set-SPOUser を実行します。

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

ご覧のように、コレクション内の 2 つ目のサイトの URL が使用されています。最終的に、ForEach-Object はコレクション内のすべてのサイトを回って、Ken Myer をそれぞれの管理者にします。

詳細については、この資料で確認してください。言うまでもなく、ForEach-Object は、情報を得るための実に便利な小型のコマンドレットです。たとえば、コマンドレット間で情報をパイプしようとすると、次のようなエラー メッセージが表示されることがあります。

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.

これは、すべてのコマンドレットがパイプライン処理された入力を受け取るわけではないために起こります。この問題を解決するにはどうしたらいいでしょうか。そのとおりです。ForEach-Object を使用します。

関連項目

Windows PowerShell で Office 365 を管理するための最善の方法