Работа с реестром
что бы потом из каждого вытянуть по возможности имя программы.
пробую методами 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(), но нужно больше информации...
Что именно не получается? Покажите ваш код. Не заставляйте думать, что вы лентяй, желающий халявы.
Нет.
Обширнейшую информацию можно получить с помощью технологии WMI.
Некоторые примеры: http://msdn.microsoft.com/en-us/library/aa394587%28v=vs.85%29.aspx
Для облегчения работы скачайте утилиту WMI Code Creator с сайта Microsoft - она бесплатна (гуглится на раз). Эта утилита сгенерирует необходимый код, сведя ручную работу к минимуму.
for (int i = 0; i < x.Length-1; i++ )
textBox1.Text += x + Environment.NewLine;
В ответ увы пустота.
Про способ проще я имел ввиду, может есть способ без получения этого списка пройтись по подразделам считывая ключи "DisplayName".
В ответ увы пустота.
Правильно :) Вы же запрашиваете имена значений, связанных с ключом, а не его под-ключи. Для получения под-ключей есть метод GetSubKeyNames().
ПС. Для работы с реестром из командной строки есть утиллита reg.
Заменил GetValueNames() на GetSubKeyNames(), результат тот же...
Из строки не интересно, хотелось бы напрямую из программы. Может попробовать WMI? Может кто-нибудь подсказать как работать с классом StdRegProv? Желательно на примере, я с WMI раньше не работал...
И ещё вопрос по WMI. Класс Win32_SoftwareFeature
Написал вот так:
foreach (ManagementObject mo in mos.Get())
{
comboBox1.Items.Add(mo.Qualifiers["Name"]);
}
Результата нет. Хочу получить список имен программ, установленных через Windows Installer, что не так делаю?
Вы упорно не показываете код и не говорите разрядности системы и разрядности программы.
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#
Какая разрядность процесса?
Разрядность процесса должна быть x64, либо вы должны открывать 64-битную версию реестра.
З.Ы. Ключи реестра являются IDisposable объектами, так как инкапсулируют виндовые хэндлы.
Процесс х32
Разрядность процесса должна быть x64, либо вы должны открывать 64-битную версию реестра.
З.Ы. Ключи реестра являются IDisposable объектами, так как инкапсулируют виндовые хэндлы.
Есть какие-нибудь примеры по этому поводу? Я впервые сталкиваюсь с необходимостью работать с реестром через свое приложение....
По поводу Win32_SoftwareFeature может кто-нибудь ответить? Сейчас меня этот вопрос больше интересует...
Есть какие-нибудь примеры по этому поводу? Я впервые сталкиваюсь с необходимостью работать с реестром через свое приложение....
OpenBaseKey вам в помощь. Этот метод позволяет открыть 64-битную версию реестра в x86 процессе и наоборот.
Так... Что-то я не вкуриваю как мне этим пользоваться...
Допустим есть у меня класс:
{
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 приложения?
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-битный реестр.
ППС. Подозреваю что для просмотра требуются права администратора.
Более того, Гость тоже смог считать.
Получается что под 32-битные системы не нужно будет писать отдельную функцию?
Оказалась очень удобная штука если знать что смотреть.
Возник ещё вопрос. Мне нужно будет организовать клиент-серверную архитектуру, подскажите каким протоколом по обмену данными лучше (а главное проще) пользоваться в сети LAN зная ip естественно, что бы я с ним смог быстро разобраться...
Если не сложно скиньте пример использования WCF что бы и клиентская и серверная часть управлялись через Windows Forms.
Да хоть приложение типа: клиент ввел в текстбокс фразу - нажал отправить, сервер получил, так же вывел в текстбокс.
Пожалуйста, очень нужно разобраться.
Выпускую работу по сути нужно закончить в течении 3х месяцев....
Так что пока буду сокеты пробовать...
Хорошо, создам.
Если не сложно скиньте пример использования WCF что бы и клиентская и серверная часть управлялись через Windows Forms.
Создавайте на каждый вопрос отдельный топик.
Для self-hosting WCF в целом без разницы где он хостится в Windows Service, в консольном или оконном приложении.
Примеров по WCF в сети тьма, книг тоже уйма.