Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с реестром

32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Хочу для начала вытянуть список подразделов HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall
что бы потом из каждого вытянуть по возможности имя программы.
пробую методами Microsoft.Win32 Registry и RegistryKey, не получается...
Может есть способ проще?
Я бы был в принципе доволен даже банальным текстом как в reg файле, получаемым при экспорте ветки, но не знаю как его получить...

upd.
Да, кстати, может кто-нибудь подскажет могу ли я получить список оборудования (как в диспетчере устройств) например из реестра или есть другие способы? Только не по ключам, без использования базы оборудования. Нужен только список типа:
AMD Radeon HD 6700 Series
Intel(R) Core(TM)2 Quad CPU Q9300 @ 2.50GHz

В принципе информацию о процессоре я могу получить и в Microsoft.VisualBasic.Devices.ComputerInfo(), но нужно больше информации...
297
10 февраля 2012 года
koodeer
1.2K / / 02.05.2009
Цитата: LawManiak
пробую методами Microsoft.Win32 Registry и RegistryKey, не получается...


Что именно не получается? Покажите ваш код. Не заставляйте думать, что вы лентяй, желающий халявы.

Цитата: LawManiak
Может есть способ проще?


Нет.

Цитата: LawManiak
Да, кстати, может кто-нибудь подскажет могу ли я получить список оборудования (как в диспетчере устройств) например из реестра или есть другие способы?


Обширнейшую информацию можно получить с помощью технологии WMI.
Некоторые примеры: http://msdn.microsoft.com/en-us/library/aa394587%28v=vs.85%29.aspx
Для облегчения работы скачайте утилиту WMI Code Creator с сайта Microsoft - она бесплатна (гуглится на раз). Эта утилита сгенерирует необходимый код, сведя ручную работу к минимуму.

32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
В попытках считать список пришел к коду вида:
 
Код:
string[] x = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall").GetValueNames();
            for (int i = 0; i < x.Length-1; i++ )
                textBox1.Text += x + Environment.NewLine;

В ответ увы пустота.

Про способ проще я имел ввиду, может есть способ без получения этого списка пройтись по подразделам считывая ключи "DisplayName".
5
10 февраля 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: LawManiak

В ответ увы пустота.

Правильно :) Вы же запрашиваете имена значений, связанных с ключом, а не его под-ключи. Для получения под-ключей есть метод GetSubKeyNames().
ПС. Для работы с реестром из командной строки есть утиллита reg.

32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Цитата: hardcase
Правильно :) Вы же запрашиваете имена значений, связанных с ключом, а не его под-ключи. Для получения под-ключей есть метод GetSubKeyNames().


Заменил GetValueNames() на GetSubKeyNames(), результат тот же...

Цитата: hardcase
ПС. Для работы с реестром из командной строки есть утиллита reg.


Из строки не интересно, хотелось бы напрямую из программы. Может попробовать WMI? Может кто-нибудь подсказать как работать с классом StdRegProv? Желательно на примере, я с WMI раньше не работал...

И ещё вопрос по WMI. Класс Win32_SoftwareFeature
Написал вот так:

 
Код:
ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_SoftwareFeature");
            foreach (ManagementObject mo in mos.Get())
            {
                comboBox1.Items.Add(mo.Qualifiers["Name"]);
            }

Результата нет. Хочу получить список имен программ, установленных через Windows Installer, что не так делаю?
5
10 февраля 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: LawManiak
Заменил GetValueNames() на GetSubKeyNames(), результат тот же...

Вы упорно не показываете код и не говорите разрядности системы и разрядности программы.

32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Цитата: hardcase
Вы упорно не показываете код и не говорите разрядности системы и разрядности программы.


Код:
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic.Devices;
using Microsoft.Win32;
using System.Management;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] x = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall").GetSubKeyNames();
            for (int i = 0; i < x.Length-1; i++ )
                textBox1.Text += x + Environment.NewLine;
        }
    }
}

Вот весь код. сомневаюсь что что-то от этого изменилось. Я экспериментирую, определяю что я смогу сделать что бы написать в ТЗ будущий функционал.

Windows 7 x 64. Visual Studio 2010 C#
5
10 февраля 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: LawManiak
Windows 7 x 64. Visual Studio 2010 C#


Какая разрядность процесса?
Разрядность процесса должна быть x64, либо вы должны открывать 64-битную версию реестра.

З.Ы. Ключи реестра являются IDisposable объектами, так как инкапсулируют виндовые хэндлы.

32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Цитата: hardcase
Какая разрядность процесса?


Процесс х32

Цитата: hardcase

Разрядность процесса должна быть x64, либо вы должны открывать 64-битную версию реестра.
З.Ы. Ключи реестра являются IDisposable объектами, так как инкапсулируют виндовые хэндлы.


Есть какие-нибудь примеры по этому поводу? Я впервые сталкиваюсь с необходимостью работать с реестром через свое приложение....


По поводу Win32_SoftwareFeature может кто-нибудь ответить? Сейчас меня этот вопрос больше интересует...

5
10 февраля 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: LawManiak

Есть какие-нибудь примеры по этому поводу? Я впервые сталкиваюсь с необходимостью работать с реестром через свое приложение....


OpenBaseKey вам в помощь. Этот метод позволяет открыть 64-битную версию реестра в x86 процессе и наоборот.

32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Цитата: hardcase
OpenBaseKey вам в помощь. Этот метод позволяет открыть 64-битную версию реестра в x86 процессе и наоборот.



Так... Что-то я не вкуриваю как мне этим пользоваться...
Допустим есть у меня класс:

Код:
private string Getinstalledsoftware()
        {
            string Software = null;
            string SoftwareKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(SoftwareKey))
            {
                foreach (string skName in rk.GetSubKeyNames())
                {
                    using (RegistryKey sk = rk.OpenSubKey(skName))
                    {
                        try
                        {
                            if (!(sk.GetValue("DisplayName") == null))
                            {
                                if (sk.GetValue("InstallLocation") == null)
                                    Software += sk.GetValue("DisplayName") + " - Install path not known\n";
                                else
                                    Software += sk.GetValue("DisplayName") + " - " + sk.GetValue("InstallLocation") + "\n";
                            }
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
            }

            return Software;
        }


Как мне нужно его изменить для работы с реестром х64 из х32 приложения?
5
10 февраля 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: LawManiak
Как мне нужно его изменить для работы с реестром х64 из х32 приложения?


Код:
using System;
using Microsoft.Win32;

class Program
{
    static void Main(string[] args)
    {
        using (var hklmKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
        using (var uninstallKey = hklmKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
        {
            foreach (var subKeyName in uninstallKey.GetSubKeyNames())
            {
                using (var programKey = uninstallKey.OpenSubKey(subKeyName))
                {
                    Console.WriteLine(programKey.GetValue("DisplayName"));
                }
            }
        }
    }
}


ПС. На 32-битных системах будет использоваться 32-битный реестр.
ППС. Подозреваю что для просмотра требуются права администратора.
32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Спасибо, все получилось.
Более того, Гость тоже смог считать.

Получается что под 32-битные системы не нужно будет писать отдельную функцию?
32K
10 февраля 2012 года
LawManiak
76 / / 24.10.2011
Разобрался с WMI Code Creator'ом
Оказалась очень удобная штука если знать что смотреть.

Возник ещё вопрос. Мне нужно будет организовать клиент-серверную архитектуру, подскажите каким протоколом по обмену данными лучше (а главное проще) пользоваться в сети LAN зная ip естественно, что бы я с ним смог быстро разобраться...
32K
11 февраля 2012 года
LawManiak
76 / / 24.10.2011
Помогите разобраться с WCF.
Если не сложно скиньте пример использования WCF что бы и клиентская и серверная часть управлялись через Windows Forms.
Да хоть приложение типа: клиент ввел в текстбокс фразу - нажал отправить, сервер получил, так же вывел в текстбокс.
Пожалуйста, очень нужно разобраться.

Выпускую работу по сути нужно закончить в течении 3х месяцев....
32K
11 февраля 2012 года
LawManiak
76 / / 24.10.2011
Отложил пока идею с WCF, хотелось бы конечно сразу разрабатывать с использованием современных технологий, но без помощи увы не получается разобраться...
Так что пока буду сокеты пробовать...

Хорошо, создам.
5
12 февраля 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: LawManiak
Помогите разобраться с WCF.
Если не сложно скиньте пример использования WCF что бы и клиентская и серверная часть управлялись через Windows Forms.


Создавайте на каждый вопрос отдельный топик.

Для self-hosting WCF в целом без разницы где он хостится в Windows Service, в консольном или оконном приложении.
Примеров по WCF в сети тьма, книг тоже уйма.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог