2009-07-27 9 views
12

क्या कोई जानता है कि मैं प्रोग्रामेटिक रूप से कैसे जांच सकता हूं (सी # का उपयोग करके) क्या मेरा प्रोग्राम किसी विशेष रजिस्ट्री कुंजी को पढ़ने/लिखने में सक्षम होगा (विशेष रूप से: "सॉफ़्टवेयर \ माइक्रोसॉफ्ट \ विंडोज \ CurrentVersion \ Run")?मैं कैसे जांचूं कि किसी उपयोगकर्ता को किसी विशेष रजिस्ट्री कुंजी को पढ़ने/लिखने की अनुमति है या नहीं?

मैं पूछ रहा हूं क्योंकि मेरे प्रोग्राम में 'स्टार्टअप' रन को सक्षम या अक्षम करने का विकल्प है। यदि वर्तमान उपयोगकर्ता को रजिस्ट्री में परिवर्तन करने की अनुमति नहीं है तो मैं इस विकल्प को अक्षम करना चाहता हूं। क्या यह कुंजी हमेशा मौजूदा उपयोगकर्ता द्वारा लिखी जाने की अनुमति है, या क्या संभावना है कि इसे बंद कर दिया गया है? अगर उत्तरार्द्ध, मैं इसे कैसे देखूं?

मैंने रजिस्ट्री अनुमतियों की जांच करने के कई विरोधाभासी तरीकों को देखा है - लेकिन मूल रूप से मुझे इसे पढ़ने की कोशिश करने से पहले एक विशिष्ट कुंजी जांचने का कोई तरीका नहीं मिल रहा है। मैं इसे एक्सेस करने और अपवाद प्राप्त करने की कोशिश करने से कुंजी तक पहुंचने से पहले चेक निष्पादित करता हूं।

किसी भी मदद की बहुत सराहना की जाती है।

टॉम

+2

अंगूठे के सामान्य नियम के रूप में, स्थानीय मशीन कुंजियों को व्यवस्थापक अनुमति की आवश्यकता होती है लेकिन वर्तमान उपयोगकर्ता कुंजी नहीं होती है। – Brian

+0

धन्यवाद ब्रायन - इसलिए यह मानना ​​सुरक्षित है कि मैं इस कुंजी को लिख सकता हूं (यह उपयोगकर्ता कुंजी को निर्देशित करेगा) और बस विकल्प को हमेशा सक्षम रखें, और उसके बाद यह विफल होने पर किसी भी अपवाद को फेंक सकता है? – Beardy

उत्तर

13

RegistryPermission कक्षा reg कुंजी के चारों ओर सुरक्षा अनुमतियों को नियंत्रित करती है।

RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 

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

try 
{ 
    RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 
    perm1.Demand(); 
} 
catch (System.Security.SecurityException ex) 
{ 
    return; 
} 

//Do your reg updates here 

संपादित करें: मैं क्या टिप्पणी में आपका उल्लेख पर सोच, यहाँ अनुमति जांच के लिए RegistryPermission वर्ग के लिए विस्तार तरीके हैं:

using System.Security.Permissions; 
using System.Security; 

public static class RegistryExtensions 
{ 
    public static bool HavePermissionsOnKey(this RegistryPermission reg, RegistryPermissionAccess accessLevel, string key) 
    { 
     try 
     { 
      RegistryPermission r = new RegistryPermission(accessLevel, key); 
      r.Demand(); 
      return true; 
     } 
     catch (SecurityException) 
     { 
      return false; 
     } 
    } 

    public static bool CanWriteKey(this RegistryPermission reg, string key) 
    { 
     try 
     { 
      RegistryPermission r = new RegistryPermission(RegistryPermissionAccess.Write, key); 
      r.Demand(); 
      return true; 
     } 
     catch (SecurityException) 
     { 
      return false; 
     } 
    } 

    public static bool CanReadKey(this RegistryPermission reg, string key) 
    { 
     try 
     { 
      RegistryPermission r = new RegistryPermission(RegistryPermissionAccess.Read, key); 
      r.Demand(); 
      return true; 
     } 
     catch (SecurityException) 
     { 
      return false; 
     } 
    } 
} 
+0

धन्यवाद wolfwyrd :) – Beardy

+0

कोई समस्या नहीं है, और जोएल कोहुर्न के उत्तर पर टिप्पणी करने के लिए शैली में कार्यक्षमता प्राप्त करने के लिए, आप हमेशा इस प्रयास को लपेट सकते हैं/अपनी कक्षा (या रजिस्ट्री के लिए विस्तार विधि के रूप में) पर एक विधि में पकड़ें और सत्य/झूठी वापस लौटें जो आप देखना चाहते हैं – Wolfwyrd

+0

^^ बस अभी यह किया गया है: पी – Beardy

0

मैं के साथ सी # यह कैसे करने के लिए यकीन नहीं है, लेकिन Win32 के साथ, आप RegGetKeySecurity() का प्रयोग करेंगे। शायद एक सी # रैपर है? अन्यथा, पी/Invoke का उपयोग करें।

6

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

अनुमोदित सुरक्षा अनुमति अपेक्षाकृत स्थिर होती है, लेकिन मौका अभी भी मौजूद है। इसका मतलब है कि आप में सुरक्षा अपवाद को संभालने के लिए कोड होना चाहिए, और यदि आपको ऐसा करना है तो वैसे भी पहले स्थान पर चेक बनाने में कोई बात नहीं है। इसके बजाए, अपना अपवाद हैंडलर को थोड़ा बेहतर बनाने में अपना समय दें।

उस ने कहा, "बू" किसी भी ऐप को स्टार्ट-अप पर कुछ चलाने के लिए चाहता है। YAGNI।

+0

खैर, ऐप डिफ़ॉल्ट रूप से स्टार्टअप पर चलाने के लिए सेट नहीं होता है, लेकिन उत्पाद की प्रकृति/उद्देश्य के कारण उपयोगकर्ता भी इस व्यवहार को चाहेगा, यह एक अच्छा मौका है। उपयोगकर्ता को इसे मैन्युअल रूप से करने के लिए मजबूर करने के बजाय इसे उपलब्ध कराने के लिए बेहतर है। मैं अपवाद हैंडलिंग का उपयोग करने के लिए प्राप्त/सेट व्यवहार चाहता हूं, लेकिन विकल्प संवाद में मैं RunAtStartup.Enabled = Registry.CanWriteToKey() जैसे कुछ का उपयोग करूंगा, अगर आपको विचार मिलता है। यह एक बूलियन में अपवाद को बदलने के लिए मुझे बहुत समझ नहीं आता है:/ – Beardy

5

मुझे लगता है कि आपको सबसे अच्छा शर्त है कि आप कुंजी पर अपना मूल्य जोड़ने का प्रयास करें, और उपयोगकर्ता को सूचित करके विफलता को विफल तरीके से संभालें, उनके पास ऐसा करने के लिए पर्याप्त अनुमति नहीं है।

यदि आप किसी प्रकार का प्रशासनिक टूल लिख रहे हैं जिसे हमेशा व्यवस्थापक द्वारा चलाने के लिए डिज़ाइन किया गया है, तो आपको यह संकेत देना चाहिए कि manifest में। इस तरह आपका ऐप स्टार्टअप (यूएसी प्रॉम्प्ट के माध्यम से) पर बढ़ेगा।

0

बस WRITE अनुमतियों के साथ रजिस्ट्री कुंजी खोलने का प्रयास करें।

यह कहा गया है कि, दूसरों ने जो कहा है वह सही है: यह बताने का कोई तरीका नहीं है कि कोई ऑपरेशन तब तक सफल नहीं होगा जब तक कि आप इसे आजमाएं। शायद किसी ने रन कुंजी हटा दी। शायद रजिस्ट्री आवंटित स्मृति से अधिक हो जाएगा। शायद डिस्क विफल रही।

1

सरल विकल्प कोशिश करना है और open लेखन पहुंच के साथ कुंजी है और देखें कि आप इसे प्राप्त करते हैं या नहीं। बाद में कुंजी close याद रखें।

bool fWriteAccess; 
try { 
    Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True).Close(); 
    fWriteAccess = True; 
} catch (SecurityException) { 
    fWriteAccess = False; 
} 
संबंधित मुद्दे

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