2009-10-14 125 views
8

我需要能夠從遠程計算機列表中讀取特定註冊表項中的值。 我可以用下面的代碼如何閱讀遠程註冊表項?

using Microsoft.Win32; 

     RegistryKey rkey = Registry.LocalMachine; 
     RegistryKey rkeySoftware=rkey.OpenSubKey("Software"); 
     RegistryKey rkeyVendor = rkeySoftware.OpenSubKey("VendorName"); 
     RegistryKey rkeyVersions = rkeyVendor.OpenSubKey("Versions"); 

     String[] ValueNames = rkeyVersions.GetValueNames(); 
     foreach (string name in ValueNames) 
     { 
      MessageBox.Show(name + ": " + rkeyVersions.GetValue(name).ToString()); 
     } 

本地做,但我不知道如何獲取遠程計算機相同的信息。我甚至使用正確的方法,還是應該看WMI或其他?

+1

你考慮過WMI嗎? – 2009-10-14 14:20:47

回答

12

您可以通過WMI實現此目的,但我認爲您也可以通過您當前使用的相同機制(即Microsoft.Win32命名空間類)來實現它。

你需要看看到:

OpenRemoteBaseKey Method

上面的鏈接提供了範例。它應該像下面的那樣簡單:

// Open HKEY_CURRENT_USER\Environment 
// on a remote computer. 
environmentKey = RegistryKey.OpenRemoteBaseKey(
        RegistryHive.CurrentUser, remoteName).OpenSubKey(
        "Environment"); 

但是請注意,這會會有安全隱患中打開遠程註冊表項,所以你可能需要確保您有相關的安全權限,要做到這一點。對於這一點,你要考慮的:

SecurityPermission

RegistryPermission

類的System.Security.Permissions命名空間。

+1

接受了這個答案,並將更多信息放在我如何用下面的答案解決我的問題。 – etoisarobot 2009-10-16 13:05:52

1

win32 API允許您通過RegConnectRegistry指定計算機名稱。我不確定.NET包裝是否暴露了這一點。你也可以像你提到的那樣使用WMI。

1

查找OpenRemoteBaseKey()。

9

我發現我可以像CraigTP所示使用OpenRemoteBaseKey()方法,但它需要我更改目標計算機上註冊表中的權限。

這是我寫的代碼,一旦我改變了權限就工作了。

RegistryKey rkey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "RemoteComputer"); 
RegistryKey rkeySoftware = rkey.OpenSubKey("Software"); 
RegistryKey rkeyVendor = rkeySoftware.OpenSubKey("VendorName"); 
RegistryKey rkeyVersions = rkeyVendor.OpenSubKey("Versions"); 

String[] ValueNames = rkeyVersions.GetValueNames(); 
foreach (string name in ValueNames) 
{ 
    MessageBox.Show(name + ": " + rkeyVersions.GetValue(name).ToString()); 
} 

我還發現我可以使用WMI獲得相同的信息而無需修改權限。這是WMI的代碼。

ManagementScope ms = new ManagementScope(); 
ms.Path.Server = "flebbe"; 
ms.Path.NamespacePath = "root\\default"; 
ms.Options.EnablePrivileges = true; 
ms.Connect(); 

ManagementClass mc = new ManagementClass("stdRegProv"); 
mc.Scope = ms; 

ManagementBaseObject mbo; 
mbo = mc.GetMethodParameters("EnumValues"); 

mbo.SetPropertyValue("sSubKeyName", "SOFTWARE\\VendorName\\Versions"); 

string[] subkeys = (string[])mc.InvokeMethod("EnumValues", mbo, null).Properties["sNames"].Value; 

ManagementBaseObject mboS; 
string keyValue; 

foreach (string strKey in subkeys) 
{ 
    mboS = mc.GetMethodParameters("GetStringValue"); 
    mboS.SetPropertyValue("sSubKeyName", "SOFTWARE\\VendorName\\Versions"); 
    mboS.SetPropertyValue("sValueName", strKey); 

    keyValue = mc.InvokeMethod("GetStringValue", mboS, null).Properties["sValue"].Value.ToString(); 
    MessageBox.Show(strKey + " : " + keyValue); 
} 

P.S. 我正在調用循環中的GetStringValue()方法,因爲我知道所有的值都是字符串。如果有多種數據類型,則需要從EnumValues方法的Types輸出參數中讀取數據類型。

+0

您更改了哪些權限以便「OpenRemoteBaseKey」工作?謝謝! – boboes 2018-01-04 14:58:59

1

這是我與端部去的溶液:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 


// add a reference to Cassia (MIT license) 
// https://code.google.com/p/cassia/ 

using Microsoft.Win32; 

namespace RemoteRegistryRead2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String domain = "theDomain"; 
      String user = "theUserName"; 
      String password = "thePassword"; 
      String host = "machine-x11"; 


      using (Cassia.UserImpersonationContext userContext = new Cassia.UserImpersonationContext(domain + "\\" + user, password)) 
      { 
       string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
       System.Console.WriteLine("userName: " + userName); 

       RegistryKey baseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, host); 
       RegistryKey key = baseKey.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName"); 

       String computerName = key.GetValue("ComputerName").ToString(); 
       Console.WriteLine(computerName); 
      } 
     } 
    } 
} 

就像一個魅力:]

1
經由Windows註冊表(遠程:OpenRemoteBaseKey)在c#安裝的程序

易例如

using Microsoft.Win32; 
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 


namespace SoftwareInventory 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //!!!!! Must be launched with a domain administrator user!!!!! 
      Console.ForegroundColor = ConsoleColor.Green; 
      StringBuilder sbOutFile = new StringBuilder(); 
      Console.WriteLine("DisplayName;IdentifyingNumber"); 
      sbOutFile.AppendLine("Machine;DisplayName;Version"); 

      //Retrieve machine name from the file :File_In/collectionMachines.txt 
      //string[] lines = new string[] { "NameMachine" }; 
      string[] lines = File.ReadAllLines(@"File_In/collectionMachines.txt"); 
      foreach (var machine in lines) 
      { 
       //Retrieve the list of installed programs for each extrapolated machine name 
       var registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
       using (Microsoft.Win32.RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machine).OpenSubKey(registry_key)) 
       { 
        foreach (string subkey_name in key.GetSubKeyNames()) 
        { 
         using (RegistryKey subkey = key.OpenSubKey(subkey_name)) 
         { 
          //Console.WriteLine(subkey.GetValue("DisplayName")); 
          //Console.WriteLine(subkey.GetValue("IdentifyingNumber")); 
          if (subkey.GetValue("DisplayName") != null) 
          { 
           Console.WriteLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version"))); 
           sbOutFile.AppendLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version"))); 
          } 
         } 
        } 
       } 
      } 
      //CSV file creation 
      var fileOutName = string.Format(@"File_Out\{0}_{1}.csv", "Software_Inventory", DateTime.Now.ToString("yyyy_MM_dd_HH_mmssfff")); 
      using (var file = new System.IO.StreamWriter(fileOutName)) 
      { 

       file.WriteLine(sbOutFile.ToString()); 
      } 
      //Press enter to continue 
      Console.WriteLine("Press enter to continue !"); 
      Console.ReadLine(); 
     } 


    } 
}