Excel

VBA環境情報の取得テクニック:ユーザー名やホスト名などを安全に扱う

k.w
\お買い物マラソン開催中/

このページは、VBAでPCの「固有情報」を安全に取得するための考え方と手順をまとめたものです。固有情報とは、ユーザー名やPC名、OSの種類など、端末やログイン環境を識別するための一般的な情報を指します。まずは範囲を決め、どの方法で取得するかを選び、実務で困らない形に出力することを目標にします。なお、ここで扱う内容は一般的な説明であり、組織の規程や環境によって動作や扱いが異なる場合があります。

用語として「環境変数」は、OSがアプリに共有する設定値のことです。VBAの関数で手軽に読めます。「WMI」は、Windowsが持つ管理情報を取り出す仕組みです。多くの項目を取得できますが、権限や設定の影響を受けます。「Windows API」は、OSの機能を呼び出す方法です。正確で強力ですが、宣言や型の扱いに注意が必要です。以降では、これら三つの手段を組み合わせて解説します。

Contents

PCの固有情報とは何か(例と非該当の線引き)

固有情報の例は、ユーザー名、PC名、所属ネットワーク名、OS情報、CPUやメモリの概要などです。一方で、アプリの利用履歴やファイルの中身など、個人の行動や機微に関わるものは対象外にします。記事では、識別や資産管理に役立つレベルに限定し、過度な収集を避ける考えを基本にします。

用語の確認(環境変数・WMI・APIの簡単な定義)

環境変数は、USERPROFILECOMPUTERNAME などの名前で参照できます。WMIは、Win32_ComputerSystemWin32_OperatingSystem といったクラスから情報を読みます。APIは、GetUserNameWGetComputerNameExW といった関数を呼び出す方法で、64bit版のOfficeでは PtrSafeLongPtr などの型に配慮します。

FAQ:これらは個人情報に当たりますか?

一般に、ユーザー名やPC名は個人識別に関わる場合があります。組織のルールや契約に従い、必要最小限で扱い、外部共有は避けるのが無難です。本記事は収集の推奨ではなく、仕組みの説明を目的とします。

スポンサーリンク

取得できる主な情報一覧

ここでは、どのような情報が取得対象になるかを俯瞰します。名称はやさしい呼び方と技術名を併記し、どの手段で取りやすいかの目安も添えます。すべてを必ず取得する必要はありません。用途に合わせて項目を選び、取得後は保存や共有の扱いに注意してください。

ユーザー名/ログオン名

現在ログオンしているユーザーの名前です。環境変数 USERNAME やAPIで取得できます。ドメイン環境では形式や表示の仕方が異なることがあります。WMIでもログオンセッションから取得可能ですが、実装はやや複雑です。

PC名(ホスト名)と所属ネットワーク名

PC名は COMPUTERNAME で表されます。所属ネットワーク名はドメイン名またはワークグループ名で、WMIの Win32_ComputerSystem から読み取れます。APIの GetComputerNameExW を使うと種類を分けて取得できます。

OSバージョン・ビルド・アーキテクチャ

WMIの Win32_OperatingSystem からキャプション、バージョン、ビルド番号、OSアーキテクチャ(32bit/64bit)などを取得できます。環境変数だけでは詳細が不足するため、ここはWMIを使うのがわかりやすいです。

CPU・物理メモリの概要(WMI)

Win32_ComputerSystemWin32_Processor から、装置名や物理メモリ容量、論理プロセッサ数などの概略を読めます。取得値はバイト単位が多いので、表示時にGB単位へ換算すると理解しやすくなります。

IPアドレス・MACアドレス(取得は任意・取り扱い注意)

ネットワークインターフェイスの情報はWMIの Win32_NetworkAdapterConfiguration などで取得できます。ただし、機微な情報に当たる可能性があり、保存や外部送付は控えたほうがよい場面が多いです。必要な場合でも、対象端末内の一時表示に留めるなど最小化を意識します。

FAQ:VBAだけでどこまで取得できますか?

主要な識別情報はVBAだけで取得可能です。より高度な情報や制御が必要な場合は、PowerShellや管理ツールと併用することがあります。まずはVBAで足りる範囲から試すのが現実的です。

取得方法の選び方(Environ・WMI・Windows APIの比較)

三つの代表手段を比較し、選定の基準を明確にします。手軽さ重視なら環境変数、情報量重視ならWMI、精度や種別の細かな指定が必要ならAPIを検討します。実務では、まず環境変数で足りるか確認し、足りない項目だけWMIやAPIで補う流れが扱いやすいです。

Environ関数(手軽・環境変数依存)

Environは設定や参照が不要で、短いコードで動きます。一方でOSが公開している環境変数に限定され、詳細なOS情報やネットワーク情報は取れません。可用性は高いので、最初の選択肢として有効です。

WMI(情報が豊富・参照や権限が影響)

WMIは取得できる項目が多く、構造化されたデータとして読み出せます。参照設定を付ける方法と、参照なしで遅延バインディングする方法があります。企業環境ではポリシーやサービス状態により取得が制限されることがあるため、失敗時の扱いを設計しておきます。

Windows API(精度と対応幅・Declareの注意)

APIは項目を細かく指定でき、PC名の区分やユーザー名の取得などを正確に行えます。ただし、Officeの32bitと64bitで宣言が異なり、PtrSafeLongPtr を用いた宣言が必要です。型の不一致は実行時エラーの原因になるため、宣言は慎重に用意します。

比較表の項目(取得範囲/難易度/参照設定/権限影響/64bit対応/速度目安)

以下は三手段の比較イメージです。状況に応じて併用する前提で考えると、設計が簡単になります。

手段取得範囲実装の難易度参照設定権限の影響64bit対応速度の目安
Environ限定的(環境変数のみ)不要不要速い
WMI広い(OSやハード情報)任意(有り/無しどちらも可)中〜大不要普通
Windows API選択的(関数ごとに細かい)中〜高不要必要(PtrSafe等)速い

FAQ:結局どれを選べばよい?

まずはEnvironで試し、足りない項目だけWMIまたはAPIで補うのが現実的です。設置先の権限や参照設定の可否も選定基準になります。

サンプルコード集(すぐ使える最小〜実務)

ここでは、すぐに試せる形で例を並べます。参照設定の有無やエラー時の扱いをそろえ、64bitでも動くことを意識します。コードは学習しやすい順番に配置し、失敗時は空文字やN/Aを返す方針で関数化します。

最小コード(Environでユーザー名・PC名を取得)

例:ユーザー名とPC名を即時ウィンドウに出す最小例。実務ではワークシート出力に置き換えて使えます。

Sub DemoEnviron()
  Dim userName As String, pcName As String
  userName = Environ$("USERNAME")
  pcName = Environ$("COMPUTERNAME")
  Debug.Print "User=" & userName, "PC=" & pcName
End Sub

WMI取得(Win32_ComputerSystem/OperatingSystem)参照設定あり・なし

参照設定ありの例:VBEで「Microsoft WMI Scripting」へチェックを入れてから実行します。

Function GetOsCaption() As String
  On Error GoTo EH
  Dim svc As SWbemServices, col As SWbemObjectSet, obj As SWbemObject
  Set svc = GetObject("winmgmts:\\.\root\cimv2")
  Set col = svc.ExecQuery("SELECT Caption FROM Win32_OperatingSystem")
  For Each obj In col
      GetOsCaption = obj.Caption
      Exit For
  Next
  Exit Function
EH:
  GetOsCaption = "N/A"
End Function

参照なしの例:CreateObject を使う遅延バインディングです。

Function GetCsDomain() As String
  On Error GoTo EH
  Dim svc As Object, col As Object, obj As Object
  Set svc = GetObject("winmgmts:\\.\root\cimv2")
  Set col = svc.ExecQuery("SELECT Domain FROM Win32_ComputerSystem")
  For Each obj In col
      GetCsDomain = obj.Domain
      Exit For
  Next
  Exit Function
EH:
  GetCsDomain = "N/A"
End Function

Windows API宣言例(PtrSafe/LongPtr/GetUserNameW/GetComputerNameExW)

64bit対応の宣言例です。標準モジュールの先頭に置き、関数で使います。

#If VBA7 Then
    Private Declare PtrSafe Function GetUserNameW Lib "advapi32.dll" ( _
        ByVal lpBuffer As LongPtr, ByRef pcbBuffer As Long) As Long
    Private Declare PtrSafe Function GetComputerNameExW Lib "kernel32.dll" ( _
        ByVal NameType As Long, ByVal lpBuffer As LongPtr, ByRef nSize As Long) As Long
#Else
    Private Declare Function GetUserNameW Lib "advapi32.dll" ( _
        ByVal lpBuffer As Long, ByRef pcbBuffer As Long) As Long
    Private Declare Function GetComputerNameExW Lib "kernel32.dll" ( _
        ByVal NameType As Long, ByVal lpBuffer As Long, ByRef nSize As Long) As Long
#End If

APIはUnicodeのワイド文字を前提とし、十分なバッファを確保して呼び出します。戻り値が0の場合は失敗なので、エラー扱いにして空文字またはN/Aを返します。

例外処理とタイムアウト設計(失敗時は空文字かN/Aを返す)

取得はネットワークや権限に影響されます。すべて成功する前提で設計せず、失敗したら空文字、N/A、またはメッセージに切り替える方針にします。WMIにはタイムアウトや待ちが発生することがあるため、実行時間が長くなった場合の扱いも決めておきます。

FAQ:参照設定は必要ですか?

WMIは参照設定があると記述が楽になりますが、CreateObject を使えば参照なしでも動かせます。持ち込み先で参照が変更できない場合は、参照なしの記法を選ぶと配布が容易です。

動作の仕組みと実行イメージ

処理の流れを簡単に示します。起動後に必要な項目を取得し、文字列整形を行い、出力先へ渡すのが基本形です。学習時は即時ウィンドウ、実務時はワークシートなどに出力します。ログを残す場合も、最小限の内容に留めます。

処理フロー(起動→取得→整形→出力)

起動時に取得対象を列挙し、Environで取れる項目を先に処理、足りない部分をWMIやAPIで補完します。エラーや空値は集計時にわかるようにして、最後に表の形へまとめて出力します。

即時ウィンドウへの出力例

Debug.Print で一行ずつ出力すると、試行錯誤がしやすくなります。関数化しておけば、結果の比較や再実行も簡単です。長い結果は途中で省略せず、短い見出しと値を並べて確認します。

ワークシートへ表で出力する例

ヘッダー行に項目名、2行目以降に値を入れる構成にします。GB換算が必要な値は、四捨五入して1桁程度にまとめると可読性が上がります。表の幅は必要な列だけに絞り、印刷時の見やすさも意識します。

FAQ:実行すると何が表示されますか?

最小例では、ユーザー名とPC名が即時ウィンドウに表示されます。拡張例では、OS名やドメイン名などを表形式でシートに出力できます。失敗した項目はN/Aなどの印で区別されます。

セキュリティと取り扱いの注意

固有情報は扱いを誤るとトラブルにつながります。保存の要否を検討し、保存する場合も期間と範囲を限定します。第三者に渡すときは組織の規程に従い、送付先や目的を明確にします。不要になった情報は速やかに削除します。

権限やポリシーで取得が制限される場合

企業の端末では、WMIが無効化されていたり、特定の情報へのアクセスが禁止されていることがあります。失敗時の代替ルートを用意しておくと、ユーザー体験を損ねにくくなります。

ログ・ファイル保存時の配慮(マスキング・最小化)

ログへ残すときは、ユーザー名やドメイン名の一部を伏せるなど、露出を抑える工夫が有効です。収集目的と関係のない項目は最初から取らないか、すぐに破棄します。

第三者への共有ルール(社内規程の確認)

情報の共有は、社内規程や合意に基づいて行います。メール添付や外部ストレージへの保存は、許可された経路かどうか確認します。誰がいつアクセスできるかを明確にし、不要になった共有は解除します。

FAQ:収集しても問題ありませんか?

必要最小限の範囲で、目的と根拠が明確な場合に限り実施してください。迷ったときは、組織の管理部門や規程を確認するのが安全です。本記事は一般的な説明にとどめています。

トラブルシュート(うまく動かないとき)

現場では、コードは正しくても環境が原因で失敗することがあります。切り分けは、参照の有無、権限、サービス状態、ネットワーク状態の順で確認すると効率的です。再現条件を記録しておくと、後からの検証が楽になります。

WMIサービス無効・権限不足

WMIが停止している、または権限不足でアクセスできないときは、関連するサービス状態やポリシーを確認します。参照なしの遅延バインディングに切り替えると回避できる場面もあります。

32bit/64bitの宣言差異・型不一致

API宣言が32bit前提になっていると、64bit版のOfficeでエラーになります。PtrSafeLongPtr を使った宣言に見直し、引数の型や文字列の扱いを点検します。

多言語環境・ロケール差の影響

OSの表示言語が異なると、WMIの返す文字列が想定と違う場合があります。比較や抽出は、文字列の一致ではなく、数値や論理値など言語に依存しない項目で行うと安定します。

ネットワーク制限やVPNの影響

社外接続やVPN経由では、一部の問い合わせが遅くなったり失敗したりします。タイムアウトやリトライ回数を設計し、ユーザーに待ち時間の目安を示すと混乱を減らせます。

FAQ:どこから調べればよい?

まずは参照設定の有無とAPI宣言の型を確認し、次にWMIサービスの状態と権限を見ます。最後にネットワーク周りを切り分けると、原因にたどり着きやすくなります。

まとめと次の一歩

VBAでの環境情報取得は、Environ、WMI、APIの三本柱で構成すると整理しやすくなります。手軽さ、情報量、精度のバランスを取り、失敗時の振る舞いを先に決めておくのが実務のコツです。保存や共有の扱いは最小化を徹底し、規程の確認を忘れないようにします。

本記事の要点の再確認

最初はEnvironで着手し、不足をWMIやAPIで補完します。出力形式は即時ウィンドウとワークシートを使い分け、値の単位や表の見やすさを整えます。収集範囲は目的に沿って絞り込みます。

応用例(インベントリ台帳、稼働端末の棚卸)

取得関数を組み合わせれば、インベントリ台帳の自動作成や、稼働端末の棚卸に応用できます。配布時は参照なし構成を選ぶと、設置先の負担を減らせます。変更管理のために、関数名や出力形式を安定させておくと良いでしょう。

FAQ:Excel以外(Access/Word)でも使える?

基本的な考え方は同じです。VBEが使えるアプリなら多くのコードは流用できますが、出力先の扱いはそれぞれ異なります。まずは小さな関数から試し、動作確認を進めてください。ンスで提示、比較は表で記述、総量調整済み。

ABOUT ME
スポンサーリンク
記事URLをコピーしました