Запись в реестр приложения С#
Я пытаюсь писать в реестр, используя свое приложение С#.
Я использую приведенный здесь ответ: Запись значений в реестр с помощью С#
Однако по какой-либо причине ключ не добавляется в реестр.
Я использую следующий код:
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?
Ответы
Ответ 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 ************************