2011-08-29 11 views
36

मैं अपने सी # ऐप का उपयोग कर रजिस्ट्री को लिखने की कोशिश कर रहा हूं। Writing values to the registry with 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 'फ़ोल्डर' अभी तक मौजूद नहीं है।

क्या मुझे उन्हें पहले बनाना है?

इसके अलावा, मैं इसे 64 बी विन संस्करण पर परीक्षण कर रहा हूं, इसलिए मुझे लगता है कि अगर मैं कुंजी के लिए रजिस्ट्री की जांच करना चाहता हूं तो मुझे विशेष रूप से 32 बिट रजिस्ट्री की जांच करनी होगी: सी: \ विंडोज \ SysWOW64 \ regedit.exe क्या मैं नहीं

+2

यूएसी आपकी योजनाओं को बर्बाद करने जा रहा है, आप ऊंचाई के बिना एचकेएलएम को नहीं लिख सकते हैं। जब तक आप एक इंस्टॉलर नहीं लिखते हैं जो कुंजी की पहुंच को बदलता है।लाइसेंस प्रवर्तन कोड वह प्रकार है जो आप खरीदते हैं। एक पैसा बनाने में एक पैसा लगता है। –

+0

आपको बॉक्सडैप का उपयोग करना चाहिए। यह आपकी मदद करनी चाहिए। –

उत्तर

57

सबसे पहले आप 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

उपयोगकर्ता फ़ोल्डर - Microsoft.Win32.Registry.CurrentUser - स्थानीय कंप्यूटर के बजाय - Microsoft.Win32.Registry.LocalMachine के बजाय डेटा लिखना अधिक सुरक्षित है। http://msdn.microsoft.com/en-us/library/h5e7chcf.aspx –

+0

मैंने मूल रूप से कुछ करने की कोशिश की, लेकिन 'उपयोग विधि' का उपयोग कर। इससे कुंजी खराब होने पर कुछ अजीब मुद्दों का कारण बन गया, इसलिए मैंने इसके बजाय कोशिश की, बिना शून्य-अपवादों के कारण कोई समस्या ट्रिगर नहीं हुई। शुभ दिन! ^^ –

1

पहले HKLM\Software खोलने का प्रयास करें। फिर अपने प्रोग्राम के लिए कुंजी बनाएं, और फिर संस्करण के लिए कुंजी बनाएं। हाउवर, आपकी कुंजी HKLM \ Software \ WOW6432Node पर रखी जा सकती है। इसे देखो।

6

यह भी जांचें कि क्या आपकी रजिस्ट्री कॉल वर्चुअलाइज्ड हो रही है। अधिक जानकारी के लिए here देखें।

यदि आपका आवेदन UAC aware नहीं है और संगतता कारणों के लिए होता है तो ऐसा हो सकता है। सब से

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 \" उनके इनपुट के लिए

-3

सभी को धन्यवाद और मदद

नीचे अंतिम काम कर समाधान मैं आया है साथ में। यह अन्य समान संग्रहों के साथ एकीकृत करता है। मैंने शुरुआत में एक सूची का उपयोग किया लेकिन मुझे अन्य संग्रहों के लिए एक स्ट्रिंग की आवश्यकता थी

// ************************** Ordered Dictionary - works **************** 
// http://stackoverflow.com/questions/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 ************************ 
+7

यह इस प्रश्न का उत्तर कैसे है ?? –

1

समस्या यह है कि आपके पास पर्याप्त विशेषाधिकार नहीं हैं।

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 के साथ आप सही रजिस्ट्री खोलते हैं, तो आपको अनुमति रजिस्ट्री आपके द्वारा लिखी जाने की जरूरत नहीं है जब क्योंकि, यह किसी अन्य स्थान में करता है: यहाँ एक तरीका है कि मेरे लिए काम करता है है।

संबंधित मुद्दे