.NET TIPS

リモート・コンピュータのレジストリを参照/操作するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2007/09/20

 「TIPS:レジストリの値を取得するには?」や「TIPS:レジストリの値を設定するには?」では、利用中のローカル・コンピュータ(いわゆる「マイ コンピュータ」)のレジストリを取り扱う方法を紹介したが、Windowsではリモート・コンピュータ(=別のコンピュータ)のレジストリ(「ネットワーク レジストリ」と呼ばれる)も参照・操作することができる。

 次の画面はレジストリ・エディタを使ってリモート・コンピュータのレジストリを参照/操作している例だ。

レジストリ・エディタによるリモート・コンピュータのレジストリの参照/操作
この例では「Server01」というリモート・コンピュータのレジストリを参照している。なお、レジストリ・エディタは起動するには、[スタート]メニューの[ファイル名を指定して実行]をクリックして[ファイル名を指定して実行]ダイアログを起動し、そのダイアログのテキストボックスに「regedit」を入力して実行する。

 本稿では、このようなリモート・コンピュータのレジストリを、.NET Frameworkのクラス・ライブラリを使って参照/操作する方法を紹介する。

ネットワーク・レジストリを参照/操作する方法

 ローカル・コンピュータであろうと、リモート・コンピュータであろうと、基本的なレジストリの参照/操作方法はほぼ変わらない。違うのは基本キーだけである。基本キーとは、レジストリの参照・操作を行う基点となるRegistryKeyオブジェクト(=Microsoft.Win32名前空間のRegistryKeyクラスのインスタンス)のことだ。

 基本キーは、ローカル・コンピュータの場合、Registryクラス(Microsoft.Win32名前空間)の静的フィールドであるLocalMachineフィールドやCurrentUserフィールドを利用して取得するが、リモート・コンピュータの場合、Registryクラスの静的メソッドであるOpenRemoteBaseKeyメソッドを使う。

 OpenRemoteBaseKeyメソッドは、第1パラメータにRegistryHiveオブジェクト(=Microsoft.Win32名前空間のRegistryHive列挙体のメンバ)を、第2パラメータにリモート・コンピュータの名前(例えば「Server01」などの文字列)を受け取り、戻り値として基本RegistryKeyオブジェクト(=基本キー)を返す。RegistryHive列挙体のメンバは次の表のとおりだ。

RegistryHive列挙体のメンバ 取得される基本キー
RegistryHive.ClassesRoot HKEY_CLASSES_ROOT
RegistryHive.CurrentConfig HKEY_CURRENT_CONFIG
RegistryHive.CurrentUser HKEY_CURRENT_USER
RegistryHive.DynData HKEY_DYN_DATA
RegistryHive.LocalMachine HKEY_LOCAL_MACHINE
RegistryHive.PerformanceData HKEY_PERFORMANCE_DATA
RegistryHive.Users HKEY_USERS
RegistryHive列挙体のメンバと、取得される基本キー
いずれの基本キー(=基本RegistryKeyオブジェクト)も「リモート・コンピュータのレジストリ」であることに注意。

 以上で基本キーが取得できたら、あとは前述のとおり、ローカル・コンピュータの場合と同じ方法で、レジストリの参照/操作を行えばよい。

 それでは、例えば「Server01」という名前のリモート・コンピュータの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths」配下のキーを列挙する場合を考えてみよう(関連:「TIPS:レジストリのキーを列挙するには?」)。

 まず、OpenRemoteBaseKeyメソッドの第1パラメータに「RegistryHive.LocalMachine」を、第2パラメータに「"Server01"」を指定して基本RegistryKeyオブジェクトを取得する。そして、このオブジェクトが持つOpenSubKeyメソッドを、開きたいレジストリのキーのパス名「SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths」をパラメータに指定して呼び出す(パス名は「HKEY_LOCAL_MACHINE」などのルート名を省略する必要がある)。これにより、開きたいキーに対応したRegistryKeyオブジェクト(=親キー)が取得できるので、あとはこのオブジェクトが持つGetSubKeyNamesメソッドを呼び出せば、その親キーの配下にあるすべてのサブ・キー(=子キー)の名前が、文字列配列型の戻り値として取得できる。

 以上の処理を実装したコード例を次に示す。

using System;
using Microsoft.Win32;

class Program
{
  static void Main(string[] args)
  {
    string remoteComputerName = "Server01";
    string baseKeyName =
      @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths";

    // リモート・コンピュータのベース・キーを取得する
    RegistryKey rRemoteBaseKey =
      RegistryKey.OpenRemoteBaseKey(
        RegistryHive.LocalMachine, remoteComputerName);

    // リモート・コンピュータの親キーを開く
    RegistryKey rParentKey = rRemoteBaseKey.OpenSubKey(baseKeyName);

    // 親キーが持つすべてのサブ・キー名を取得する
    string[] arySubKeyNames = rParentKey.GetSubKeyNames();

    rParentKey.Close();

    foreach (string subKeyName in arySubKeyNames)
    {
      Console.WriteLine(subKeyName);
      // 出力例:
      // CluAdmin.exe
      // cmmgr32.exe
      // ……以下略
    }
  }
}
Imports Microsoft.Win32

Module Module1

  Sub Main()
    Dim remoteComputerName As String = "Server01"
    Dim baseKeyName As String = _
      "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"

    ' リモート・コンピュータのベース・キーを取得す
    Dim rRemoteBaseKey As RegistryKey = _
      RegistryKey.OpenRemoteBaseKey( _
        RegistryHive.LocalMachine, remoteComputerName)

    ' リモート・コンピュータの親キーを開く
    Dim rParentKey As RegistryKey = rRemoteBaseKey.OpenSubKey(baseKeyName)


    ' 親キーが持つすべてのサブ・キー名を取得する
    Dim arySubKeyNames() As String = rParentKey.GetSubKeyNames()

    rParentKey.Close()

    For Each valueName As String In arySubKeyNames
      Console.WriteLine(valueName)
      ' 出力例:
      ' CluAdmin.exe
      ' cmmgr32.exe
      ' ……以下略
    Next

  End Sub

End Module
リモート・コンピュータのレジストリを参照するコンソール・アプリケーションのサンプル・プログラム(上:C#、下:VB)

 開いたキーを閉じるため、RegistryKeyオブジェクトのCloseメソッドを呼び出すことを忘れないようにしてほしい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:レジストリ
使用ライブラリ:Registryクラス(Microsoft.Win32名前空間)
使用ライブラリ:RegistryKeyクラス(Microsoft.Win32名前空間)
関連TIPS:レジストリの値を取得するには?
関連TIPS:レジストリの値を設定するには?
関連TIPS:レジストリのキーを列挙するには?

この記事と関連性の高い別の.NET TIPS
レジストリのキーを列挙するには?
レジストリの値を列挙するには?
レジストリの値を取得するには?
レジストリの値を設定するには?
レジストリの値のデータ型を判別するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間