2009-10-14 122 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(); 
     } 


    } 
}