如何读取远程注册表项?

eto*_*bot 8 c# registry wmi

我需要能够从远程计算机列表中读取特定注册表项中的值.我可以使用以下代码在本地执行此操作

   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());
        }
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获得远程计算机的相同信息.我甚至使用正确的方法还是应该查看WMI或其他什么?

Cra*_*gTP 12

你可以通过WMI实现这一点,虽然我认为你也可以通过你当前使用的相同机制(即Microsoft.Win32命名空间类)来实现它.

你需要调查:

OpenRemoteBaseKey方法

上面的链接给出了示例.它应该像下面这样简单:

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

但请注意,打开远程注册表项时会出现安全隐患,因此您可能需要确保具有相关的安全权限才能执行此操作.为此,您需要查看:

性SecurityPermission

RegistryPermission的

System.Security.Permissions命名空间中的类.


eto*_*bot 9

我发现我可以使用CraigTP显示使用OpenRemoteBaseKey()方法但是它要求我更改dest计算机上注册表中的权限.

这是我编写的代码,一旦我更改了权限.

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());
}
Run Code Online (Sandbox Code Playgroud)

我还发现,我可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

PS我在循环中调用GetStringValue()方法,因为我知道所有的值都是字符串.如果有多种数据类型,则需要从EnumValues方法的Types输出参数中读取数据类型.