ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

SharePoint Onlineサイトのうち外部共有が有効かつ現在ゲストがいないサイトをPowerShellを使ってCSVに出力する

f:id:wataruf01:20220322001021p:plain
このPowerShellスクリプトの目的は外部ユーザーと共有しているSharePointサイトの棚卸です。下記の投稿に載せているチームの棚卸と合わせて作成しました。
qiita.com

スクリプトの目的と出力内容

このスクリプトでは掲題の通り、「外部共有が有効」かつ「現在ゲストがいないサイト」を検知することを目的にしています。

このPowerShellスクリプトでは以下の3つの条件にすべて合致しているSharePointサイトをCSVに出力します。サイトテンプレートの種類等は要件によってソースコードの該当箇所を変更してください。

【条件】
1. コミュニケーションサイトである
(サイトテンプレートが「SITEPAGEPUBLISHING#0」)
2. 外部共有が有効である
3. 指定したSharePointグループにメンバーがいない
(グループ名が「○○閲覧者」もしくは「○○Visitors」)

CSVへの出力内容は「サイト名」「サイトURL」「サイトID」の3つです。
f:id:wataruf01:20220322001104p:plain

使い方

スクリプトを実行するために必要なモジュールをPCにインストールします。管理者権限で下記コマンドを実行してください。

モジュールのインストールコマンド

Install-Module -Name Microsoft.Online.SharePoint.PowerShell

スクリプトは以下の通りです。

ゲストユーザーを有効にしているサイトの棚卸

#-------------------------------------------------
#実行アカウント
#-------------------------------------------------
#$user     = "XXX@XXX.onmicrosoft.com"
#$password = "XXX" | ConvertTo-SecureString -AsPlainText -Force

$credential = New-Object System.Management.Automation.PSCredential($user,$password)

#-------------------------------------------------
#変数の設定
#-------------------------------------------------
#出力するCSVのパス
$now = (Get-Date).ToString("yyyyMMdd_HHmm")
$CSVFilePath = ".\InventorySharePointSite_" + $now + ".csv"

#SharePoint管理センターのURL
$SharePointAdminCenterUrl = "https://m365xxxxxxx-admin.sharepoint.com/"

#-------------------------------------------------
#主処理
#-------------------------------------------------
#SharePoint Onlineに接続する
Connect-SPOService -Url $SharePointAdminCenterUrl -Credential $credential

#テナントを取得する
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SharePointAdminCenterUrl)
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user,$password)
$tenant = New-Object Microsoft.Online.SharePoint.TenantAdministration.Tenant($ctx) 

#SharePointサイトをすべて取得する
$sites = Get-SPOSite -Limit All

#条件に合致するサイトをCSVに出力する
foreach($site in $sites)
{
    #コミュニケーションサイトでなければスキップする
    if($site.Template -ne "SITEPAGEPUBLISHING#0")
    {
        continue
    }

    #外部共有がオフであればスキップする
    if($site.SharingCapability -eq "Disable")
    {
        continue
    }

    #指定したSharePointグループにユーザーがいればスキップする
    $groups = Get-SPOSiteGroup -Site $site.Url
    $group  = $groups | where { $_.Title -Like "*閲覧者" -or $_.Title -Like "*Visitors" }    

    if([string]::IsNullOrEmpty($group) -eq $true)
    {
        continue
    }
    if($group.Users.Count -ne 0)
    {
        continue
    }

    #サイトIDを取得
    $siteObject = $tenant.GetSiteByUrl($site.Url)
    $ctx.Load($siteObject)  
    $ctx.ExecuteQuery()  
    $siteID = $siteObject.Id | select -ExpandProperty Guid

    $obj = New-Object PSObject
    $obj | Add-Member -MemberType NoteProperty -Name Title  -Value $site.Title
    $obj | Add-Member -MemberType NoteProperty -Name Url    -Value $site.Url
    $obj | Add-Member -MemberType NoteProperty -Name SiteID -Value $siteID

    $obj | Export-Csv -Path $CSVFilePath -Encoding UTF8 -NoTypeInformation -Append -force
}

GitHubにもアップロードしました。
github.com

以上です。