.NET

2010-01-27 3 views
15

का उपयोग कर रजिस्ट्री कुंजी लिखने की अनुमतियां सेट करना मैं इंस्टॉल प्रक्रिया के दौरान मशीन के सभी या सभी उपयोगकर्ताओं को अपने एप्लिकेशन की रजिस्ट्री सेटिंग्स तक पहुंच लिखने की कोशिश कर रहा हूं।.NET

मेरे आवेदन में व्यवस्थापक को आवश्यकतानुसार अनुमति देने के बाद उचित अनुमतियां नहीं हैं, भले ही कुंजी और मान मौजूद हों, उन्हें अपडेट नहीं किया जा सकता है? मेरे पास नीचे स्निपेट है, लेकिन अनधिकृत एक्सेस/एक्सेस अस्वीकार होने के कारण इंस्टॉलर विफल हो रहा है। मुझे लगता है कि मैं सही रास्ते पर हूं ...

मैन्युअल ध्यान देने के बिना अनुमतियों के मुद्दे को मैं कैसे हल कर सकता हूं? क्या कोई बेहतर दृष्टिकोण है? मैं इस कार्यक्षमता को जोड़कर विजुअल स्टूडियो सेटअप के साथ एक अतिरिक्त इंस्टॉलर को प्रतिस्थापित करने का प्रयास कर रहा हूं।

protected void GrantAllAccessPermission(String key) 
    { 
     try 
     { 
      SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
      NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount; 

      // Get ACL from Windows, allow writing to the registry key 
      using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, true)) 
      { 

       RegistrySecurity rs = new RegistrySecurity(); 

       // Creating registry access rule for 'Everyone' NT account 
       RegistryAccessRule rar = new RegistryAccessRule(
        account.ToString(), 
        RegistryRights.FullControl, 
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
        PropagationFlags.None, 
        AccessControlType.Allow); 

       rs.AddAccessRule(rar); 
       rk.SetAccessControl(rs); 
      } 

     } 
     catch (System.Security.SecurityException ex) 
     { 
      throw new InstallException(
       String.Format("An exception in GrantAllAccessPermission, security exception! {0}", key), 
       ex); 
     } 
     catch (UnauthorizedAccessException ex) 
     { 
      throw new InstallException(
       String.Format("An exception in GrantAllAccessPermission, access denied! {0}", key), 
       ex); 
     } 

    } 
+11

मैं अपने टुकड़ा इस्तेमाल किया कुछ इसी तरह पूरा करने के लिए ... बस आपको यह बताने के , 'रजिस्ट्री.LocalMachine.OpenSubKey (कुंजी)' रजिस्ट्री होना चाहिए। LocalMachine.OpenSubKey (कुंजी, सत्य) '(जहां 'सत्य' इंगित करता है कि कुंजी लिखने योग्य होगी)। मैं उस परिवर्तन के बिना 'अनधिकृत एक्सेस अपवाद' में भाग रहा था। धन्यवाद! – Pwninstein

+0

इसके लिए धन्यवाद, पनडिनस्टीन! यह मुझे निराशा के अनगिनत घंटे बचाया! –

उत्तर

1

मैं विक्स 3.0 पर स्विच करके एक अलग और बेहतर दृष्टिकोण ले रहा हूं। Wix इंस्टॉलर का उपयोग करके मैं अपने इंस्टॉलेशन को अधिक आसानी से अनुकूलित और विस्तारित कर सकता हूं।

जोड़े Wix util एक्सटेंशन नाम स्थान:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'> 
रजिस्ट्री अनुमतियों के लिए

Wix नमूना:

<!-- Registry entries --> 
<DirectoryRef Id="TARGETDIR"> 
    <Component Id="RegistryEntries" Guid="{YOUR-GUID}"> 

    <!-- Create registry keys and grant user rights --> 
    <!-- Add Registry Keys and default values as necessary --> 
    <RegistryKey Root="HKLM" Key="$(var.RegKey)" Action="create"> 
     <util:PermissionEx User="[WIX_ACCOUNT_USERS]" GenericAll="yes"/> 
    </RegistryKey> 
    ... 
1

बेहतर तरीका है कि आपकी एप्लिकेशन सेटिंग्स कहीं भी रखें जहां आपके उपयोगकर्ताओं को अपडेट करने की अनुमति होगी।

+1

मैं सहमत हूं, लेकिन एक इष्टतम समाधान के लिए बड़े रिफैक्टरिंग प्रयास की आवश्यकता है। अभी मैं विरासत में प्राप्त एक आवेदन को फिर से निकालने की कोशिश कर रहा हूं। –

+0

जो उड़ाता है। क्या आप सुनिश्चित हैं कि इंस्टॉलर प्रशासनिक/उन्नत विशेषाधिकारों के साथ चल रहा है? – dkackman

+0

यह एक संभावना है, मेरा देव/परीक्षण बॉक्स एक्सपी है। मैं उसमें देख लूंगा। –

9

मुझे पता है इस पोस्ट के एक सा पुराना है, लेकिन मैं समझ यह किसी के लिए यह पर टिप्पणी के लायक था कि एक समान मुद्दे को समझने की कोशिश करते समय मैंने ऐसा किया था। आप बहुत करीब थे, मैंने बस कोड की दो पंक्तियां बदल दीं। मुख्य परिवर्तन पहला है; कुंजी खोलते समय आपको इसे लिखने योग्य के रूप में खोलने की आवश्यकता होती है। दूसरा परिवर्तन सभी अनुमतियों को बदलने के बजाय नई अनुमतियां जोड़ना है ... चूंकि आप सभी को पूर्ण पहुंच दे रहे हैं, आपको वास्तव में इस बदलाव की आवश्यकता नहीं है, लेकिन यदि आप एकल उपयोगकर्ता के लिए अनुमतियां जोड़ रहे हैं, तो आप अनुमतियां जोड़ना चाहेंगे।

प्रत्येक परिवर्तन मैं बाहर // बदल के साथ पुरानी लाइन पहले टिप्पणी की:

SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount; 

// Get ACL from Windows 

// CHANGED to open the key as writable: using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key)) 
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree)) 
{ 

     // CHANGED to add to existing security: RegistrySecurity rs = new RegistrySecurity(); 
    RegistrySecurity rs = rk.GetAccessControl() 

    // Creating registry access rule for 'Everyone' NT account 
    RegistryAccessRule rar = new RegistryAccessRule(
     account.ToString(), 
     RegistryRights.FullControl, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.None, 
     AccessControlType.Allow); 

    rs.AddAccessRule(rar); 
    rk.SetAccessControl(rs); 
} 
1

कोशिश इस

new System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert(); 
try 
{ 
//Your code 
}catch 
{ 
}finally 
{ 
     System.Security.Permissions.RegistryPermission.RevertAssert(); 
} 
संबंधित मुद्दे