Microsoft 365 のライセンス最適化と監査の自動化
By Mirko Peters ·
ポッドキャスト・ブログへようこそ!毎月届くMicrosoft 365のソフトウェア請求書を見て、誰も一度も触れていないシートに料金を払い続けているのはなぜだろうと考えたことはありませんか…
Automatically translated with AI from the original post. Read the English original
ポッドキャストブログへようこそ。月次の Microsoft 365 のソフトウェア請求書を眺めて、6か月も誰も使っていないシートに料金を払い続けているのはなぜだろうと疑問に思ったことがあるなら、あなただけではありません。ライセンス管理は、見えないところで IT 予算を静かに消耗させ、不要なコンプライアンスやセキュリティ上の負担も生み出す運用上の課題です。幸い、すぐに使える強力な自動化ツールがあります。この包括的なガイドでは、PowerShell を使って Microsoft 365 のライセンスを追跡、割り当て、取り消す方法を解説します。コストを管理し、オンボーディングを効率化し、テナント全体で厳格なコンプライアンスを確保することが目的です。開発者のワークフローやツールについてさらに知りたい方は、関連エピソードの Run Your Full Stack Locally with .NET Aspire もぜひご覧ください。
ライセンス最適化と監査の自動化の概要
Microsoft 365 テナントを手作業で管理することは、燃え尽き症候群とヒューマンエラーを招く典型的なパターンです。組織が成長するにつれて、従業員の入れ替わりや部署の再編、ソフトウェア要件の変動が激しくなります。放置すると、管理者はライセンスを抱え込んだり、退職した契約社員の料金を払い続けたり、非アクティブなアカウントに E5 のような上位ライセンスを割り当てたままにしたりしがちです。ライセンス最適化の戦略に自動化を取り入れることで、推測に頼る作業をなくせます。PowerShell を使えば、テナントのデータを照会し、利用パターンを分析し、未使用の資産をプログラムで回収できます。その結果、場当たり的な管理作業が、財務面を守る先回りの取り組みへと変わります。
前提条件と環境のセットアップ
ライセンス回収のコードを 1 行でも書く前に、環境を準備する必要があります。適切な準備を行うことで、アクセス許可の壁やモジュールの依存関係の競合に突き当たらず、スクリプトをスムーズに実行できます。
サポートされているシステム
Microsoft 365 の管理スクリプトは、Windows と macOS のどちらでも実行できます。多くの管理者は Windows 10 以降を好みますが、Mac ユーザーは PowerShell Core を利用できます。使用するオペレーティング システムが最新のモジュール パッケージをサポートしていることを、必ず確認してください。サービスに接続する際に Web アカウント マネージャー (WAM) の統合エラーやアセンブリの依存関係の競合が発生した場合は、DisableWAM スイッチなどの一時的な回避策を使うと、スクリプトを先に進められます。
アクセス許可とロール
セキュリティは最優先事項です。管理スクリプトを標準のユーザー アカウントで実行することは絶対に避けてください。実行に使う ID に、グローバル管理者、ユーザー管理者、ライセンス管理者などの適切なロールが割り当てられていることを確認します。最小権限の原則を守ることで、管理者の資格情報は、ライセンスの監査と割り当てに必要な権限だけを持つことになります。
環境セットアップのチェックリスト
- 管理者として Windows PowerShell を開きます。
- PowerShell ギャラリーを信頼されたリポジトリとして設定します。
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted - プロンプトが表示されたら、必要な NuGet プロバイダーをインストールします。
- スクリプトの実行ポリシーを構成します。
Set-ExecutionPolicy RemoteSigned
Microsoft 365 の必須 PowerShell モジュールのインストール
ユーザーとライセンスを効率的に管理するには、適切なツールセットをローカルにインストールする必要があります。Microsoft のエコシステムは統合 SDK へと大きく移行していますが、日常的な管理作業にはいくつかの基盤となるモジュールが依然として欠かせません。
モジュールの概要
- Microsoft.Graph: MSOnline や AzureAD などの従来のツールを置き換える、最新の統合モジュールです。
- ExchangeOnlineManagement: メールボックスのガバナンス、共有メールボックスへの変換、メールフローの追跡に欠かせません。
- MicrosoftTeams: コラボレーション ワークロードと会議ポリシーの管理に欠かせません。
インストールの手順
管理者として実行した PowerShell プロンプトで、次のコマンドを実行すると、主要な最新モジュールをインストールできます。
Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force
Install-Module -Name MicrosoftTeams -Scope CurrentUser -Force自動化のランブックを妨げるバージョンの競合が起きていないことを確認するため、必ず Get-InstalledModule を使ってインストールを検証してください。
PowerShell を Microsoft 365 テナントに接続する
テナントへの安全で信頼性の高い接続を確立することが、次の重要な手順です。最新の認証標準では、特に無人実行やスケジュール実行のスクリプトで、堅牢なアプローチが求められます。
認証オプション
対話型のサインインは、その場の管理作業には便利ですが、バックグラウンドで動く自動化スクリプトには、より安全な方法が必要です。証明書ベースの認証やマネージド ID を使えば、パスワードをプレーンテキストのスクリプトファイルに直接書き込むことなく、安全に接続できます。
Microsoft Graph と各サービスへの接続
ユーザーとライセンスを管理するために Microsoft Graph に接続するには、次のコマンドを使用します。
Connect-MgGraph -Scopes "User.ReadWrite.All", "Organization.Read.All"Exchange 固有の処理やメールボックスの構成を行う場合は、次のコマンドでセッションを確立します。
Connect-ExchangeOnlineスクリプトがバッチ処理を完了したら、Disconnect-ExchangeOnline または Disconnect-MgGraph を実行して、セッションを必ず終了してください。
未使用のシートとライセンス インベントリの監査
ライセンスの最適化は、まず可視化から始まります。誰がシートを利用していて、誰が利用していないのかがわからなければ、シートを回収することはできません。PowerShell を使えば、割り当てられた SKU と最終サインイン日時を詳細に示したインベントリ レポートを取得できます。
サブスクリプションされている SKU の確認
テナントで購入済みのライセンス総数と利用可能な数を確認するには、次のコマンドを実行します。
Get-MgSubscribedSku | Select-Object SkuId, SkuPartNumber, @{Name="Total";Expression={$_.ConsolidatedStatus}}, @{Name="Assigned";Expression={$_.AssignedUnits}}非アクティブなユーザーの確認
90 日以上サインインしていないアカウントを特定することは、不要なクラウド費用を削減する最も手早い方法です。次のようにユーザー一覧をフィルター処理すると、休眠アカウントを見つけられます。
$Threshold = (Get-Date).AddDays(-90)
Get-MgGet-MgUser -All -Property Id, DisplayName, UserPrincipalName, SignInActivity | Where-Object { $_.SignInActivity.LastSignInDateTime -lt $Threshold }このデータを CSV ファイルにエクスポートしておくと、一括でライセンスを削除する前に、IT 部門のリーダーに明確なコスト削減の指標を示せます。
Set-MgUserLicense を使用したライセンスの割り当てと取り消し
利用されていないシートや、オンボーディングが必要な新入社員を特定したら、Set-MgUserLicense コマンドレットが、その調整を行う主要な手段になります。
プログラムによるライセンスの割り当て
新しいユーザーに特定の製品 SKU を割り当てるには、対象の SkuId を含むライセンス割り当てオブジェクトを作成します。
$Params = @{
AddLicenses = @(
@{
SkuId = "your-sku-guid-here"
}
)
RemoveLicenses = @()
}
Set-MgUserLicense -UserId "alex.johnson@contoso.com" -BodyParameter $Params未使用ライセンスの取り消し
休眠アカウントや退職者からライセンスを回収する場合は、RemoveLicenses 配列パラメーターに SKU の ID を渡して、割り当てを取り消します。これにより、利用されていないクラウド リソースに対する支払いを直ちに停止できます。
オンボーディングとオフボーディングのライセンス ワークフローの自動化
手作業によるユーザーのプロビジョニングとデプロビジョニングは、遅延とセキュリティ リスクを大きくします。オンボーディングとオフボーディングのワークフローをスクリプト化すれば、従業員の入社時にライセンスが付与され、退職日には直ちに取り消されるようになります。
自動化されたオフボーディング スクリプトは、ユーザー アカウントの無効化、割り当てられたライセンスの削除、メールボックスの共有メールボックスへの変換、監査証跡の安全なストレージへのエクスポートを、1 回の連続した実行ブロックで行えます。このレベルの同期により、ライセンスの無駄を防ぎ、組織のセキュリティ態勢を維持できます。
セキュリティのベスト プラクティスと最小特権
自動化は大きな権限を持つため、厳格な管理が必要です。厳格なセキュリティ原則を守ることで、誤った構成や悪意のあるスクリプトの実行からテナントを守ることができます。
- 最小特権アクセス: 自動化されたサービス アカウントに グローバル管理者 の権限を付与しないでください。スクリプトが実際に必要とする権限だけに、範囲を厳密に絞り込んでください。
- 資格情報のセキュリティ: パスワードをプレーンテキストでスクリプト内に保存しないでください。Azure Key Vault、マネージド ID、または証明書認証を使用してください。
- 包括的なログ記録: 堅牢な try/catch ブロックを実装し、スクリプトの実行手順をローカルまたはクラウドのログに記録して、完全な追跡性を確保してください。
よくあるライセンスと接続のエラーのトラブルシューティング
経験豊富な管理者であっても、Microsoft 365 の自動化スクリプトを実行する際には、時々障害にぶつかることがあります。これらのエラーへの対処方法を理解しておけば、多くの時間と手間を節約できます。
- アクセス拒否エラー: 実行しているアカウントに必要な Microsoft Entra ID のディレクトリ ロールがあること、および Graph 接続で正しい同意スコープを要求していることを確認してください。
- ライセンス割り当ての失敗: 対象ユーザーに「使用場所」が設定されていることを確認してください。ユーザーの国/地域が空白の場合、Microsoft 365 はライセンスの割り当てを拒否します。
- モジュールの競合: 競合するモジュールのバージョンが原因でコマンドレットが失敗する場合は、MSOnline などの従来のモジュールを完全にアンインストールし、環境を最新の Microsoft Graph SDK に統一してください。
まとめ
Microsoft 365のライセンス最適化と監査を自動化すると、効率的なIT管理とスマートな財務管理の橋渡しになります。PowerShellとSet-MgUserLicenseのようなコマンドレットを活用すれば、無駄なソフトウェア支出をなくし、厳格なセキュリティコンプライアンスを徹底し、組織全体でユーザー管理のワークフローを効率化できます。最新のツールやインフラ管理にさらに知見を広げたい場合は、関連エピソードのRun Your Full Stack Locally with .NET Aspireもぜひご覧ください。先回りして対策を講じ、スクリプトのセキュリティを確保して、Microsoft 365テナントを、コストを最適化した円滑に動くエンジンへと変えていきましょう。