前提
Connect-MSGraphでのサインインをCUI化する方法を書いています。
通常Connect-MSGraphコマンドだけを単体で実行するとブラウザ経由で管理者権限でのGUIサインインの入力を求められます。その手順をCUIで実現することが目的です。
Connect-MSGraphは動作が不安定で、同じ環境で複数回実行しても成功することと失敗することがあります。そのため、ログインが成功するまでwhileでループさせて、try-catch文でエラーをキャッチした場合はリトライし、成功するまでサインインを繰り返す方式を取っています。
Microsoft側のサーバー負荷やAPI回数制限のことを考慮して再接続を試すまでに3秒インターバルを置いています。
また、パスワードをコード内にベタ書きするのはセキュリティ的に望ましくないため、暗号化パスワードファイルをあらかじめ生成しておいて、ログインの際にそのファイルの中身を取得する方法をとっています。
Connect-MSGraphがIntune-PowerShell-SDKのメソッドなので当然ですが、Intune-PowerShell-SDKが実行PCにインストールされていないと動きません。
また、本記事はIntuneSDKのConnect-MSGraphメソッドについてのものですが、Connect-AzureADなどでも流用できるかと思います。
開発歴一年くらいの人間が書いてるのでツッコミ歓迎します。
■参考資料
・microsoft / Intune-PowerShell-SDK(公式ドキュメント)
https://github.com/microsoft/Intune-PowerShell-SDK
IntuneSDKのGitHubです。SDKのインストール手順も記載されています。
※インストールがエラーになる場合、Powershellの実行ポリシーが変更されてるかもチェックしてください。
・パスワードをスクリプトに埋め込むなんてありえない!Tableau ServerのTSMコマンド用スクリプトへ移行する方法
Graph APIに関する記事ではありませんが、Powershellでのパスワード暗号化ファイルの作成手順として流用しています。
https://dev.classmethod.jp/business/bigdata/20181017-tableau-server-migrate-tsm-command-for-regacy-scripts/
・Microsoft Graph 調整ガイド(公式ドキュメント)
APIリクエストの回数制限について記載されています。
https://docs.microsoft.com/ja-jp/graph/throttling
事前準備
暗号化パスワードファイルの作成
$FilePathはパスワードファイルを生成したいパスに変更してください。
$Credential = Get-Credential
$Credential.Password | ConvertFrom-SecureString | Set-Content $FilePath```
上記を実行するとアカウントとパスワードが生成されるので、Graph APIで使用するアカウントとパスワードを入力してください。
サインイン後、指定したパスに暗号化されたパスワードファイルが生成されます。
※他のPCで作成したパスワードファイルは流用できないようなので、
Powershellの実行PCが変わったときはパスワードファイルの再作成が必要です。
# サインイン
サインイン用アカウントを指定
$adminUPN = "test@xxxx.co.jp"
パスワードファイルのパスを指定
$adminPwd = Get-Content "C:\Users\administrator\Desktop\password.sec" | ConvertTo-SecureString
$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($adminUPN, $adminPwd)
while($true){
try {
# 3秒待つ
Start-Sleep -s 3
Connect-MSGraph -PSCredential $creds
return;
}
catch
{}
}
成功後、Invoke-MSGraphRequestメソッドが使えるようになります。
以上