本サイトは広告・アフィリエイトプログラムにより収益を得ています
会社のPCがBitLockerで暗号化されているけど、回復キーを回収する仕組みがない…… どうする?

会社のPCがBitLockerで暗号化されているけど、回復キーを回収する仕組みがない…… どうする?

スポンサーリンク

Windows 11を会社のPCとして利用している際に大きな運用課題となるのが「BitLocker」回復キーの管理ではないでしょうか。

当ブログではMicrosoft Entra IDアカウントに保存すればよい、とよく話していますがMicrosoft Entra IDの管理には相応のスキルが求められるのが現状です。

とはいえ、だからといって回復キーの管理をしないわけにもいかず、「BitLockerの管理」から回復キーを保存して回収するわけですが、従業員のリテラシーによってはそれも100%行えるわけではありません。

そんな悩みを抱えている方の一助になればと思い、BitLocker回復キーの改修を少しでも楽にできるPowerShellスクリプトを描いてみましたので、参考になれば幸いです。

BitLocker暗号化の状態はPowerShellコマンドレットで確認できる

BitLockerの状態を確認するには、コントロールパネル内の「BitLockerの管理」から実施するイメージが強いですが、GUIでできるならもちろんPowerShellコマンドでもその状態を確認できます。

Get-BitLockerVolume

上記コマンドの実行結果の例が以下の通り。

PS C:\Users\nagao-sotaro> Get-BitLockerVolume


   ComputerName: WORKPC

VolumeType      Mount <中略> Protection Status
OperatingSystem C:           On
Data            D:           Off
Data            E:           Off

ここで確認すべきはProtection Statusの値で、Protection StatusがOnのものがBitLocker暗号化済み、Protection StatusがOffのものがBitLocker暗号化未実施となります。

例ではOS用のCドライブはBitLocker暗号化が有効化されており、CF Express CardリーダーがDドライブ、USBメモリがEドライブに割り当てられており、外付けのメディアはBitLocker暗号化されていない状態です。

BitLocker回復キーも漏れなくPowerShellコマンドレットで確認できる

先ほどの「Get-BitLockerVolume」コマンドレットで、CドライブがBitLocker暗号化されていることが確認できました。

この結果をもとに下記コマンドレットを実行すると、BitLocker回復キーが確認できます。

PS C:\Users\syobon> (Get-BitLockerVolume -MountPoint C).KeyProtector


KeyProtectorId      : {12345678-A123-B123-C123-D1234567890}
AutoUnlockProtector :
KeyProtectorType    : Tpm
KeyFileName         :
RecoveryPassword    :
KeyCertificateType  :
Thumbprint          :
BackupType          : None
BackupAccounts      :

KeyProtectorId      : {12345678-1234-A123-B123-C12345678901}
AutoUnlockProtector :
KeyProtectorType    : RecoveryPassword
KeyFileName         :
RecoveryPassword    : 123456-123456-123456-123456-123456-123456-123456-123456
KeyCertificateType  :
Thumbprint          :
BackupType          : Aad, Saved
BackupAccounts      :

いろいろな項目が確認できますが、RecoveryPasswordに記載されている48桁の数字がBitLocker回復キーです。

これらのコマンドレットの実行にはローカル管理者権限が必要ですが、PowerShellスクリプトを使えば各PCの回復キーを社内のファイルサーバーに保存するまでを自動化できそうですよね。

PowerShellスクリプト化してみよう

今回は下記のような要件を満たすPowerShellスクリプトを例として作成してみました。

  • BitLockerで暗号化されているドライブすべての回復キーを取得する
  • 回復キーはCSVファイルとして出力する
  • CSVファイルの列は「マウントポイント,BitLockerキーID,回復キー」とする
  • 回復キーのファイル名は<取得した日付>-<PC名>-bitlocker.csvとする
    例)20260708-WORKPC-bitlocker.csv
  • ファイルの保存先は変数で指定する

PowerShellスクリプト

#Requires -RunAsAdministrator

#回復キーの一覧を保存する先を指定
$OutputDir="C:\BitLockerKeys"

#出力ファイル名、出力先のセット
$DateFormat=Get-Date -Format "yyyyMMdd"
$ComputerName=$env:COMPUTERNAME
$FileName="{0}-{1}-bitlocker.csv" -f $DateFormat, $ComputerName
$OutputPath=Join-Path -Path $OutputDir -ChildPath $FileName

#保存先のフォルダが無ければ作成
if (-not (Test-Path -Path $OutputDir)) {
    New-Item -Path $OutputDir -ItemType Directory -Force | Out-Null
}

#Get-BitLockerVolumeで表示されるすべてのボリュームからRecoveryPasswordを収集
$Result=foreach ($Volume in (Get-BitLockerVolume)) {
    foreach ($Protector in ($Volume.KeyProtector | Where-Object { $_.KeyProtectorType -eq 'RecoveryPassword' })) {
        [PSCustomObject]@{
            'マウントポイント'=$Volume.MountPoint
            'BitLockerキーID'=$Protector.KeyProtectorId.Trim('{}')
            '回復キー'=$Protector.RecoveryPassword
        }
    }
}

#CSV出力
if ($Result) {
    $Result | Export-Csv -Path $OutputPath -Encoding UTF8 -NoTypeInformation
    Write-Host "出力しました: $OutputPath"
} else {
    Write-Host "RecoveryPasswordが設定されていません。"
}

スクリプトの説明

1行目

1行目の「#Requires -RunAsAdministrator」はコメントアウトのように見えますが、実は重要な役割を果たします。

こちらのPowerShellスクリプトはローカル管理者権限が付与されたアカウントでの実行が必要なので、管理者として実行されていない場合はエラー終了させたいです。

そこで、「#Requires -RunAsAdministrator」と冒頭に仕込むことで、非管理者で実行された場合はエラーで終了してくれます。

#回復キーの一覧を保存する先を指定

<取得した日付>-<PC名>-bitlocker.csvファイルを保存する先を指定しています。

例ではCドライブ直下のBitLockerKeysフォルダを指定していますが、ファイルサーバーをUNCパスで指定することも可能です。

#出力ファイル名、出力先のセット

要件として、回復キーのファイル名を<取得した日付>-<PC名>-bitlocker.csv(例:20260708-WORKPC-bitlocker.csv)とするようにしているので、スクリプト内でハードコーディングしなくてもいいように、変数や環境変数を使って、出力ファイル名は$FileNameで、出力ファイルのパスは$OutputPathで指定できるようにしています。

#保存先のフォルダが無ければ作成

回復キーのファイルを$OutputPathで指定しているのですが、フォルダが作成されていない場合はエラーで止まってしまうので、事前に$OutputPathで指定したフォルダが存在するか確認します。

そのうえで、存在しない場合は$OutputPathフォルダを作成する、といった仕組みを入れています。

#Get-BitLockerVolumeで表示されるすべてのボリュームからRecoveryPasswordを収集

BitLocker回復キーを取得するにはまず、Get-BitLockerVolumeコマンドレットでProtection Statusを確認する、と紹介しました。

手動で実行する際はそれでよいのですが、スクリプトで実行する場合はBitLocker暗号化されているすべてのドライブの回復キーを一括で取得したいところです。

そこで、BitLocker暗号化の有無にかかわらず、マウントポイント(ドライブレター)とBitLockerキーID、BitLocker回復キーを確認するようにしています。

この回復キーを取得する処理ですが、二重ループにしているのがお分かりいただけるでしょうか。

カンの良い方ならお気づきかもしれませんが、BitLocker回復キーは1つのボリュームに対して、複数の回復キーが設定されていることがあります。

想定される例としては、BitLocker暗号キーのローテーションや再バックアップなどを実施したケース。

その場合、すべての回復キーを取得しなければならないので、二重ループで残すことなく回復キーを取得するようにしています。

#CSV出力

最後に取得した回復キーを「マウントポイント,BitLockerキーID,回復キー」のCSV形式にまとめています。

その際、RecoveryPasswordの値が設定されているものだけをCSVファイルに追記し、RecoveryPasswordの値が設定されていないものはCSVファイルには書き込まず、「RecoveryPasswordが設定されていません。」とメッセージを表示するだけにとどめています。

こうすることで、「BitLocker暗号化の状態はPowerShellコマンドレットで確認できる」の例で挙げた通り、BitLocker暗号化がかかっているボリュームの分だけCSVファイルに出力し、BitLocker暗号化されていない外部メディアは無視される、という形になります。

なお、(Get-BitLockerVolume -MountPoint C).KeyProtectorを実行した際に表示される、KeyProtectorTypeが「Tpm」のものはPC内部またはCPU内の仮想TPMに保護キーが保存されているもので、PC起動時に回復キーをTpmから直接読み取って起動するものなので、BitLocker回復キーは設定されていません。

むしろこのTPM内の回復キーが読み込めないときにBitLocker回復キーを入力するので、特にデータとして出力する必要はないため、これも無視されるようになっています。

実行例

作成したPowerShellスクリプトは下記コマンドで実行できます。

powershell.exe -NoProfile -ExecutionPolicy Bypass -File <スクリプト保存先のフルパス>

#例)powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Escrow-BitLocker.ps1

#例2)デスクトップに保存している場合
# $Desktop=[System.Environment]::GetFolderPath("Desktop")
# powershell.exe -NoProfile -ExecutionPolicy Bypass -File $Desktop\Escrow-BitLocker.ps1

ユーザーに管理者権限で実行させたい場合はスタートボタンを右クリックし、「ターミナル(管理者)」を開いてもらい、下記を貼りつけて実行してもらうとよいでしょう。

$Desktop=[System.Environment]::GetFolderPath("Desktop")
powershell.exe -NoProfile -ExecutionPolicy Bypass -File $Desktop\Escrow-BitLocker.ps1

応用編

PowerShellスクリプトを手動実行する場合、実はbatファイルの実行の時と比べて少しハードルが高くなっています。

タスクスケジューラ―でタスクを作成し、、「タスクの実行時に使うユーザーアカウント」を「NT AUTHORITY¥SYSTEM」とし、「最上位の特権で実行する」にチェックを入れます。

そんな場合は、タスクスケジューラ―でタスクを作成し、「タスクの実行時に使うユーザーアカウント」を「NT AUTHORITY¥SYSTEM」とし、「最上位の特権で実行する」にチェックを入れます。

プログラム/スクリプトにはpowershell.exeを、引数の追加に「-NoProfile -ExecutionPolicy Bypass -File C:\Escrow-BitLocker.ps1」を追加します。

「操作」を「プログラムの開始」に指定し、「プログラム/スクリプト」には「powershell.exe」を、「引数の追加(オプション)」には「-NoProfile -ExecutionPolicy Bypass -File C:\Escrow-BitLocker.ps1」を記載し、「OK」をクリックします。

トリガーは任意のもので構いませんが、毎月お昼休みのタイミングで実行すると良いかなと思います。

ここはご自身の会社の状況に合わせて調整してください。

上記のタスクを作成するbatファイル(あえてbatファイル)は以下の通りなので、これを従業員に管理者として実行してもらってもよいかもですね。

@echo off
setlocal
 
schtasks /Create ^
 /TN "Escrow BitLocker" ^
 /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Escrow-BitLocker.ps1" ^
 /SC MONTHLY ^
 /MO FIRST ^
 /D MON ^
 /ST 12:00 ^
 /RU "NT AUTHORITY\SYSTEM" ^
 /RL HIGHEST ^
 /F
 
endlocal
pause

まとめ

BitLockerの暗号化は業務利用PCにはなくてはならないものです。

ただ、回復キーの管理はやれMicrosoft Entra IDを使いましょうだとか、Intuneを使えば一括で管理できます!と紹介されていますが、SOHOや中小企業にとってはかなりハードルが高いのが正直なところです。

だからといって従業員にBitLocker回復キーのバックアップを依頼するのもこれまた一苦労で、回収も大変です。

今回紹介したPowerShellスクリプトも本来であれば、回復キーをファイルに出力して特定のフォルダへ書き込むという、情シス目線で見るとあまり褒められたものではないのが正直なところです。

とはいえ、本スクリプトを利用すればファイルサーバーや共有フォルダがあれば、従業員のPCのBitLocker回復キーを情シスや情シス担当の方が楽に回収できるので、出力されたBitLockerの回復キーファイルの取り扱いに注意しつつ、日々の業務のつらさを少しでも緩和できたらなぁと思います。