PythonでOS,CPU,DISK,ユーザー情報を簡単に取得する!

Python

OS,CPU,DISK,ユーザー情報を取得するには?

業務プログラムを作成し運用をしているとクライアントPCのOS,CPU,DISK,ユーザー情報を取得してサポート対応したい場合があります。例えば以下シチュエーションが考えられます。

  1. 互換性の確認: クライアントのOSやCPU情報を知ることで、業務アプリケーションがそのシステムと互換性があるかを判断できます。
  2. パフォーマンスの最適化: CPUやディスクの性能情報を取得することで、必要なスペックを持った機械で操作されているかがわかります。
  3. トラブルシューティングの支援: システム情報を事前に知ることで、サポート担当者は問題解決をより迅速に行うことができます。特にユーザーが遭遇している問題が特定のシステム構成に関連している場合その情報は非常に価値があります。
  4. セキュリティの向上: システムの脆弱性はしばしば特定のOSやそのバージョンに依存するためクライアントのOS情報を把握することで、それに応じたセキュリティ対策を施すことができます。
  5. リソースの管理: クライアントのディスク使用状況を把握することでリソースが足りているか判断材料となります。

クライアントPCの上記情報をデータベースやテキストへログ出力などをすることにより、事前に把握して対応しやすくすることができます。

※WMIモジュールを利用しているのでWindowsのみで動作可能です。

OS,CPU,DISK,ユーザー情報を取得するサンプルコード

OS,CPU,DISK,ユーザー情報を取得するサンプルコードを紹介します。

# pip install pywin32
# wmiモジュールを使用することでWindows Management Instrumentation (WMI) を操作
import wmi

def get_system_info():
    """
    WMIを利用してシステムのOS、CPU、ディスク使用状況、ログインユーザー情報を取得する関数。

    Returns:
        dict: システム情報を含む辞書。キーは 'os_info', 'cpu_info', 'disk_info', 'login_user_info'。
    """
    # WMIインスタンスを初期化します。
    wmi_client = wmi.WMI()

    # OS情報を取得するためのリストを初期化します。
    os_info = []
    # Win32_OperatingSystemクラスを使ってOSの情報を取得し、リストに追加します。
    for os in wmi_client.Win32_OperatingSystem():
        os_info.append({
            'Name': os.Name.split('|')[0],      # OS名。インストール先情報は不要なため、'|'で分割し最初の要素のみを使用
            'Version': os.Version,              # OSのバージョン
            'Manufacturer': os.Manufacturer,    # OSの製造元
            'Architecture': os.OSArchitecture   # OSのアーキテクチャ(32ビットまたは64ビット)
        })

    # CPU情報を取得するためのリストを初期化します。
    cpu_info = []
    # Win32_Processorクラスを使ってCPUの情報を取得し、リストに追加します。
    for cpu in wmi_client.Win32_Processor():
        cpu_info.append({
            'Name': cpu.Name,                               # CPU名
            'Manufacturer': cpu.Manufacturer,               # CPUの製造元
            'Description': cpu.Description,                 # CPUの詳細な説明
            'MaxClockSpeed': f"{cpu.MaxClockSpeed} MHz"     # CPUの最大クロック速度(MHz単位)
        })

    # ディスク使用状況を取得するためのリストを初期化します。
    disk_info = []
    # Win32_LogicalDiskクラスを使って論理ディスクの情報を取得します。
    for disk in wmi_client.Win32_LogicalDisk(DriveType=3):  # DriveType=3はローカルディスクを指します。
        disk_info.append({
            'Caption': disk.Caption,                                    # ディスクのラベル(例: C:)
            'Size': f"{int(disk.Size) / (1024**3):.2f} GB",             # ディスクの総サイズ(GB単位)
            'FreeSpace': f"{int(disk.FreeSpace) / (1024**3):.2f} GB"    # ディスクの空き容量(GB単位)
        })

    # ログインユーザー情報を取得するためのリストを初期化します。
    login_user_info = []
    # Win32_ComputerSystemクラスを使ってログインユーザーの情報を取得します。
    for cs in wmi_client.Win32_ComputerSystem():
        login_user_info.append({
            'UserName': cs.UserName  # 現在ログインしているユーザーの名前
        })

    # 取得した情報を辞書にまとめて返します。
    system_info = {
        'os_info': os_info,
        'cpu_info': cpu_info,
        'disk_info': disk_info,
        'login_user_info': login_user_info
    }

    return system_info


############################################################################
# 関数のテスト
if __name__ == "__main__":

    # 関数からシステム情報を取得
    info = get_system_info()
    
    # 取得した情報を表示
    for key, value in info.items():
        # 値がリスト型の場合、各要素を表示
        if isinstance(value, list):
            print(key)
            for item in value:
                print(item)
            print()

WMIモジュールを使用していますので事前にモジュールをインストールする必要があります。以下を参照してインストールしてください。

pip install pywin32

実行結果

以下のようにOS,CPU,DISK,ユーザー情報情報が取れます。

os_info
{'Name': 'Microsoft Windows 11 Pro', 'Version': '10.0.22621', 'Manufacturer': 'Microsoft Corporation', 'Architecture': '64 ビット'}

cpu_info
{'Name': '12th Gen Intel(R) Core(TM) i7-1260P', 'Manufacturer': 'GenuineIntel', 'Description': 'Intel64 Family 6 Model 154 Stepping 3', 'MaxClockSpeed': '2100 MHz'}

disk_info
{'Caption': 'C:', 'Size': '461.96 GB', 'FreeSpace': '339.03 GB'}

login_user_info
{'UserName': 'GZHV\\wkusr'}

os_infoでインストールされているOSとバージョン、マニュファクチャラー、32bitor64bit
cpu_infoで利用しているCPU,マニュファクチャラー、クロックスピード
disk_infoでドライブレター、容量と空きサイズ
login_user_infoでドメイン名とユーザー名
がそれぞれ取得できるようになっています。

解説

WMI(Windows Management Instrumentation)から取得しているのでこの関数を変更することにより利用できる情報は増えます。

情報の追加

例えばOS情報であればfor os in wmi_client.Win32_OperatingSystem():で取得しているので「Win32_OperatingSystem」で検索をするとMicrosoftのページが開き「Win32_OperatingSystem」で利用できるプロパティが出ますので、それを以下のようにos_info.append({・・・})以下に加えると追加で情報が取得できます。

※SystemDirectoryとSystemDeviceを加えた例です。

    for os in wmi_client.Win32_OperatingSystem():
        os_info.append({
            'Name': os.Name.split('|')[0],      # OS名。インストール先情報は不要なため、'|'で分割し最初の要素のみを使用
            'Version': os.Version,              # OSのバージョン
            'Manufacturer': os.Manufacturer,    # OSの製造元
            'Architecture': os.OSArchitecture,  # OSのアーキテクチャ(32ビットまたは64ビット)
            'SystemDirectory': os.SystemDrive,  # OSのドライブ
            'SystemDevice': os.SystemDevice     # OSのアーキテクチャ(32ビットまたは64ビット)
        })

結果は以下のように追加となります。

os_info
{'Name': 'Microsoft Windows 11 Pro', 'Version': '10.0.22621', 'Manufacturer': 'Microsoft Corporation', 'Architecture': '64 ビット', 'SystemDirectory': 'C:', 'SystemDevice': '\\Device\\HarddiskVolume3'}

メモリ情報の出力

前段の情報の追加と考え方は同様ですが、ログインユーザー情報もfor cs in wmi_client.Win32_ComputerSystem():と同じような考え方で取得しています。「Win32_ComputerSystem」には「TotalPhysicalMemory」プロパティが存在するのでその情報を追加すると現在利用しているPCの物理メモリ量が取得できます。

※TotalPhysicalMemoryを追加した例です。

    for cs in wmi_client.Win32_ComputerSystem():
        login_user_info.append({
            'UserName': cs.UserName,    # 現在ログインしているユーザーの名前
            'TotalPhysicalMemory': f"{int(cs.TotalPhysicalMemory) / (1024**3):.2f} GB"   # 物理メモリ(GB単位)
        })

結果は以下のように追加となります。

login_user_info
{'UserName': 'GZHV\\wkusr', 'TotalPhysicalMemory': '15.64 GB'}

最後に

以上がPythonでOS,CPU,DISK,ユーザー情報を取得する方法です。

サポート対応でクライアントPC情報を取得したい場合に活用してみてはいかがでしょうか。

コメント

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