2012-06-07 25 views
9

मैं इस तरह रजिस्ट्री करने के लिए एक रजिस्ट्री उपकुंजी और उसके संबंधित मान लिखने का प्रयास किया:रजिस्ट्री को अपेक्षाकृत अलग स्थान पर क्यों लिखा जाता है?

const string subKey = @"SOFTWARE\Apple\Banana\"; 
const string regKey = "pip"; 

var rk = Registry.LocalMachine.OpenSubKey(subKey); 
if (rk == null) 
    rk = Registry.LocalMachine.CreateSubKey(subKey); 

var rv = rk.GetValue(regKey); 
if (rv == null) 
    rk.SetValue(regKey, "XXX"); 

return rv.ToString(); 

अब समस्या यह है कि मैं जब मैं स्थान में मैन्युअल रूप से देखने के लिए (regedit के माध्यम से) मैं HKLM में फ़ोल्डर SOFTWARE\Apple\Banana नहीं देख सकता है ।

लेकिन जब मैं उपर्युक्त कोड को फिर से चलाता हूं और डीबग करता हूं, तो मैं देख सकता हूं कि Registry.LocalMachine.OpenSubKey(subKey) और rk.GetValue(regKey) पहले सहेजे गए मान उत्पन्न करता है। फिर भी मुझे regedit के माध्यम से दिए गए स्थान में मूल्य नहीं दिखता है। तो रजिस्ट्री खोज पर, मैं निम्न स्थानों में ऊपर कुंजी और मूल्यों देख सकते हैं:

  1. HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

  2. HKEY_USERS\S-1-5-21-44266131-1313801407-2392705078-1000\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

जो दोनों मान बिल्कुल रहने के रूप में मैं बचाया के तहत। तो मुझे लगता है इस जहाँ मेरे एप्लिकेशन मूल्य हालांकि मेरे कोड में मैं HKLM\SOFTWARE\Apple\Banana\ से इसे कहते पढ़ता से है ..

  1. हो रहा क्यों है? क्या यह एक्सेस अधिकार मुद्दे से संबंधित है?

  2. क्या यह अपेक्षित व्यवहार है? इस अर्थ में, यह मूल्य मेरे लिए बहुत महत्वपूर्ण है, इसलिए मैं केवल यह जान रहा हूं कि ऑटो-रिलायंस से जुड़े कुछ जोखिम हैं या नहीं!

  3. वहाँ बहुत रजिस्ट्री करने के लिए है कि यह अपने सटीक स्थान में रहता है लेखन का एक उचित तरीका है ..

मेरा खाता व्यवस्थापक से एक है, और मैं 32 बिट विंडोज़ 7

उपयोग कर रहा हूँ संपादित करें: जैसा कि मुझे पता चला, रजिस्ट्री प्रविष्टि HKLM की बजाय मौजूदा उपयोगकर्ताओं के स्थान पर संग्रहीत है। और जब मैं एक अलग खाते से reg मूल्य के लिए पूछता हूं, तो मुझे मूल्य नहीं मिलता है। संक्षेप में, सभी HKLM में सहेजकर :(

+0

अपनी टिप्पणी का उत्तर दें "लेकिन क्या इसका मतलब यह नहीं है कि भविष्य में उपयोगकर्ता एचकेएलएम में उसी स्थान पर पूछताछ कर रहे हैं जो वर्तमान उपयोगकर्ता स्थान में मौजूद मूल्य प्राप्त नहीं कर सकता है? ठीक है, मैं इसे किसी भी तरह से परीक्षण करने जा रहा हूं" - हाँ यह करता है। रजिस्ट्री और प्रोग्राम फ़ाइलों और प्रोग्रामडेटा निर्देशिका में एचएलएम केवल सेटअप के दौरान लिखा जाना चाहिए। केवल प्रशासक ही अन्यथा लिख ​​सकते हैं (और केवल यूएसी सक्षम होने पर ऊंचाई के साथ)। –

+0

@DannyVarod मुझे आपकी पहली वाक्य नहीं मिली। वैसे भी जब मैंने परीक्षण किया, तो मुझे यह जानने में आया कि वर्चुअलाइजेशन मदद नहीं करता है यदि आप सभी उपयोगकर्ताओं के लिए एक ही रजिस्ट्री मान प्राप्त करना चाहते हैं .. – nawfal

+0

विंडोज 6+ में विभिन्न स्थान हैं जो केवल सेटअप डेटा को पकड़ने के लिए हैं और ऐसे अन्य स्थान भी हैं रनटाइम डेटा या डेटा को पकड़ने के लिए जो रन टाइम के दौरान बदलता है। सेटअप के दौरान, उपयोगकर्ताओं को सेटअप स्थानों (यूएसी के माध्यम से व्यवस्थापक द्वारा) लिखने की अनुमति दी जाती है। रनटाइम विंडोज़ के दौरान इन स्थानों तक पहुंच को रोकता है जब तक उपयोगकर्ता व्यवस्थापक नहीं होता है। (गैर प्रशासकों को अन्य उपयोगकर्ताओं को प्रभावित नहीं करना चाहिए।) –

उत्तर

5

हाँ यह सही व्यवहार है और ऐसा इसलिए हो रहा है क्योंकि आपके पास एचकेएलएम हाइव पर सीधे लिखने के लिए अपर्याप्त विशेषाधिकार हैं। इसे वर्चुअलाइजेशन कहा जाता है और फाइल सिस्टम के लिए भी होता है, यह Vista के बाद ओएस में एक व्यवहार रहा है।

आपको जारी रखना चाहिए और उसी एचकेएलएम कुंजी से पढ़ने का प्रयास करना चाहिए, विंडोज आपके लिए पारदर्शी रूप से रीडायरेक्ट करेगा।

प्रीट में kindly provided एक एमएसडीएन लिंक है जिसे आपको अच्छी तरह से पढ़ना चाहिए।

नोट जब आप एक कुंजी HKLM के तहत आप भी इच्छित अनुमति शामिल होना चाहिए, भले ही आप व्यवस्थापक के रूप में चल रहे हैं का उपयोग (क्योंकि कुंजी स्वचालित रूप से व्यवस्थापक अधिकार के साथ खुला नहीं है, आप इसे अनुरोध करने के लिए है) कि:

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl); 
+0

देखें लेकिन इसका मतलब यह नहीं है कि भविष्य में उपयोगकर्ता पूछताछ कर रहा है hklm में वही स्थान वर्तमान उपयोगकर्ता स्थान में मौजूद मान प्राप्त नहीं करेगा? ठीक है, मैं इसे किसी भी तरह से परीक्षण करने जा रहा हूं .. – nawfal

+0

अतिरिक्त टिप – nawfal

+0

के लिए धन्यवाद मुझे एक ही समस्या है, लेकिन मैं रजिस्ट्री में सक्रियण कुंजी सहेजने की कोशिश कर रहा हूं। मैं चाहता हूं कि सभी उपयोगकर्ताओं के लिए कुंजी समान हो, क्या यह वर्चुअलाइजेशन गड़बड़ करेगा? – Alan

4
  1. This is Registry Virtualization (msdn)

    रजिस्ट्री वर्चुअलाइजेशन के पहले का कोई मतलब नहीं में एक आवेदन संगतता प्रौद्योगिकी कि रजिस्ट्री लिखने के संचालन वैश्विक प्रभाव पुनः निर्देशित होना है कि सक्षम बनाता है प्रति उपयोगकर्ता स्थान पर। यह पुनर्निर्देशन से पारदर्शी है जो रजिस्ट्री से पढ़ रहा है या लिख ​​रहा है। यह Windows Vista के साथ समर्थित है।

    वर्चुअलाइजेशन अवलोकन

    Windows Vista करने से पहले, अनुप्रयोगों आम तौर पर प्रशासकों द्वारा चलाए जा रहे थे। नतीजतन, अनुप्रयोग स्वतंत्र रूप से सिस्टम फ़ाइलों और रजिस्ट्री कुंजी का उपयोग कर सकते थे। यदि इन अनुप्रयोगों मानक उपयोगकर्ता द्वारा चलाए गए थे, तो वे अपर्याप्त पहुंच अधिकारों के कारण विफल हो जाएंगे।Windows Vista और Windows के बाद के संस्करण इन अनुप्रयोगों के लिए स्वचालित रूप से इन अनुप्रयोगों को पुनर्निर्देशित करने के लिए अनुप्रयोग संगतता में सुधार करते हैं। उदाहरण के लिए, वैश्विक स्टोर (HKEY_LOCAL_MACHINE \ Software) पर रजिस्ट्री ऑपरेशंस को उपयोगकर्ता की प्रोफ़ाइल के भीतर प्रति उपयोगकर्ता स्थान पर रीडायरेक्ट किया गया है, जिसे वर्चुअल स्टोर (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software) के नाम से जाना जाता है।

  2. हां यह बिल्कुल वैसा ही होना चाहिए।

  3. या तो वर्चुअलाइजेशन के साथ रहते हैं यदि आप विश्व स्तर पर प्रभावशाली स्थान पर लिखना चाहते हैं, या यदि आप इसे नहीं चाहते हैं तो अधिक स्थानीयकृत स्थानों का उपयोग करें। किसी भी तरह से यह पाठक के लिए अदृश्य है, तो इसके बारे में चिंता मत करो।

+0

+1, आपने एक लिंक शामिल किया है :) – slugster

+0

@slugster - मुझे लगता है कि उद्धृत पाठ या अन्य लोगों के नमूनों/ब्लॉगों के लिंक रखना महत्वपूर्ण है। –

+0

लेकिन इसका मतलब यह नहीं है कि भविष्य में उपयोगकर्ता एचकेएलएम में एक ही स्थान पर पूछताछ कर रहे हैं जो वर्तमान उपयोगकर्ता स्थान में मौजूद मान प्राप्त नहीं करेगा? ठीक है, मैं इसे किसी भी तरह से परीक्षण करने जा रहा हूं .. – nawfal