【入門編】【安全な資格情報一時保持】WScript.Shell の Volatile 環境変数を利用した同一セッション内での一時トークン受け渡し – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【安全な資格情報一時保持】WScript.Shell の Volatile 環境変数を利用した同一セッション内での一時トークン受け渡し

こんにちは!頼れる先輩エンジニアのタカシです。

日々の業務自動化、お疲れ様です!「Excelマクロの記録」から一歩踏み出し、VBScriptを使ってシステム連携や高度な自動化に挑戦し始めると、必ずと言っていいほど直面する壁があります。

それは、「APIのアクセストークンや一時パスワードなどの『秘密の情報』を、どうやって安全に次の処理に引き渡すか?」という問題です。

「簡単だから」とテキストファイルに書き出して、用が済んだら消去する……という方法を採っていませんか? 実はそれ、開発現場では「ちょっと待った!」がかかる危険な書き方なのです。ファイルへの書き出しは、万が一処理が途中で異常終了したときに、ディスク上にパスワードが平文で残ってしまうリスク(脆弱性)があります。

そこで今回は、Windowsが標準で提供している「Volatile(揮発性)環境変数」という仕組みをVBScriptからコントロールし、ファイルに一切痕跡を残さず、安全・スマートに情報を引き渡すプロの方法を解説します。

ここをクリアすれば、VBScriptの基本とWindowsのセッション管理の仕組みはバッチリ理解できますよ。さあ、一緒に学んでいきましょう!

—

1. そもそも「環境変数」ってなに? 4つの仲間の違いを知ろう

Windowsには、OSやアプリが設定情報を一時的に記憶しておく「環境変数」という引き出しがあります。
環境変数にはいくつかの「有効期限(スコープ)」があり、用途によって使い分ける必要があります。

| 環境変数の種類 | 保存場所と有効期限 | 特徴と主な用途 |
| :— | :— | :— |
| System (システム) | レジストリ(永続)。PC全体、全ユーザーで共有。 | `Path` など、PC全体で共通の設定。一般ユーザー権限では変更不可。 |
| User (ユーザー) | レジストリ(永続)。ログインしているユーザーのみ。 | ユーザーごとの個人設定など。PCを再起動しても消えない。 |
| Process (プロセス) | メモリ。そのプログラム(プロセス)が動いている間だけ。 | 最も安全だが、プログラムが終了すると即消滅するため、「別のプログラム」に情報を引き渡すのが難しい。 |
| Volatile (揮発性) 🌟 | レジストリ+メモリ。サインアウト(ログオフ)するまで有効。 | 同一セッション(同じログイン状態)の別プログラム間でデータを共有でき、サインアウトで自動消滅する。 |

今回ご紹介する 「Volatile(ボラタイル:揮発性)」 は、まさに「セキュリティ」と「プログラム間連携」のいいとこ取りをした仕組みです。

—

2. なぜ「Volatile(揮発性)」が安全で便利なのか?

データの流れを図解的に見てみましょう。

【危険な例:ファイル経由】
VBScript (トークン取得) ──> [一時テキストファイル] ──> VBA/PowerShell (実行)
│
(エラーで止まるとファイルが残る!) ──> 情報漏洩リスク

【安全な例:Volatile環境変数】
VBScript (トークン取得) ──> [Volatile環境変数] ──> VBA/PowerShell (実行)
│
(サインアウトでOSが自動消去) ──> 痕跡が残らない!

Volatile環境変数は、Windowsにログインしている間だけ有効なレジストリ領域(`HKCU\Volatile Environment`)に一時的に保存されます。
最大の特徴は、「ユーザーがサインアウト(ログオフ)するか、PCをシャットダウンすると、Windowsが自動的にきれいに消去してくれる」点です。

プログラムが途中で強制終了してしまっても、ゴミファイルが残る心配がありません。また、同一ユーザーセッション内であれば、VBScriptでセットした値を、後から起動したExcel VBAやPowerShell、コマンドプロンプトから簡単に読み取ることができます。

—

3. 【実践】VBScriptでVolatile環境変数を操作する

それでは、実際に動くコードを見てみましょう。
まずは「トークンを安全にセットする(書き込む)スクリプト」と、「それを読み取るスクリプト」の2つを作成します。

① トークンをセットするスクリプト(`SetToken.vbs`)

デスクトップなどに `SetToken.vbs` という名前で保存して実行してください。

‘ =====================================================================
‘ SetToken.vbs – 安全に一時トークンをVolatile環境変数に保存する
‘ =====================================================================
Option Explicit ‘ 変数の宣言を強制(バグ防止の基本です!)

On Error Resume Next ‘ 万が一のエラー時に処理を止めず、制御する

Dim objShell, objEnv
Dim strTokenName, strTokenValue

‘ 1. WshShellオブジェクトの生成(Windowsのシステム機能にアクセスします)
Set objShell = CreateObject(“WScript.Shell”)
If Err.Number <> 0 Then
MsgBox “オブジェクトの作成に失敗しました: ” & Err.Description, vbCritical, “エラー”
WScript.Quit
End If

‘ 保存したいトークンの名前と値(本来はAPI等から取得した動的な値を入れます)
strTokenName = “MY_SECURE_API_TOKEN”
strTokenValue = “SECURE_TOKEN_XYZ123456789_DEMO”

‘ 2. “Volatile” スコープの環境変数コレクションを取得
Set objEnv = objShell.Environment(“Volatile”)

‘ 3. 環境変数に値を書き込み
objEnv(strTokenName) = strTokenValue

‘ エラーチェック
If Err.Number = 0 Then
MsgBox “安全なトークンをVolatile環境変数に保管しました!” & vbCrLf & _
“変数名: ” & strTokenName, vbInformation, “処理完了”
Else
MsgBox “書き込み中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End If

‘ 4. オブジェクトの解放(メモリをきれいに保つためのお作法です)
Set objEnv = Nothing
Set objShell = Nothing

② トークンを読み取るスクリプト(`GetToken.vbs`)

次に、セットしたトークンを別プロセスから読み取るスクリプトです。`GetToken.vbs` として保存し、実行してみてください。

‘ =====================================================================
‘ GetToken.vbs – Volatile環境変数から一時トークンを安全に読み取る
‘ =====================================================================
Option Explicit

Dim objShell, objEnv
Dim strTokenName, strReadValue

Set objShell = CreateObject(“WScript.Shell”)
Set objEnv = objShell.Environment(“Volatile”)

strTokenName = “MY_SECURE_API_TOKEN”

‘ 1. 環境変数から値を取得
strReadValue = objEnv(strTokenName)

‘ 2. 結果の判定と表示
If strReadValue <> “” Then
MsgBox “保管されているトークンを検知しました!” & vbCrLf & vbCrLf & _
“値: ” & strReadValue, vbInformation, “読み込み成功”
Else
MsgBox “トークンが見つかりません。先に SetToken.vbs を実行してください。”, vbExclamation, “未検出”
End If

Set objEnv = Nothing
Set objShell = Nothing

—

4. 陥りやすい罠と対策!先輩からのアドバイス

このテクニックを使う上で、初心者が陥りやすいポイントが3つあります。事前に知っておけば慌てることはありませんよ!

罠①:別ユーザーや管理者権限(管理者として実行)だと見えない!

Volatile環境変数は「ログインしている同一ユーザーセッション内」でのみ共有されます。
例えば、一般ユーザーで実行したVBScriptから、「管理者として実行」した別のコマンドプロンプトやVBAに値を渡そうとしても、セッション(権限コンテキスト)が異なるため、値が読み取れません。

  • 対策: 呼び出し元と呼び出し先は、常に同じユーザー権限で実行するようにしてください。

罠②:処理が終わっても、ログアウトするまでは残ってしまう

Windowsが自動で消してくれるとはいえ、ログアウトするまでは値が残ります。もし「この処理が終わった瞬間に消したい」という場合は、明示的に削除するお作法を入れておくと完璧です。

【クリーンアップ(削除)の1行】

‘ 環境変数を明示的に削除するコード
objEnv.Remove(“MY_SECURE_API_TOKEN”)

使い終わったら、この1行を呼び出し先スクリプトの最後に書いておきましょう。これでセキュリティはさらに強固になります!

—

5. 【応用】Excel VBAからトークンを読み取ってみよう!

VBScriptでセットしたトークンを、Excelマクロ(VBA)側で受け取ってWeb APIにリクエストを送る、といった連携は実務で非常によく使います。

VBAでの受け取りコード例を用意しました。標準モジュールに貼り付けて試してみてください。

Sub ReadTokenFromVBS()
‘ =====================================================================
‘ Excel VBAからVolatile環境変数を安全に取得する
‘ =====================================================================
Dim objShell As Object
Dim objEnv As Object
Dim strToken As String

On Error GoTo ErrorHandler

‘ WshShellオブジェクトの作成(レイトバインディング)
Set objShell = CreateObject(“WScript.Shell”)

‘ Volatile環境変数の取得
Set objEnv = objShell.Environment(“Volatile”)
strToken = objEnv(“MY_SECURE_API_TOKEN”)

‘ 取得した値のチェック
If strToken <> “” Then
MsgBox “VBA側でトークンの取得に成功しました!” & vbCrLf & _
“トークン: ” & strToken, vbInformation, “VBA連携成功”

‘ — ここにAPI通信などの処理を記述します —

‘ セキュリティのため、使い終わったらVBA側から消去するのがジェントルマン!
objEnv.Remove (“MY_SECURE_API_TOKEN”)
MsgBox “セキュリティ確保のため、メモリからトークンを消去しました。”, vbInformation, “クリーンアップ”
Else
MsgBox “トークンが見つかりませんでした。先にVBScriptを実行してください。”, vbExclamation, “エラー”
End If

‘ オブジェクトのクリーンアップ
Set objEnv = Nothing
Set objShell = Nothing
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Set objEnv = Nothing
Set objShell = Nothing
End Sub

—

まとめ:一歩先を行くプロの自動化へ

お疲れ様でした!今回のポイントをおさらいしましょう。

1. ファイルに秘密情報を書かないのが、安全な自動化の鉄則。
2. Volatile環境変数は、ログイン中だけ使える「揮発性」の安全な引き出し。
3. サインアウトで自動消滅するから、万が一の異常終了時も安心。
4. VBScript、VBA、PowerShell間でのデータ受け渡しに最適。

テキストファイルでのやり取りから脱却し、この「Volatile環境変数」を使いこなせるようになると、社内のシステム部門からも「お、このスクリプトはセキュリティを考えて作られているな!」と一目置かれるようになりますよ。

焦らず、一つずつコードを書いて動かしてみることが上達への近道です。
もし分からないことがあれば、いつでも聞いてくださいね。あなたの自動化ライフを応援しています!

タイトルとURLをコピーしました