Подтвердить что ты не робот

Запись в реестр приложения С#

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

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

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

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

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 'еще не существуют.

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

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

4b9b3361

Ответ 1

Прежде всего, если вы хотите отредактировать ключ в 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");

Ответ 2

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

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

Real path
HKEY_LOCAL_MACHINE\Software\FooKey

Virtual path
HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\FooKey

Ответ 3

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

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"

Ответ 4

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

Ответ 5

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

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 вы открываете правильный реестр, потому что, когда у вас нет прав на реестр, который вы пишете, он работает в другом месте.

Ответ 6

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

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

// ************************** Ordered Dictionary - works ****************
// http://stackoverflow.com/info/2722767/c-sharp-order-preserving-data-structures
// 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 ************************