Запись в реестр в приложении C # - PullRequest
39 голосов
/ 29 августа 2011

Я пытаюсь записать в реестр, используя мое приложение на C #.

Я использую ответ, приведенный здесь: Запись значений в реестр с помощью C #

Однако по какой-то причине ключ не добавляется в реестр.

Я использую следующий код:

string Timestamp = DateTime.Now.ToString("dd-MM-yyyy");

string key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\"+Application.ProductName+"\\"+Application.ProductVersion;
string valueName = "Trial Period";

Microsoft.Win32.Registry.SetValue(key, valueName, Timestamp, Microsoft.Win32.RegistryValueKind.String);

Application.name и Application.version 'папки' donеще не существует.

Нужно ли мне сначала их создавать?

Кроме того, я тестирую его на 64-битной версии Win, поэтому я думаю, что если я хочу проверить реестр на наличие ключадобавил, что я должен специально проверить 32-битный реестр в: C: \ Windows \ SysWOW64 \ regedit.exe не так ли?

Ответы [ 6 ]

61 голосов
/ 29 августа 2011

Прежде всего, если вы хотите редактировать ключ в LocalMachine, вы должны запустить свое приложение с правами администратора (лучше использовать CurrentUser, это безопаснее или создать ключ в установщике). Вы также должны открыть ключ в режиме редактирования (метод OpenSubKey), чтобы добавить новые подразделы. Я проверил код, и он работает. Вот код

RegistryKey key = Registry.LocalMachine.OpenSubKey("Software",true);

key.CreateSubKey("AppName");
key = key.OpenSubKey("AppName", true);


key.CreateSubKey("AppVersion");
key = key.OpenSubKey("AppVersion", true);

key.SetValue("yourkey", "yourvalue");
6 голосов
/ 29 августа 2011

Также проверьте, виртуализируются ли ваши вызовы в реестре.См. здесь для получения дополнительной информации.

Это может произойти, если ваше приложение не UAC знает и происходит по причинам совместимости.

3 голосов
/ 12 июля 2013

Вы можете использовать следующий код для создания и открытия необходимых ключей реестра.

RegistryKey SoftwareKey   = Registry.LocalMachine.OpenSubKey("Software",true);

RegistryKey AppNameKey    = SoftwareKey.CreateSubKey("AppName");
RegistryKey AppVersionKey = AppNameKey.CreateSubKey("AppVersion");

AppVersionKey.SetValue("yourkey", "yourvalue");

Вы можете в основном использовать CreateSubKey для всех настроек приложения, так как он откроет ключ для доступа для записи, если он уже существует, и создаст его в противном случае. Нет необходимости сначала создавать, а потом открывать. OpenSubKey пригодится, когда вы абсолютно уверены, что ключ уже существует, как в этом случае, с "HKEY_LOCAL_MACHINE \ SOFTWARE \"

2 голосов
/ 29 августа 2011

Попробуйте сначала открыть HKLM\Software. Затем создайте ключ для вашей программы, а затем создайте ключ для версии. Однако ваш ключ может быть размещен по адресу HKLM \ software \ WOW6432Node. Проверьте это.

1 голос
/ 06 декабря 2016

Проблема в том, что у вас недостаточно прав. Вот способ, который работает для меня:

RegistryKey myKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
myKey = myKey.OpenSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);

if (myKey != null)
{
    myKey.SetValue("DefaultPrinterId", ldiPrinters[e.RowIndex].id, RegistryValueKind.String);
    myKey.Close();
}

С RegistryKey.OpenBaseKey вы открываете правильный реестр, потому что, если у вас нет разрешений для реестра, который вы пишете, он делает это в другом месте.

0 голосов
/ 17 сентября 2015

Спасибо всем за их вклад и помощь

Ниже приводится окончательное рабочее решение, которое я придумал. Он интегрируется с другими подобными коллекциями. Сначала я использовал список, но мне нужна была строка в качестве ключа для других коллекций

// ************************** Ordered Dictionary - works ****************
// /1613388/sohranyayschie-poryadok-struktury-dannyh-v-c
// http://www.go4expert.com/articles/understanding-c-sharp-dictionaries-t30034/

public OrderedDictionary m_oCol;
public OrderedDictionary m_oColReverse;

public clsFeatureCollection()
    : base()
{
    m_oCol = new OrderedDictionary();
    m_oColReverse = new OrderedDictionary();
}

public IEnumerator GetEnumerator()
{
    return m_oCol.GetEnumerator();
}

public void Add(IFeature pFeature, string strBefore = "", string strAfter = "", bool bReverse = false)
{
    if (bReverse == true)
    {
        m_oColReverse.Add(pFeature.OID.ToString().Trim(), pFeature.OID.ToString().Trim());
    }

    if (!ContainsItem(pFeature.OID.ToString()))
    {
        m_oCol.Add(pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
    }
}

public void AddBefore(IFeature pFeature, string strBefore, bool bReverse = false)
{
    if (bReverse == true)
    {
        m_oColReverse.Add(pFeature.OID.ToString().Trim(), pFeature.OID.ToString().Trim());
    }

    if (!ContainsItem(pFeature.OID.ToString()))
    {
        if (strBefore != null)
        {
            int index = GetIndex(m_oCol, strBefore);

            if (index > 0)
            {
                m_oCol.Insert(index - 1, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));

            }
            else
            {
                m_oCol.Insert(0, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
            }
        }
    }
}

public void AddAfter(IFeature pFeature, string strAfter, bool bReverse = false)
{
    if (bReverse == true)
    {
        m_oColReverse.Add(pFeature.OID.ToString().Trim(), pFeature.OID.ToString().Trim());
    }

    if (!ContainsItem(pFeature.OID.ToString()))
    {
        if (!string.IsNullOrEmpty(strAfter))
        {
            int index = GetIndex(m_oCol, strAfter);

            m_oCol.Insert(index + 1, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
        }
        else
        {
            m_oCol.Insert(0, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
        }
    }
}

public int Count
{
    get { return m_oCol.Count; }
}

public void Remove(int Id)
{
    m_oCol.RemoveAt(Id);
}

public clsFeature Item(int Position)
{
    try
    {
        clsFeature value = (clsFeature)m_oCol.Cast<DictionaryEntry>().ElementAt(Position).Value;

        return value;
    }
    catch (Exception)
    {
        throw;
    }
}

public void Clear()
{
    m_oCol = new OrderedDictionary();
    m_oColReverse = new OrderedDictionary();
}

public bool Reverse(string valueRenamed)
{
    bool bReverse = false;

    try
    {
        if (m_oColReverse.Contains(valueRenamed))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    catch (Exception ex)
    {
        if (ex is ArgumentException | ex is IndexOutOfRangeException)
        {
            bReverse = false;
        }
    }

    return bReverse;
}

public bool ContainsItem(string oidValue)
{
    bool bContainsItem = false;

    string intOID = oidValue.ToString();

    try
    {
        // dictionary
        if (m_oCol.Contains(intOID))
        {
            bContainsItem = true;
        }
        else
        {
            bContainsItem = false;
        }

        return bContainsItem;
    }

    catch (Exception ex)
    {
        if (ex is ArgumentException | ex is IndexOutOfRangeException)
        {
            bContainsItem = false;
        }
    }

    return bContainsItem;
}

public static int GetIndex(OrderedDictionary dictionary, string key)
{
    for (int index = 0; index < dictionary.Count; index++)
    {
        if (dictionary[index] == dictionary[key])
        {
            return index;
        }
    }

    return -1;
}

// ******************************  End Ordered Dictionary - works ************************
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...