Как читать ключи удаленного реестра?

Используя CSS3 можно сделать что-то вроде этого:

div:nth-child(odd)
{
  background-color: red
}

, Но лучше не используют это в течение нескольких лет, если Вы на самом деле хотите, чтобы Ваши пользователи видели цвет...

8
задан etoisarobot 14 October 2009 в 09:45
поделиться

4 ответа

Вы можете добиться этого через WMI, хотя я думаю, что вы также можете добиться этого с помощью того же механизма (например, Microsoft.Win32 классы пространства имен), которые вы в настоящее время используете.

Вам необходимо изучить:

Метод OpenRemoteBaseKey

По ссылке выше приведены примеры. Это должно быть так просто, как что-то вроде:

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

Обратите внимание, что открытие удаленных ключей реестра будет иметь последствия для безопасности, поэтому вам может потребоваться убедиться, что у вас есть соответствующие разрешения безопасности для этого. Для этого вам нужно изучить классы:

SecurityPermission

и

RegistryPermission

в пространстве имен System.Security.Permissions .

.
12
ответ дан 3 November 2019 в 14:38
поделиться

Найдите OpenRemoteBaseKey ().

1
ответ дан 3 November 2019 в 14:38
поделиться

Win32 API позволяет указать имя компьютера через RegConnectRegistry . Я не уверен, что обертки .NET это раскрывают. Вы также можете использовать WMI, как вы упомянули.

1
ответ дан 3 November 2019 в 14:38
поделиться

Я обнаружил, что могу, как показал 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);
}

PS Я вызываю метод GetStringValue () в цикле, поскольку знаю, что все значения являются строками. Если существует несколько типов данных, вам нужно будет прочитать тип данных из выходного параметра Types метода EnumValues.

9
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: