ищу реестр, читаю через WMI - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь получить версию своего приложения, и я могу сделать это для локальной машины, используя приведенный ниже код,

try
        {
            string path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Products";

            RegistryKey key = null;

            if (!string.IsNullOrEmpty(path))
            {
                //get the 64-bit view first
                key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
                key = key.OpenSubKey(path);

                //Couldn't find the value in the 64-bit view so grab the 32-bit view
                if (key == null)
                {
                    key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
                    key = key.OpenSubKey(path);
                }
            }


            foreach (string tempKeyName in key.GetSubKeyNames())
            {
                RegistryKey tempKey = key.OpenSubKey(tempKeyName + "\\InstallProperties");
                if (tempKey != null)
                {
                    if (string.Equals(Convert.ToString(tempKey.GetValue("DisplayName")), "My Application", StringComparison.CurrentCultureIgnoreCase))
                    {
                        Console.WriteLine(Convert.ToString(tempKey.GetValue("DisplayVersion")));
                        break;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

Теперь мне нужно прочитать для удаленной машины, и выше кусок кода не работает, так что ищете решение WMI?

Можем ли мы сделать это через WMI?

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете использовать класс Win32_Product из WMI.Затем используйте пространство имен Microsoft.Management.Infrastructure для удаленного считывания с C # (https://docs.microsoft.com/en-us/windows/desktop/wmisdk/connecting-to-wmi-on-a-remote-computer).. Это простой и хороший способ считывания WMI удаленно. Я использовал его в своей WMI-программе следующим образом:

using (var cimSession = CimSession.Create(computername))
{
    var select = $"SELECT Version FROM  Win32_Product WHERE Name = 'AppName'";

    var allVolumes = cimSession.QueryInstances(@"root\cimv2", "WQL", select);

    double value = 0;
    var cimInstances = allVolumes.ToList();
    if (!cimInstances.Any())
        throw new CimException($"No Values to read");

    foreach (var volume in cimInstances)
        value = Convert.ToDouble(volume.CimInstanceProperties["Version"].Value);
}
...