M365全ユーザーの予定表アクセス権限を「すべての詳細を表示」にPowerShellで一括変更(更新編)
Microsoft365(M365)の予定表アクセス権限は、初期設定では「AvailabilityOnly」になっています。この状態だとほかの人のスケジュールはすべて「予定あり」としか表示されず詳細を見ることはできません。
準備編で生成したエクセルファイルを使って更新します。準備編は以下をご覧ください。
アクセス権を変えたくないユーザーがいたら「例外」列に表示名を入力してください。そのユーザーのアクセス権は変更されません。
PowerShell
※ 必要なモジュールは適宜インストールしてください。
# スクリプトファイルがある場所のパスを取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
# Excelを操作する為の宣言
$excel = New-Object -ComObject Excel.Application
# 起動したExcelを表示しない
$excel.Visible = $False
# Excelファイルのフルパスを取得
$excelFile = (Get-ChildItem $CurrentFolder"\予定表権限_*.xlsx").FullName
# もしExcelファイルが存在していたら開く。なければ終了。
if (-not ([string]::IsNullOrEmpty($excelFile))){
$book = $excel.Workbooks.Open($excelFile, 0, $False)
}else{
Write-Host "エクセルファイルが存在しないため実行できません。"`r`n
exit
}
# エクセルファイルのデータを取得
$sheet = $book.Worksheets.Item("Sheet1")
# 例外(F列)の値を取得
$previous = @()
if (-not($sheet.Cells.Item(3, 6).text -eq "")){
$lastrow = $sheet.Cells.Item(2, 6).End([Microsoft.Office.Interop.Excel.XlDirection]::xlDown).Row
$previous_range = $sheet.Range("F4:F"+$lastrow+1)
for($i = 0; $i -lt $lastrow-2; $i++){
$previous += $previous_range[$i].text
}
}else{
$lastrow = 0
}
# 認証情報を入力
$Credential = Get-Credential
# ExchangeOnlineに接続
Connect-ExchangeOnline -Credential $credential
$total = $sheet.Cells(2, 1).End([Microsoft.Office.Interop.Excel.XlDirection]::xlDown).Row
# 最新情報を入力
for ($i = 0; $i -lt $total ; $i++) {
$per = $i / $total * 100
Write-Progress -activity "書き込み中" -status $i"/"$total -percentComplete $per
$DisplayName = $sheet.Cells.Item($i+3, 1).Text
$address = $sheet.Cells.Item($i+3, 2).Text
$FolderType = (Get-MailboxFolderStatistics -Identity $address |
Select-Object FolderPath, FolderType |
Where-Object {$_.FolderType -eq "Calendar"}).FolderPath -replace "/",":\"
$CalendarType = $address+$FolderType
$AccessRights = (Get-MailboxFolderPermission -Identity $CalendarType -User "既定").AccessRights
if ($lastrow -ne 0 ){
if (-not($AccessRights -eq "Reviewer")){
if(-not($previous -contains $DisplayName)){
Write-Host $DisplayName "の設定を書き換えました。"
Set-MailboxFolderPermission -Identity $CalendarType -User “既定” -AccessRights Reviewer
$AccessRights = "Reviewer"
}else{
Write-Host $DisplayName "の設定はそのままです。"
}
}
}
$sheet.Cells.Item($i+3, 3).value = $FolderType
$sheet.Cells.Item($i+3, 4).value = [string]$AccessRights
}
# 上書き保存
$book.Save()
# Excelを閉じる
$excel.Quit()
# プロセスを解放する
$excel = $null
[GC]::Collect()
# 接続を切断
Disconnect-ExchangeOnline -Confirm:$false
※ 本コードを利用する場合は必ず以下の免責事項をご確認ください。
おわり
この処理はめちゃくちゃ時間かかります・・・。
Get-MailboxFolderPermissionを実行する際、-Identityを「aaa@xxx.com:\予定表」の形にしますが、「予定表」の表記が英語、中国語、仏語とユーザーの環境によって様々。
そのため1件ずつ、ユーザーのフォルダタイプを抽出、アクセス権を抽出、必要に応じてアクセス権変更、の順番で処理しているので、全件実行するのにはそれなりの時間がかかってしまいます。
また、この設定はユーザー側でも変更することができるので、一応毎回全件処理するようにしています。
今のところ高速化のめどが立っていないので、この処理は余裕があるときに実行するようにしています。
おまけ
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?