как пропустить проверку реестра, если корневой ключ недоступен - PullRequest
0 голосов
/ 19 июня 2019

У меня есть корневая папка с именем реестра MyApp, внутри у нас много записей, как показано ниже. Мне нужно перейти к каждой подзаписи и получить некоторые данные реестра.

var registryValue = GetRegistryValue(managementScope, "SOFTWARE\\MyApp\\app1", "Version", ipAdd, username, password);
var registryValue = GetRegistryValue(managementScope, "SOFTWARE\\MyApp\\app2", "Version", ipAdd, username, password);
var registryValue = GetRegistryValue(managementScope, "SOFTWARE\\MyApp\\app3", "Version", ipAdd, username, password);

Поддерживаемые методы для получения значения реестра с использованием WMI,

public static string GetRegistryValue(ManagementScope managementScope, string subRegistryPath, string subRegistryKey, string assetNameOrIpAddress, string username, string password)
    {
        string value = string.Empty;

        //get the value from default view
        object registryValue = GetValue(managementScope, subRegistryPath, subRegistryKey);

        if (registryValue != null)
        {
            value = registryValue.ToString();
        }
        else
        {
            //change the registry view to 64
            managementScope.Options.Context.Add("__ProviderArchitecture", 64);
            managementScope.Options.Context.Add("__RequiredArchitecture", true);

            //again try to get the value 
            registryValue = GetValue(managementScope, subRegistryPath, subRegistryKey);

            if (registryValue != null)
            {
                value = registryValue.ToString();
            }
        }

        return value;
    }

    private static object GetValue(ManagementScope managementScope, string subKeyName, string valueName)
    {

        using (ManagementClass registry = new ManagementClass(managementScope, new ManagementPath("StdRegProv"), null))
        {
            ManagementBaseObject inParams = registry.GetMethodParameters("GetStringValue");
            inParams["sSubKeyName"] = subKeyName;
            inParams["sValueName"] = valueName;
            return registry.InvokeMethod("GetStringValue", inParams, null).Properties["sValue"].Value;
        }
    }

То, что я хочу сначала проверить, если корневое имя реестра MyApp недоступно, я хочу отменить все вызовы реестра моего подключа. Это возможно?

Когда я делаю GetRegistryValue(managementScope, "SOFTWARE", "MyApp", ipAdd, username, password), я получаю пустое значение, даже корневая запись реестра MyApp доступна для компьютера. Что здесь не так?

if(GetRegistryValue(managementScope, "SOFTWARE", "MyApp", ipAdd, username, password) is available)
then 
var registryValue = GetRegistryValue(managementScope, "SOFTWARE\\MyApp\\app1", "Version", ipAdd, username, password);
var registryValue = GetRegistryValue(managementScope, "SOFTWARE\\MyApp\\app2", "Version", ipAdd, username, password);
var registryValue = GetRegistryValue(managementScope, "SOFTWARE\\MyApp\\app3", "Version", ipAdd, username, password);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...