PowerShellでMicrosoft 365のライセンス使用状況を把握し無駄を削減する方法

Microsoft 365を導入することで、企業は効率的なコラボレーションと生産性の向上を実現できます。しかし、その一方でライセンス費用は企業のITコストの大きな部分を占めることも事実です。適切にライセンスを管理しないと、不要なコストが発生し、予算の無駄遣いにつながる可能性があります。

PowerShellを利用すれば、Microsoft 365のライセンス使用状況を正確に把握し、不要なライセンスを特定して削減することが可能です。本記事では、PowerShellを用いたライセンス管理の具体的な手法を解説し、無駄を削減するための実践的なアプローチを紹介します。これにより、企業のコスト最適化を実現し、効率的なIT運用をサポートします。

Microsoft 365ライセンスの基本概念


Microsoft 365では、ユーザーごとに適切なライセンスを割り当てることで、さまざまなクラウドサービスを利用できるようになります。このライセンス管理の基礎を理解することは、効率的なコスト管理に欠かせません。

ライセンスの種類


Microsoft 365には、ビジネス用およびエンタープライズ用など、いくつかの主要なライセンスプランがあります。主なライセンスの種類は以下の通りです:

  • Microsoft 365 Business Basic: Web版のOfficeアプリとクラウドサービスに特化したプラン。
  • Microsoft 365 Business Standard: デスクトップ版のOfficeアプリも含む中小企業向けプラン。
  • Microsoft 365 E3/E5: 大規模なエンタープライズ向けで、セキュリティやコンプライアンス機能が充実。

ライセンス割り当ての仕組み


各ユーザーにライセンスを割り当てることで、Exchange OnlineやSharePoint、Microsoft Teamsなどのサービスが有効になります。ライセンスの割り当ては、Microsoft 365管理センターまたはPowerShellを使用して行います。

コスト管理の重要性


ライセンスは柔軟性が高い一方で、未使用ライセンスの保持や適切でないプランの選択がコスト増加の原因となることがあります。そのため、利用状況を定期的に監視し、必要に応じて最適化を行うことが重要です。

Microsoft 365のライセンスの基本を理解することで、後述するPowerShellを用いた具体的な管理手法がより効果的になります。

PowerShellによるMicrosoft 365環境の接続


PowerShellを使用してMicrosoft 365のライセンス情報を取得するには、まずMicrosoft 365環境への接続を設定する必要があります。このステップでは、必要なモジュールのインストールから接続の実行までを解説します。

必要な準備


Microsoft 365環境に接続するためには、以下の条件を満たす必要があります:

  • PowerShellのインストール: 最新バージョンのPowerShellがインストールされていることを確認してください。
  • Microsoft 365モジュールのインストール: Microsoft.Graphモジュールを使用してMicrosoft 365 APIにアクセスします。

モジュールのインストール手順


PowerShellを起動し、以下のコマンドを実行してMicrosoft.Graphモジュールをインストールします:

Install-Module -Name Microsoft.Graph -Scope CurrentUser

Microsoft 365環境への接続


インストール後、以下の手順でMicrosoft 365に接続します:

  1. Azure ADアカウントで認証
    接続を開始するために以下のコマンドを実行します:
   Connect-MgGraph

コマンドを実行すると、認証ウィンドウが表示されます。Microsoft 365の管理者アカウントでログインしてください。

  1. 接続確認
    認証が成功すると、接続された情報が表示されます。以下のコマンドでログインユーザーの情報を確認できます:
   Get-MgUser -Top 1

トラブルシューティング


接続中に問題が発生した場合、以下のポイントを確認してください:

  • モジュールのバージョン: Microsoft.Graphモジュールが最新であることを確認してください。
  • 認証情報: 認証に使用したアカウントが適切な管理者権限を持っていることを確認してください。
  • ネットワーク接続: インターネット接続が適切に動作しているかを確認します。

Microsoft 365環境への接続が完了すれば、ライセンス情報を取得する準備が整います。次に、具体的なスクリプトの作成に進みます。

ライセンス情報の取得スクリプト


Microsoft 365環境への接続が完了したら、PowerShellを使用してライセンス情報を取得するスクリプトを実行します。このステップでは、具体的なスクリプトの例とその実行方法を解説します。

ライセンス情報取得の基本スクリプト


以下は、Microsoft 365のライセンス情報を取得するための基本スクリプトです:

# 必要なモジュールのインポート
Import-Module Microsoft.Graph

# 接続済みであることを前提にライセンス情報を取得
$licenses = Get-MgSubscribedSku

# 結果の表示
$licenses | ForEach-Object {
    [PSCustomObject]@{
        ProductName = $_.SkuPartNumber
        AssignedLicenses = $_.ConsumedUnits
        AvailableLicenses = $_.PrepaidUnits.Enabled - $_.ConsumedUnits
        TotalLicenses = $_.PrepaidUnits.Enabled
    }
} | Format-Table -AutoSize

スクリプトの詳細説明

  1. ライセンス情報の取得
    Get-MgSubscribedSku コマンドを使用して、サブスクリプションに関連付けられたライセンス情報を取得します。このコマンドは、各ライセンスのSKU(製品コード)、消費済みライセンス数、利用可能なライセンス数などを含む情報を返します。
  2. データの整形
    ForEach-Object を用いて情報をカスタムオブジェクトとして整形し、表示しやすい形式にします。
  3. テーブル表示
    Format-Table を使用して、ライセンス名、割り当て済みライセンス数、利用可能ライセンス数、総ライセンス数をテーブル形式で表示します。

実行結果の例

ProductNameAssignedLicensesAvailableLicensesTotalLicenses
ENTERPRISEPACK15050200
BUSINESS_PREMIUM8020100

この情報により、どのライセンスがどの程度使用されているかを一目で把握できます。

応用例:特定ユーザーのライセンス確認


特定のユーザーが割り当てられているライセンスを確認する場合、以下のスクリプトを使用します:

# 特定のユーザーのライセンス情報を取得
$userPrincipalName = "example@contoso.com"
$userLicenses = Get-MgUserLicenseDetail -UserId $userPrincipalName

# 結果の表示
$userLicenses | Select-Object -Property SkuId, ServicePlans | Format-Table -AutoSize

注意点

  • Connect-MgGraphでMicrosoft 365に接続してからスクリプトを実行してください。
  • 実行環境によっては、管理者権限が必要です。

このスクリプトを活用すれば、ライセンス情報を効率的に取得し、無駄を特定する基礎データを収集することができます。次は、取得したデータの解析と可視化方法について解説します。

使用状況の解析とデータの可視化


PowerShellで取得したMicrosoft 365のライセンス情報をもとに、使用状況を分析し、可視化することで、どのライセンスが効率的に利用されているかを明確に把握できます。このステップでは、データの解析方法と可視化の実践例を紹介します。

データ解析の手順


取得したライセンス情報を解析するために、データを整理し、各ライセンスの使用状況を計算します。以下のスクリプトは、ライセンス使用率を計算する例です:

# ライセンス情報を取得
$licenses = Get-MgSubscribedSku

# 使用率の計算と整形
$licenseUsage = $licenses | ForEach-Object {
    [PSCustomObject]@{
        ProductName = $_.SkuPartNumber
        AssignedLicenses = $_.ConsumedUnits
        AvailableLicenses = $_.PrepaidUnits.Enabled - $_.ConsumedUnits
        TotalLicenses = $_.PrepaidUnits.Enabled
        UsageRate = "{0:P2}" -f ($_.ConsumedUnits / $_.PrepaidUnits.Enabled)
    }
}

# 結果の表示
$licenseUsage | Format-Table -AutoSize

解析結果の例

ProductNameAssignedLicensesAvailableLicensesTotalLicensesUsageRate
ENTERPRISEPACK1505020075.00%
BUSINESS_PREMIUM802010080.00%

この結果により、各ライセンスプランの使用率が明確になります。

データの可視化


PowerShellを用いて、取得したデータをグラフ形式で可視化することも可能です。以下のスクリプトは、ライセンス使用率を円グラフで表示する例です:

# 必要なモジュールのインストール(初回のみ実行)
Install-Module -Name ImportExcel -Scope CurrentUser

# データのエクスポート
$licenseUsage | Export-Excel -Path ".\LicenseUsage.xlsx" -AutoSize

# グラフ作成(Excelでデータを視覚化)
Invoke-Item ".\LicenseUsage.xlsx"

エクスポートされたExcelファイルで、円グラフや棒グラフを作成することで、視覚的にライセンス使用状況を確認できます。

応用例:ライセンス使用率が低いプランの抽出


使用率が50%未満のライセンスを特定する場合、以下のスクリプトを使用します:

# 使用率が低いライセンスの抽出
$lowUsageLicenses = $licenseUsage | Where-Object { ($_).UsageRate -lt "50%" }

# 結果の表示
$lowUsageLicenses | Format-Table -AutoSize

解析結果を活用するメリット

  • コスト削減の指針: 使用率が低いライセンスプランを特定し、適切な対策を講じる。
  • 運用効率の向上: 使用率の高いライセンスに焦点を当てた計画的な調整が可能になる。

可視化されたデータは、経営層や関係者への説明資料としても有効です。次は、無駄なライセンスを特定し削減する手法について解説します。

無駄なライセンスの特定と削減手法


ライセンス使用状況の解析が完了したら、無駄になっているライセンスを特定し、削減するための具体的な手法を実践します。以下では、無駄なライセンスの特定方法と削減手法について解説します。

無駄なライセンスの特定


無駄なライセンスは、以下の条件に基づいて特定できます:

  1. 未使用ライセンス: 割り当てられていないライセンス。
  2. 低使用率ライセンス: 割り当てはあるものの、実際に使用されていないライセンス。
  3. 非アクティブユーザー: 長期間Microsoft 365にログインしていないユーザーに割り当てられているライセンス。

以下のスクリプトは、未使用ライセンスと非アクティブユーザーを特定する例です:

# 未使用ライセンスの確認
$licenses = Get-MgSubscribedSku
$licenses | ForEach-Object {
    if ($_.PrepaidUnits.Enabled - $_.ConsumedUnits -gt 0) {
        [PSCustomObject]@{
            ProductName = $_.SkuPartNumber
            UnusedLicenses = $_.PrepaidUnits.Enabled - $_.ConsumedUnits
        }
    }
} | Format-Table -AutoSize

# 非アクティブユーザーの確認
$lastActivityThreshold = (Get-Date).AddDays(-90) # 最終ログインが90日前より古いユーザーを対象
$inactiveUsers = Get-MgUser | Where-Object {
    $_.LastSignInDateTime -lt $lastActivityThreshold
}

# 結果表示
$inactiveUsers | Select-Object -Property DisplayName, UserPrincipalName, LastSignInDateTime | Format-Table -AutoSize

削減手法

1. 未使用ライセンスの削減


未使用ライセンスはすぐに解約するか、他の必要なユーザーに割り当てることで無駄を防ぐことができます。

  • 解約方法: 管理ポータルまたはサポートを通じて、未使用ライセンスを減らす手続きを実施します。
  • 再割り当て方法: 以下のスクリプトを使用して、他のユーザーにライセンスを割り当てます:
  Set-MgUserLicense -UserId "newuser@contoso.com" -AddLicenses @{SkuId="ENTERPRISEPACK"}

2. 非アクティブユーザーの対応


非アクティブユーザーへのライセンス割り当てを解除することで、無駄を削減します。

  • 割り当て解除スクリプト:
  $inactiveUsers | ForEach-Object {
      Set-MgUserLicense -UserId $_.UserPrincipalName -RemoveLicenses @{SkuId="ENTERPRISEPACK"}
  }

3. ライセンスプランの最適化


特定の部門やプロジェクトで高機能ライセンスが不要な場合、以下の方法でプランをダウングレードできます:

  1. 現在のライセンスを解除。
  2. 必要なライセンスを再割り当て。
# プラン変更の例
Set-MgUserLicense -UserId "example@contoso.com" -RemoveLicenses @{SkuId="ENTERPRISEPACK"} -AddLicenses @{SkuId="BUSINESS_PREMIUM"}

削減手法の実行後の確認


削減実施後は、以下のコマンドを使ってライセンス割り当て状況を再確認します:

Get-MgUserLicenseDetail -UserId "example@contoso.com" | Format-Table -AutoSize

メリット

  • コスト削減: 無駄なライセンスの削減により、月額費用が大幅に軽減されます。
  • 効率的な運用: 必要なユーザーに最適なライセンスが割り当てられることで、生産性が向上します。

これらの手法を活用して、Microsoft 365ライセンスの無駄を削減し、より効率的なIT管理を実現しましょう。次は、定期的な監視スクリプトの設定について説明します。

定期的な監視スクリプトの設定


Microsoft 365のライセンス使用状況を継続的に監視することは、無駄なライセンスの早期発見と効率的な管理に役立ちます。ここでは、PowerShellを使ってライセンス使用状況を自動で監視し、レポートを生成する方法を解説します。

監視スクリプトの概要


定期的な監視スクリプトは、以下のタスクを実行します:

  1. Microsoft 365環境に接続。
  2. ライセンス情報を取得。
  3. 使用率が低いライセンスや未使用ライセンスを特定。
  4. 結果をCSVやメールで送信。

スクリプト例


以下は、監視スクリプトの具体例です:

# Microsoft 365に接続
Connect-MgGraph -Scopes "User.Read.All"

# ライセンス情報の取得
$licenses = Get-MgSubscribedSku

# 使用状況の計算
$licenseUsage = $licenses | ForEach-Object {
    [PSCustomObject]@{
        ProductName = $_.SkuPartNumber
        AssignedLicenses = $_.ConsumedUnits
        AvailableLicenses = $_.PrepaidUnits.Enabled - $_.ConsumedUnits
        TotalLicenses = $_.PrepaidUnits.Enabled
        UsageRate = ($_.ConsumedUnits / $_.PrepaidUnits.Enabled) * 100
    }
}

# 使用率が低いライセンスを特定(使用率50%以下を対象)
$lowUsageLicenses = $licenseUsage | Where-Object { $_.UsageRate -lt 50 }

# レポートをCSV形式で保存
$reportPath = ".\LicenseUsageReport.csv"
$lowUsageLicenses | Export-Csv -Path $reportPath -NoTypeInformation -Encoding UTF8

# レポートをメールで送信(メール設定が必要)
Send-MailMessage -From "admin@contoso.com" -To "itmanager@contoso.com" -Subject "Microsoft 365 License Usage Report" -Body "Attached is the latest license usage report." -Attachments $reportPath -SmtpServer "smtp.contoso.com"

スクリプトのスケジュール設定


監視スクリプトを自動で定期実行するには、Windowsタスクスケジューラを使用します:

  1. スクリプトの保存
    上記のスクリプトをLicenseMonitor.ps1として保存します。
  2. タスクスケジューラの設定
  • 新しいタスクの作成
    タスクスケジューラを開き、「タスクの作成」を選択します。
  • トリガーの設定
    実行頻度(例:毎日、毎週)を設定します。
  • アクションの設定
    「プログラムの開始」を選択し、PowerShellを指定します。以下のように入力します:
    powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\LicenseMonitor.ps1"

レポートの解釈


生成されたレポートには、以下の情報が含まれます:

  • ProductName: ライセンスの種類。
  • AssignedLicenses: 割り当て済みライセンス数。
  • AvailableLicenses: 利用可能なライセンス数。
  • TotalLicenses: 総ライセンス数。
  • UsageRate: 使用率。

使用率が低いライセンスを特定したら、適切な削減手段を実施します。

監視スクリプトのメリット

  • 効率的なライセンス管理: 定期的な監視で無駄を早期に発見できます。
  • 自動化による省力化: 手動での確認作業が不要になり、時間を節約できます。
  • 迅速な対応: 問題が発見された場合、即座に対応できます。

この監視スクリプトを設定することで、Microsoft 365のライセンス管理を効率化し、無駄を最小限に抑えることができます。次は、記事のまとめに進みます。

まとめ


本記事では、PowerShellを用いたMicrosoft 365のライセンス使用状況の管理と無駄削減手法について解説しました。Microsoft 365ライセンスの基本を理解し、PowerShellを活用してライセンス情報を取得、解析、可視化する方法をステップごとに学びました。また、使用率が低いライセンスや非アクティブユーザーを特定し、効率的にコスト削減を実現する具体的な手法を紹介しました。

さらに、定期的な監視スクリプトを設定することで、継続的なライセンス管理を自動化し、運用の効率化を図ることが可能になります。このプロセスを取り入れることで、ライセンス管理に関する課題を解決し、ITコストの最適化を実現できます。今後の運用にぜひお役立てください。

コメント

コメントする