Может ли выбранный элемент из ComboBox предоставить строку из раздела реестра для использования в качестве переменной? - PullRequest
1 голос
/ 03 сентября 2011

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

Вот сценарий: при подключении к реестру удаленных компьютеров вы получаете только HKEY_LOCAL_MACHINE & HKEY_USERS.Теперь HKEY_USERS имеет ряд вложенных ключей, относящихся к реестру профилей пользователей, хранящемуся на машине, но отображает его только по номерам вместо реестра Джо или реестра Джона, надеюсь, вы понимаете, куда я иду с этим.Таким образом, использование приведенного ниже кода дает имя с именем профиля пользователя, которое находится в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList, а дополнительный ключ, в котором он хранится (различается по номерам), является тем же вложенным ключом в HKEY_USERS ...bingo.

Обратите внимание: эта строка кода if (!(sk.GetValue("Guid") == null)), т. е. «Guid» присутствует только в доменной среде в рамках подключа «Список профилей» и имеет значение «Guid».Поскольку в списке присутствуют различные дополнительные ключи, мне нужны только те, которые являются профилем пользователя.На моей домашней машине я добавляю дополнительный ключ, чтобы код работал.

using System;
using System.Windows.Forms;
using Microsoft.Win32;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //http://www.dreamincode.net/code/snippet1995.htm

            //The registry key:
            string SoftwareKey = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList";
            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(SoftwareKey))
            {
                foreach (string skName in rk.GetSubKeyNames())
                {
                    using (RegistryKey sk = rk.OpenSubKey(skName))
                    {
                        try
                        {
                            if (!(sk.GetValue("Guid") == null))
                            {
                                string UserProfile;
                                string UserProfileComboBox;
                                string Software = null;
                                UserProfile = Software += sk.GetValue("ProfileImagePath"); 
                                UserProfileComboBox = UserProfile.Substring(9); //this reduces C:\Users\Home to Home. (0, 8) would have provide C:\Users
                                comboBox1.Items.Add(UserProfileComboBox);

                                //This messagebox displays the sub key I need when the userprofile is selected from the checkbox
                                MessageBox.Show(UserProfile + "    " + skName);
                             }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);  
                        }
                    }
                }
            }
        }
    }
}

В приведенном выше коде я использовал: UserProfile.Substring(9), чтобы уменьшить C: \ Users \ Home до просто Home, который отключен визображение ниже:

enter image description here

Я также добавил следующую строку кода для отображения результатов в окне сообщения для вашего понимания: MessageBox.Show(UserProfile + " " + skName);

Я хотел бы иметь возможность ... когда я выбираю профиль пользователя в поле со списком, чтобы код знал, к какому подразделу HKEY_USER он относится, например.S-1-5-21-340336367-1635450098-906894100-1008 (hkeyuserprofile), поэтому я могу изменить ключ реестра позже:

ИЗМЕНЕНИЕ:

using (RegistryKey test = registry.Users.OpenSubKey(@"Software\Policies\Microsoft\..."))

Кому:

string hkeyuserprofile;

using (RegistryKey test = registry.Users.OpenSubKey(hkeyuserprofile + @"\Software\Policies\Microsoft\...")

Любая помощь будет очень признателен!;)

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Вы можете сделать это несколькими способами.Я покажу вам два, но первое предпочтительнее второго. (я понял после написания этого, второй способ не применим, поэтому я воздержался от его добавления)

Привязка данных

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

Прежде всего, вам нужен объект, представляющий нужную вам информацию:

public class RegKeyInfo
{
    public String SubKeyPath { get; set; }
    public String Name { get; set; }
} 

Итак, теперь у вас есть тип, в котором будут храниться как желаемое производное имя, так и SubKeyPath для последующего использования.

Теперь нам нужно сообщить комбинированному списку, как он должен обрабатывать объект такого типа.Мы можем установить это в конструкторе форм.Обычно вы можете сделать это через дизайнера, но вам проще показать это здесь.

public Form1()
{
    InitializeComponent();

    comboBox1.ValueMember = "SubKeyPath";
    comboBox1.DisplayMember = "Name";
}

Теперь вы сказали ComboBox, что когда вы даете ему Object,он должен искать свойство с именем "Name" и использовать его для отображения, а также использовать свойство "SubKeyPath" для Value.

вместодобавляя элементы вручную к ComboBox, мы собираемся создать коллекцию нашего типа RegKeyInfo и "привязать" ее к ComboBox.

private void Form1_Load(object sender, EventArgs e)
{
    //http://www.dreamincode.net/code/snippet1995.htm
    //Declare the string to hold the list:

    var keys = new List<RegKey>();

    //Snip...

    UserProfileComboBox = UserProfile.Substring(9);

    keys.Add(new RegKey {
        Name = UserProfileComboBox,
        KeyPath = skName
    });

    //Snip... 

    comboBox1.DataSource = keys;
}

. Большое различие заключается в использованиисвойства DataSource, которое указывает ComboBox использовать привязку данных на основе предоставленной вами информации.

Когда кто-то выбирает значение из ComboBox,вы можете получить доступ к свойству SelectedValue и получить SubKeyPath, к которому оно привязано.Попробуйте добавить этот обработчик события в событие SelectedValueChanged, чтобы увидеть, о чем я говорю:

void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    MessageBox.Show(comboBox1.SelectedValue as String);
}
0 голосов
/ 07 сентября 2011
//Updated code.

using System;
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.Win32;

namespace RegistryUSER
{


    public partial class Form1 : Form
    {
        public class RegKeyInfo
        {
            public String SubKeyPath { get; set; }
            public String Name { get; set; }
        }

        public Form1()
        {
            InitializeComponent();
            comboBox1.ValueMember = "SubKeyPath";
            comboBox1.DisplayMember = "Name";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var keys = new List<RegKeyInfo>();

            using (RegistryKey ProfileKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"))
            {
                foreach (string skName in ProfileKey.GetSubKeyNames())
                {
                    using (RegistryKey sk = ProfileKey.OpenSubKey(skName))
                    {
                        try
                        {
                            if (!(sk.GetValue("Guid") == null))
                            {
                                string UserProfile;
                                string UserProfileKey;
                                string ProfileValue = null;
                                string ProfileKeyName = null;
                                UserProfile = ProfileValue += sk.GetValue("ProfileImagePath");
                                UserProfileKey = ProfileKeyName += skName;

                                RegKeyInfo UserInformation = new RegKeyInfo();
                                UserInformation.Name = UserProfile;
                                UserInformation.SubKeyPath = UserProfileKey;

                                UserProfile = UserProfile.Substring(9); //this reduces C:\Users\Home to Home. (0, 8) would have provide C:\Users

                                keys.Add(new RegKeyInfo
                                {
                                    Name = UserProfile,
                                    SubKeyPath = UserProfileKey
                                });
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
                }
                comboBox1.DataSource = keys;
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string result = comboBox1.SelectedValue as string;
                using (RegistryKey Key = Registry.Users.OpenSubKey(result + @"\Software\Microsoft\Office\14.0\Outlook\OST"))

                    if (Key != null)
                    {
                        int Value = System.Convert.ToInt32(Key.GetValue("NoOST"));
                        if (Value == 3)
                        {
                            MessageBox.Show("yes");
                        }
                        else
                        {
                            MessageBox.Show("no");
                        }
                    }
                    else
                    {
                       MessageBox.Show("not present");
                    }

            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...