グローバル管理者による SharePoint の管理

みなさん Microsoft Teams は使っていますか?

弊社では基本的な連絡は Teams を使うようになってきましたが、ドキュメントの共有についてはチームごとにバラバラで、Teams 内でファイル管理を行っているチームもあれば、オンプレのファイルサーバにファイルを共有しているチームもある状況です。

社内的には「ファイルサーバを OneDrive に置き換える」と方針が決まっており、その準備を進めているところです。

Teams と OneDrive

さて、ここまでで Teams ファイル、OneDrive と出てきましたが、この 2つの保存先は同じ場所になります。

OneDrive は、正確には OneDrive for Business を指し、SharePoint の個人用ドキュメントライブラリを OneDrive クライアントで管理できるものとなります

Teams のファイル共有の機能は、同じく SharePoint のドキュメントライブラリを参照しています。

したがって、Teams で追加したファイルを OneDrive クライアント経由でローカルに置いて作業したり、その逆に OneDrive から直接ファイルを置いたりすることができます。

もちろん SharePoint からもファイルを操作できますが、実運用上ではこの 2つの方法が主になると思われます。

管理者がチームのファイルを見られない

前置きが長くなりましたが、本題です。
「担当者が不在の場合に管理者が代理で作業ファイルを確認したい」という要望が上長からあり確認したところ、Teams から「プライベート」として作られたチームのファイルを見ることができません。

まず、ここでいう管理者は Microsoft 365 のグローバル管理者権限を持つユーザーを指しています。全ての管理権限を持つはずのユーザーなのにファイルはおろか SharePoint のチームサイトすら表示できません。

どういうことなのでしょうか?

調べてみたところ SharePoint はサイトごとに細かく権限が設定できるようになっていて以下のように分かれています。

↑ SharePoint管理センターの画面から確認できるサイト権限

SharePoint の権限出来ること
全体管理者全てのサイトの作成・変更・削除
サイトの管理者サイトの設定変更・削除、サイト内のすべてのコンテンツの作成・変更・削除
サイトの所有者サイト内のすべてのコンテンツの作成・変更・削除
参考:管理センターにおけるサイトのアクセス許可のレファレンス – SharePoint in Microsoft 365 | Microsoft Docs

ここで全体管理者 = Microsoft 365 のグローバル管理者であることはわかっていましたが、当然、サイトの管理者、サイトの所有者権限も含まれると思っていました。ところが、権限は含まれておらずそれぞれに設定しなければならないことがわかりました。(サブサイトと親サイトの間には権限の継承があるみたいですがこの件は割愛します)

このような仕組みなのはわかりましたがチームが作られる際に自動でグローバル管理者を設定してくれてもよいのですが・・・

グローバル管理者をサイト管理者に追加する

ファイルの管理が目的となるので、前項から「サイトの管理者」に追加すればよさそうです。試しに自分のアカウントを管理者に追加したところうまく行きました。

ですが、組織で運用しているので、単一のユーザーではなくグローバル管理者権限を持つ全員を管理者にしないといけません。

権限に紐づいたグループがなかったので、Azure AD の方で動的なセキュリティグループを作成してみたりいろいろと時間をつぶした結果、SharePoint Online に デフォルトで存在する管理者グループが存在することに気が付きました。

Company Administrator

これがグローバル管理者に紐づいていて、わざわざグループを作る必要がありませんでした・・・
結果、このグループを追加の管理者として設定すれば問題は解決しました。

PowerShell から一括で管理者を設定する

しばらく運用を回してしまった後に管理者に追加しようと思った場合、管理画面から1つ1つはやってられません。 そこで、PowerShell からの一括登録の方法をご案内します。

  1. インストール
    初めて操作する場合は管理者として PowerShell を起動し、以下を実行する。
Install-Module -Name Microsoft.Online.SharePoint.PowerShell 

(詳しくは https://docs.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-online/connect-sharepoint-online?view=sharepoint-ps を参照)

  1. 接続
Import-Module Microsoft.Online.SharePoint.PowerShell 
Connect-SPOService -Url <管理画面のURL 例 https://xxxxxxxxx-admin.sharepoint.com/ > 
  1. Company Administrator の Login Name を取得する
    その後に紹介するサイトへユーザーを追加する関数の引数に指定する Login Name を取得します。
$CompanyAdminLoginName = (Get-SPOUser -Site https://xxxx-admin.sharepoint.com | Where-Object{ $_.DisplayName -eq "Company Administrator"}).LoginName
$CompanyAdminLoginName 
  1. 追加の管理者として Company Administrator を追加
Set-SPOUser -Site https://xxxx.sharepoint.com/sites/privatesite -LoginName "c:0t.c|tenant|${CompanyAdminLoginName}" -IsSiteCollectionAdmin $true 

引数 Site に CompanyAdministrator を追加したサイト、
引数 LoginName に前項で取得した CompanyAdministrator の LoginName、
をセットします。

かなり苦労したのは、LoginName の指定方法、普通のユーザーの場合はメールアドレス形式の文字列を渡せばよいが、グループを指定する場合はどうすればよいのか、なかなか情報がなく、別のコマンドの利用例の記事でようやく指定方法にたどり着きました。( “c:0t|tenant|“ の意味はいまだ理解していません・・・)

  1. 全部のサイトに一括で実施する
$CompanyAdminLoginName = (Get-SPOUser -Site https://xxxx-admin.sharepoint.com | Where-Object{ $_.DisplayName -eq "Company Administrator"}).LoginName
$AllSites = Get-SPOSite -IncludePersonalSite $false

foreach($Site in $AllSites){
    $IsSiteCollectionAdmin = $false
    try{
       $User = Get-SPOUser -Site $Site.Url -LoginName "c:0t.c|tenant|${CompanyAdminLoginName}"
       $IsSiteCollectionAdmin = $User.IsSiteAdmin
    }catch{
    }
    if(!$IsSiteCollectionAdmin){
        Write-Host "$($Site.Url) に追加の管理者を追加します"
        Set-SPOUser -Site $Site.Url -LoginName "c:0t.c|tenant|${CompanyAdminLoginName}" -IsSiteCollectionAdmin $true
    }
} 

まとめ

時節柄、リモートワークも増えて、急いで Teams や OneDrive などを導入しよくわからないけど管理者の役割をおってしまった方も多いのではないでしょうか。

記事にするとたいしたこと無い内容なのですが、私のように SharePoint に関する知識がない状態からだと色々と苦労することが多いと感じました。

同じようなお悩みを抱える方のお役に少しでも立てれば幸いです。

リモートワーク導入支援サービス

関連記事

  1. 高精度気圧センサDPS310の実力を試してみた 【後編】

  2. Bluetooth SIGブログで紹介された「7つの活用方法」の詳細を…

  3. Flutter と Product と Replace と

  4. Elastic Stack を使った予兆検知結果の可視化 〜異常検知の…

  5. WPF Prism 8.0 の新機能「複数のダイアログウィンドウのサポ…

  6. 何でこうなるの?現場で起きた開発回顧録【その2-JSFライフサイクルと…