このPowerShellスクリプトの目的は外部ユーザーと共有しているSharePointサイトの棚卸です。下記の投稿に載せているチームの棚卸と合わせて作成しました。
#スクリプトの目的と出力内容
このスクリプトでは掲題の通り、「外部共有が有効」かつ「現在ゲストがいないサイト」を検知することを目的にしています。
このPowerShellスクリプトでは以下の3つの条件にすべて合致しているSharePointサイトをCSVに出力します。サイトテンプレートの種類等は要件によってソースコードの該当箇所を変更してください。
【条件】
- コミュニケーションサイトである
(サイトテンプレートが「SITEPAGEPUBLISHING#0」) - 外部共有が有効である
- 指定したSharePointグループにメンバーがいない
(グループ名が「○○閲覧者」もしくは「○○Visitors」)
CSVへの出力内容は「サイト名」「サイトURL」「サイトID」の3つです。
#使い方
スクリプトを実行するために必要なモジュールを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にもアップロードしました。
以上です。