見出し画像

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件ずつ、ユーザーのフォルダタイプを抽出、アクセス権を抽出、必要に応じてアクセス権変更、の順番で処理しているので、全件実行するのにはそれなりの時間がかかってしまいます。

また、この設定はユーザー側でも変更することができるので、一応毎回全件処理するようにしています。

今のところ高速化のめどが立っていないので、この処理は余裕があるときに実行するようにしています。

おまけ

猫もうれしい小春日和

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?