2009-06-16 22 views
20

मेरे पास सी # (v2) ऐप्स का एक सेट है और मैं Win7 (और कुछ हद तक Vista) में रजिस्ट्री वर्चुअलाइजेशन के साथ संघर्ष कर रहा हूं।रजिस्ट्री वर्चुअलाइजेशन का पता लगाना

मेरे पास एक साझा रजिस्ट्री कॉन्फ़िगरेशन क्षेत्र है जो मेरे अनुप्रयोगों को HKLM \ Software \ Company में एक्सेस करने की आवश्यकता है ... Vista से पहले, सबकुछ बस उस स्थान से लिखा गया था और आवश्यकतानुसार पढ़ा गया था।

कोड उचित रूप से उस रजिस्ट्री कुंजी को लिखने में असफलताओं का पता लगाता है और उचित रूप से वापस आ जाएगा (इसके बजाय एचकेसीयू को लिखना और उपयोगकर्ता को सूचित करना कि उनके द्वारा लागू सेटिंग्स केवल वर्तमान उपयोगकर्ता को प्रभावित करेगी)।

Vista में, रजिस्ट्री वर्चुअलाइजेशन ने यह सब तोड़ दिया क्योंकि एचकेएलएम लिखने के लिए हम जिस एक्सेस चेक का उपयोग कर रहे थे वह चुपचाप "सफल" होगा और इसके बजाय HKCR \ VirtualStore \ Machine ... को वर्चुअलाइज करेगा। इस मामले में, उपयोगकर्ता सोचता है कि उन्होंने मशीन-व्यापी कॉन्फ़िगरेशन सहेजा था, लेकिन इसके बजाय केवल वर्चुअल स्टोर को लिखा था।

अफसोस की बात है कि, HKLM reg कुंजी पर अनुमतियों को गिनने का प्रयास करने से भी स्पष्ट रूप से परिणाम मिलते हैं जो दर्शाते हैं कि उपयोगकर्ता के पास पहुंच है या नहीं।

जब हमने Vista समर्थन जोड़ा, तो हमारे द्वारा उपयोग किए जाने वाले वर्कअराउंड को HKLM को एक जांच लिखना था ... और फिर उसी मूल्य के लिए HKCR \ VirtualStore \ Machine ... में जांचें और ध्यान दें कि मूल्य वर्चुअलाइजेशन हुआ था मिला था।

Win7 ने इसे (दोबारा) तोड़ दिया है क्योंकि स्पष्ट वर्चुअल लोकेशन (एचकेसीआर) के खिलाफ प्रश्न अब एचकेएलएम स्थान से विलय किए गए परिणाम दिखाते हैं, भले ही लेखन वर्चुअलाइज्ड नहीं था।

क्या किसी के पास इस के आसपास काम करने के लिए कोई सुझाव है?

बाधाएं: - मुझे एक समाधान की आवश्यकता है जो उन्नयन की आवश्यकता के बिना काम करता है (जब मेरे पास व्यवस्थापक स्तर की अनुमति नहीं है तो मैं HKCU में प्रति उपयोगकर्ता कॉन्फ़िगरेशन पर फ़ॉलबैक कर दूंगा लेकिन मुझे इस मामले को विश्वसनीय रूप से पहचानने में सक्षम होना चाहिए) ।

    कि सी में
  • यह एक वी 2 सी # अनुप्रयोग (एक विकल्प मैं सी के लिए देखा है के साथ काम करने की जरूरत ++ कोड एक प्रकट जो .exe के लिए वर्चुअलाइजेशन को निष्क्रिय एम्बेड करने के लिए है, लेकिन मैं ऐसा करने में सक्षम नहीं किया गया है # V2 disable folder virtualization in windows देखें)।

  • इसे "इंस्टॉलर" के बिना काम करने की आवश्यकता है (यह रजिस्ट्री कुंजी पर वर्चुअलाइजेशन को अक्षम करने की क्षमता को रोकता है जिसे हमें आरईजी फ्लैग्स ... कमांड की आवश्यकता होती है)।

+0

आप boxedapp उपयोग करने के लिए कोशिश की है (भले ही, मूल पोस्टिंग की तारीख पढ़ करने के बाद, मैं बहुत यकीन है कि समस्या बहुत पहले हल किया गया है !! हूँ) ? यह मदद कर सकता है। सौभाग्य! –

+0

आपको बॉक्स किए गएapppacker या boxedapp का उपयोग करना चाहिए। एक आवेदन के लिए Itemulate सिस्टम रजिस्ट्री। – MastAvalons

उत्तर

2

आप कुंजी आधार प्रति एक पर/अक्षम वर्चुअलाइजेशन सक्षम कर सकते हैं this के अनुसार, लेकिन यह आपको बताता है कि एक कमांड लाइन उपकरण का उपयोग करने के लिए। लेकिन प्रोग्रामेटिक रूप से ऐसा करने का एक तरीका होना चाहिए।

अपने मैनिफेस्ट में अनुरोध एक्सेक्यूशन लेवल सेट करके पूरी तरह से अपने ऐप में वर्चुअलाइजेशन को बंद करना सबसे आसान हो सकता है। आप उच्चतम उपलब्धि का प्रयास कर सकते हैं, लेकिन इसका अर्थ यह हो सकता है कि आपका ऐप हमेशा प्रशासक के रूप में चलता है। ऐसा लगता है कि यह केवल इनवॉकर को वर्चुअलाइजेशन बंद कर देगा। also देखें।

+0

दुर्भाग्य से मैं कुंजी पर वर्चुअलाइजेशन अक्षम नहीं कर सकता, क्योंकि मुझे ऐसा करने के लिए ऊंचा होना होगा। मैं भी मैनिफेस्ट दृष्टिकोण का उपयोग नहीं कर सकता, क्योंकि यह केवल प्रविष्टि .exe के लिए सम्मानित है, और जब मैं किसी अन्य एप्लिकेशन में होस्ट नहीं करता हूं। (यह 2.0 सी # कंपाइलर द्वारा भी समर्थित नहीं है) –

+0

एचकेएलएम में मेरे क्षेत्र पर वर्चुअलाइजेशन को अक्षम करने के लिए आरईजी का उपयोग एक गहना है। मुझे डेटा लॉग इन में डेटा रखने और पुराने ओएस संस्करणों (एक्सपी ...) के साथ संगतता को संरक्षित रखने की आवश्यकता है, और मुझे पता है कि यह मर चुका है, लेकिन यह नहीं है!)। –

0

ध्यान दें कि HKCR एक वर्चुअलाइज्ड स्टोर है, HKLM\Software\Classes और HKCU\Software\Classes का संयोजन है।

सबसे अच्छा तरीका रजिस्ट्री वर्चुअलाइजेशन होने की अनुमति नहीं देना होगा।सबसे पहले यह देखने के लिए जांचें कि उपयोगकर्ता रनटाइम पर ऊंचा है और फिर आप उपयोगकर्ता को सूचित कर सकते हैं कि परिवर्तन केवल मौजूदा उपयोगकर्ता को ही परिवर्तन करने से पहले ही लागू किया जाएगा।

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

उदाहरण:

private bool IsAdministrator 
{ 
    get 
    { 
     WindowsIdentity wi = WindowsIdentity.GetCurrent(); 
     WindowsPrincipal wp = new WindowsPrincipal(wi); 

     return wp.IsInRole(WindowsBuiltInRole.Administrator); 
    } 
} 

नोट: मैं सी # में कोड, उदाहरण के सवाल से उठाया है नहीं है How can I detect if my process is running UAC-elevated or not?

10

यह है एक उत्कृष्ट डाल सवाल, +1 (क्यों यह समुदाय विकी है , यह अंक का हकदार है!)

सामान्य रूप से, नियमों का एक समूह (जो [जैसा कि आपने भाग लिया है] समय के साथ अलग-अलग होगा) जो नियंत्रित करता है कि यूएसी [और इस प्रकार निस्संदेह रजिस्ट्री] वर्चुअलाइजेशन खेल रहा है या नहीं।

Registry Virtualization rulesets documentation in MSDN में से कुछ मुख्य भागों हैं:

  1. [के रूप में jeffamaphone कहते हैं] अगर प्रकट एक requestedPrivileges/requestedExecutionLevel सेट है, इसे बंद कर दिया है। ऐसा लगता है कि आपने एक मैनिफेस्ट जोड़ने से इंकार कर दिया है, तो क्या आप कृपया संकेत दे सकते हैं कि यह आपके लिए क्यों काम नहीं करेगा? (आप कहते हैं "मैं सी # वी 2 में ऐसा करने में सक्षम नहीं हूं" - एप्लिकेशन मेनिफेस्ट फ़ाइल जोड़ने के लिए एक आइटम जोड़ें विकल्प है, और यह वीएस2005 में उपलब्ध है)
  2. यदि एक्सई 64 बिट चल रहा है, तो इसका बंद डिफ़ॉल्ट रूप से
  3. अगर यह एक इंटरैक्टिव प्रक्रिया (जैसे एक सेवा, या आईआईएस आदि में होस्ट के रूप में), यह बंद है

आप एक स्थिति उपरोक्त में से किसी को प्रभावित करने की है, जो में नहीं हैं नहीं है आदर्श, और आप इस प्रकार यह पता लगाना चाहते हैं कि वर्तमान संदर्भ में यूएसी वर्चुअलाइजेशन लागू होता है, this answer to a what might at first not appeat to be a related question का उपयोग करें। (जाहिर है कि आपको अभी भी यह तय करने की आवश्यकता होगी कि यह उस विशिष्ट कुंजी पर लागू होता है, जिस पर आप चल रहे हैं, जो एक चलती लक्ष्य है जिसे आप स्पष्ट रूप से कोड को कार्यान्वित नहीं करना चाहते हैं, जिसे परिवर्तनों को ट्रैक करने की आवश्यकता है यदि इसे टाला जा सके - लेकिन इसमें ज्यादातर मामलों में यह अपेक्षाकृत स्पष्ट होना चाहिए।)

0

मुझे एक ही समस्या थी और इसे प्रकट करने के लिए एक अभिव्यक्ति की शुरुआत हुई।

मैं मानक उपयोगकर्ता के रूप में चलते समय (Win32) एप्लिकेशन को HKLM/Software/Wow6432Node में कुंजी बनाने से रोकने के लिए रजिस्ट्री सुरक्षा पर भरोसा कर रहा था, और यह देखकर आश्चर्यचकित हुआ कि यह ध्यान दिए बिना सफल रहा था, लेकिन कोई भी कुंजी नहीं थी वर्तमान और इसे इस नए वर्चुअलस्टोर क्षेत्र के तहत बनाया गया था।

पीई मैनिफेस्ट सुरक्षा से संबंधित जानकारी में पाया जाता है जब रजिस्ट्री वर्चुअलाइजेशन बंद कर दिया जाता है।

<trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker"> 
     </requestedExecutionLevel> 
     </requestedPrivileges> 
    </security> 
</trustInfo> 

निष्पादन विस्टा और एक्सपी, जाहिरा तौर पर TrustInfo खंड में प्रत्येक नोड के साथ संगत होना करने के लिए नाम स्थान शामिल होना चाहिए के लिए::

<ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2"> 
    <ms_asmv2:security> 
     <ms_asmv2:requestedPrivileges> 
     <ms_asmv2:requestedExecutionLevel level="asInvoker"> 
     </ms_asmv2:requestedExecutionLevel> 
     </ms_asmv2:requestedPrivileges> 
    </ms_asmv2:security> 
</ms_asmv2:trustInfo> 

विशेषाधिकार के उन्नयन की आवश्यकता नहीं करने के लिए मेरी प्रकट निम्नलिखित नोड शामिल एक बार मैनिफेस्ट को मेरे .exe में सही ढंग से एम्बेड किया गया था (यह मुझे परियोजना के उचित गुणों को संशोधित करके कुछ प्रयासों में आया), कार्यक्रम आखिरकार विफल रहा था क्योंकि मैं उम्मीद कर रहा था।

प्रबंधित कोड के लिए, mt.exe उपकरण चलाकर मेनिफेस्ट को पोस्ट-बिल्ड चरण के रूप में शामिल किया जा सकता है। उदाहरण के लिए, के रूप में MSDN article

mt.exe –manifest YourFile.manifest –outputresource:YourApp.exe;#1 

की रिपोर्ट में मैं प्रकट दृष्टिकोण का उपयोग कर पसंद करते हैं बजाय Reg.exe का उपयोग कर रजिस्ट्री नोड्स के झंडे को संशोधित करने के रूप में this article में बताई गई विधि इस व्यवहार सभी मशीनों पर लगातार बना देता है।

आशा है कि मदद करता है

अल्बर्टो

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