Windowsのシステム構成要素についての情報を取得できるWMI(Windows Management Infrastructure)を利用してOS(オペレーティング システム)の情報を取得する方法を紹介します。
本記事では、WMIのオブジェクトの利用にC#を使用します。
目次
WindowsOSの情報を取得する
WindowsOSの情報を取得するには、System.Management名前空間にあるManagementClassクラスを使用します。
ManagementClassクラスのコンストラクタの引数に「Win32_OperatingSystem」を指定してインスタンスを生成することで、WindowsOSの情報を取得することができます。
情報を取得する手順
Win32_OperatingSystemを利用する際には、以下の手順でオブジェクトを生成します。
- System.Management.ManagementClassクラスのパラメーターに”Win32_OperatingSystem”を渡してWMIのWin32_OperatingSystemクラスのオブジェクトを取得します。
- 取得したクラスオブジェクトのGetメソッドを呼び出して、WMIクラス情報を管理オブジェクトにバインドします。
- クラスオブジェクトのScopeプロパティのOptionsプロパティのEnablePrivilegesプロパティにtrueを指定し、接続操作のためにユーザー特権を有効にして利用可能にします。
- クラスオブジェクトのGetInstancesメソッドを呼び出して、ManagementObjectのコレクションを取得します。
- 取得したコレクションからManagementObjectのインスタンスを取得します。
- 取得したインスタンスのプロパティから必要な情報を取得します。
System.Management.dllの参照
プログラムを記述する前にSystem.Management.dllへの参照をプロジェクトに追加します。
Visual StudioでC#のプロジェクトを作成します。
プロジェクトが作成できたら、ソリューションエクスプローラーの「参照」を右クリックし、表示されるコンテキストメニューから「参照の追加」をクリックします。
「参照マネージャー」ダイアログボックスが表示されますので、左ペインの「アセンブリ」をクリックします。
右ペインに表示されるアセンブリの一覧から「System.Management」を選択して「OK」ボタンをクリックします。
サンプルコード
System.Management.dllへの参照が追加できたら、コードエディターを開きます。
System.Management名前空間へのusingを追加し、OS情報を取得するコードを記述します。
以下のサンプルでは、コンソールアプリケーションのプロジェクトを作成して、OSの主な情報を取得しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
using System; // System.Management.dllの参照が必要 using System.Management; namespace ConsoleApp1 { class Program { // エントリーポイント static void Main(string[] args) { ShowOperatingSystemInformation(); } private static void ShowOperatingSystemInformation() { // Win32_OperatingSystemクラスを作成する using (ManagementClass managementClass = new ManagementClass("Win32_OperatingSystem")) { // Win32_OperatingSystemオブジェクトを取得する managementClass.Get(); // 権限を有効化する managementClass.Scope.Options.EnablePrivileges = true; // WMIのオブジェクトのコレクションを取得する using (ManagementObjectCollection managementObjectCollection = managementClass.GetInstances()) { // WMIのオブジェクトを列挙する foreach (ManagementObject managementObject in managementObjectCollection) { // OSの名前 Console.WriteLine($"Name: {managementObject["Name"]}"); // OSの簡単な説明 Console.WriteLine($"Caption: {managementObject["Caption"]}"); // OSの説明(コンピュータの説明) Console.WriteLine($"Description: {managementObject["Description"]}"); // OSのバージョン Console.WriteLine($"Version: {managementObject["Version"]}"); // OSのビルド番号 Console.WriteLine($"BuildNumber: {managementObject["BuildNumber"]}"); // OSの製造元の名前 Console.WriteLine($"Manufacturer: {managementObject["Manufacturer"]}"); // OSの言語識別子(言語ID) Console.WriteLine($"Locale: {managementObject["Locale"]}"); // OSの言語 Console.WriteLine($"OSLanguage: {managementObject["OSLanguage"]}"); // シリアルナンバー Console.WriteLine($"SerialNumber: {managementObject["SerialNumber"]}"); // 製品の種類(1: ワークステーション、2: ドメインコントローラー, 3: サーバー) Console.WriteLine($"ProductType: {managementObject["ProductType"]}"); // OSのアーキテクチャ(32ビット or 64 ビット) Console.WriteLine($"OSArchitecture: {managementObject["ProductType"]}"); // OSがインストールされた日時 Console.WriteLine($"InstallDate: {managementObject["InstallDate"]}"); // OSが最後に起動された日時 Console.WriteLine($"LastBootUpTime: {managementObject["LastBootUpTime"]}"); // OSがインストールされているデバイス(物理ディスク/パーティション) Console.WriteLine($"SystemDevice: {managementObject["SystemDevice"]}"); // OSが起動するデバイス(ディスクドライブ) Console.WriteLine($"BootDevice: {managementObject["BootDevice"]}"); // システムドライブ Console.WriteLine($"SystemDrive: {managementObject["SystemDrive"]}"); // Windowsディレクトリ Console.WriteLine($"WindowsDirectory: {managementObject["WindowsDirectory"]}"); // WMIのオブジェクトのリソースを開放する managementObject.Dispose(); } } } } } } |
WMIのWin32_OperatingSystemクラスで取得できる情報
WMIのWin32_OperatingSystemクラスでは上記のOS情報以外にも、Windowsのシステムに関する様々な情報が取得できます。
-
BootDevice
OSが起動するディスクドライブの名前です。
-
BuildNumber
OSのビルド番号です。
-
BuildType
OSで使用されるビルドの種類です。
-
Caption
OSの簡単な説明文です。この情報にはバージョンを含みます。
-
CodeSet
OSで使用されるコードページの値です。日本語 シフトJISは932になります。
-
CountryCode
OSで使用される国/地域コードです。日本は81になります。
-
CreationClassName
インスタンスの作成で使用されるクラス名です。
-
CSCreationClassName
スコーピングコンピューターシステムの作成クラス名です。
-
CSDVersion
インストールされている最新のサービスパックの情報です。
-
CSName
スコーピングコンピューターシステムの名前です。
-
CurrentTimeZone
OSがグリニッジ標準時(GMT)からオフセットされている分数です。日本は540(9時間)になります。
-
DataExecutionPrevention_32BitApplications
データ実行防止(DEP)が適用された状態であるかどうかを示す値です。
-
DataExecutionPrevention_Available
ハードウェアがWindowsデータ実行防止(DEP)技術をサポートするかどうかを示す値です。
-
DataExecutionPrevention_Drivers
データ実行防止(DEP)が適用された状態でドライバーが実行されているかどうかを示す値です。
-
DataExecutionPrevention_SupportPolicy
データ実行防止(DEP)の4つの設定のうちのどれが適用されるかを表す値です。(0: AlwaysOff, 1: AlwaysOn, 2: OptIn, 3: OptOut)
-
Debug
OSがチェック(デバッグ)ビルドであるかどうかを示す値です。
-
Description
OSの説明です。
-
Distributed
OSが複数のコンピューターシステムノードに分散されているかどうかを示す値です。
-
EncryptionLevel
保護されている処理の暗号化のレベルをビット数で示した値です。
-
ForegroundApplicationBoost
フォアグラウンドアプリケーションに与えられる優先度の上昇を表す値です。
-
FreePhysicalMemory
利用可能な物理メモリの空き容量です。単位はKBになります。
-
FreeSpaceInPagingFiles
他のページをスワップアウトすることなくOSのページングファイルにマップできるメモリの容量です。単位はKBになります。
-
FreeVirtualMemory
利用可能な仮想メモリの空き容量です。単位はKBになります。
-
InstallDate
OSがインストールされた日時です。
-
LargeSystemCache
メモリを最適化するかどうかを示し値です。(0: アプリケーション用, 1: システムパフォーマンス用)
-
LastBootUpTime
OSが最後に起動した時刻です
-
LocalDateTime
OSのローカル日時です。
-
Locale
OSで使用される言語識別子(言語ID)です。
-
Manufacturer
OSの製造元の名前です。
-
MaxNumberOfProcesses
OSがサポート可能なプロセスコンテキストの最大数です。
-
MaxProcessMemorySize
プロセスに割り当てられるメモリの最大数です。単位はKBになります。
-
MUILanguages
コンピューターにインストールされている多言語ユーザーインターフェイスです。
-
Name
OSのインスタンスの名前です。
-
NumberOfLicensedUsers
OSのユーザーライセンス数です。
-
NumberOfProcesses
OSで現在実行されているプロセスのコンテキスト数です。
-
NumberOfUsers
OSが現在の状態情報を格納しているユーザーセッションの数です。
-
OperatingSystemSKU
OSの最小管理単位(在庫管理単位)の数です。
-
Organization
OSの登録ユーザーの会社名です。
-
OSArchitecture
OSのアーキテクチャです。(32ビット or 64 ビット)
-
OSLanguage
インストールされているOSの言語バージョンです。
-
OSProductSuite
OSにインストールされ、さらにライセンスされているシステム製品の識別される値です。
-
OSType
OSの種類を示す値です。
-
OtherTypeDescription
OSTypeが「1: その他」の場合の説明です。
-
PAEEnabled
PAE(物理アドレス拡張)が、Intelプロセッサで実行されているオペレーティングシステムによって有効になるかどうかを示す値です。
-
PlusProductID
Windows Plus!のIDです。
-
PlusVersionNumber
Windows Plus!のバージョン番号です。
-
PortableOperatingSystem
オペレーティングシステムが外部USBデバイスから起動したかどうかを表す値です。
-
Primary
プライマリのOSかどうかを表す値です。
-
ProductType
製品の種類です。(1: ワークステーション、2: ドメインコントローラー, 3: サーバー)
-
RegisteredUser
OSの登録ユーザーの名前です。
-
SerialNumber
OSの製品シリアルID番号です。
-
ServicePackMajorVersion
コンピューターシステムにインストールされているサービスパックのメジャーバージョン番号です。
-
ServicePackMinorVersion
コンピューターシステムにインストールされているサービスパックのマイナーバージョン番号です。
-
SizeStoredInPagingFiles
ページング ファイルで格納される容量です。単位はKBになります。
-
Status
オブジェクトの現在の状態です。(OK、Error、Degraded、Unknown、Pred Failなどがあります。)
-
SuiteMask
システムで利用可能な製品を識別するビットフラグのセットを示す値です。
-
SystemDevice
OSがインストールされている物理ディスクパーティションです。
-
SystemDirectory
OSのシステムディレクトリです。
-
SystemDrive
OSが存在するディスクドライブの文字です。
-
TotalSwapSpaceSize
スワップ領域の合計容量です。単位はKBになります。
-
TotalVirtualMemorySize
仮想メモリの合計容量です。単位はKBになります。
-
TotalVisibleMemorySize
利用可能な物理メモリの合計容量です。単位はKBになります。
-
Version
OSのバージョン番号です。
-
WindowsDirectory
Windowsディレクトリです。
サンプルプログラム
ここでは、WMIのWin32_OperatingSystemクラス(ManagementClass)のManagementObjectのプロパティを列挙するプログラムを作成します。
サンプルフォームのデザイン
フォームにはWMIのManagementObjectのプロパティの情報を表示するためのリストビューを配置します。
サンプルコード
フォームのロード時にWMIのManagementObjectのプロパティを取得して、リストビューに名前と値を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using System; using System.Windows.Forms; //System.Management.dllの参照が必要 using System.Management; namespace WindowsFormsApp1 { public partial class Form1 : Form { // コンストラクタ public Form1() { InitializeComponent(); } // フォームロードイベントメソッド private void Form1_Load(object sender, EventArgs e) { try { // Win32_OperatingSystemクラスを作成する using (ManagementClass managementClass = new ManagementClass("Win32_OperatingSystem")) { // Win32_OperatingSystemオブジェクトを取得する managementClass.Get(); // 権限を有効化する managementClass.Scope.Options.EnablePrivileges = true; // WMIのオブジェクトのコレクションを取得する using (ManagementObjectCollection managementObjectCollection = managementClass.GetInstances()) { // WMIのオブジェクトを列挙する foreach (ManagementObject managementObject in managementObjectCollection) { // WMIのオブジェクトのプロパティのコレクションを取得する PropertyDataCollection propertyDataCollection = managementObject.Properties; // WMIのオブジェクトのプロパティを列挙する foreach (PropertyData propertyData in propertyDataCollection) { string name = propertyData.Name; object value = propertyData.Value; string valueText = value?.ToString(); ListViewItem item = new ListViewItem(new string[] { name, valueText }); this.listView1.Items.Add(item); } // WMIのオブジェクトのリソースを開放する managementObject.Dispose(); } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
サンプルプログラムの実行
プロジェクトをビルドしてプログラムを実行(デバッグ)します。
Win32_OperatingSystemクラスのプロパティの一覧がリストに表示されます。