2012-05-24 26 views
7

जब कोई उपयोगकर्ता मेरे एप्लिकेशन से फ़ाइल सहेजता है, तो वे वर्तमान में प्रतिबंधित स्थानों (जैसे सी :) पर सहेज नहीं सकते हैं। मुझे लगता है कि यह एक अच्छा प्रतिबंध है, लेकिन मैं विशेषाधिकारों को बढ़ाने और उपयोगकर्ता को प्रतिबंधित क्षेत्र में सहेजने की अनुमति देने के लिए एक यूएसी प्रॉम्प्ट प्रदान करना चाहता हूं।सी # का उपयोग कर प्रतिबंधित स्थान पर फ़ाइल सहेजने के लिए यूएसी प्रॉम्प्ट कैसे प्रदर्शित करें?

मैंने इस विषय के आस-पास बहुत सारे जवाब देखे हैं जिनमें 'रनस' का उपयोग करके उन्नत विशेषाधिकारों के साथ एक नई प्रक्रिया को शामिल करना शामिल है। साथ ही, ऐसा लगता है कि यह किसी अन्य उपयोगकर्ता का प्रतिरूपण करके किया जा सकता है। जो मैं समझता हूं, उन दोनों तरीकों से उपयोगकर्ता को उपयोगकर्ता प्रमाण-पत्र प्रदान करने की आवश्यकता होती है।

जो मैं करना चाहता हूं वह मूल रूप से विंडोज़ करता है। आप सेल्सियस के लिए एक फ़ाइल की प्रतिलिपि करने का प्रयास करते हैं: \ विंडोज 7 में (यह मानते हुए आप यूएसी उसके डिफ़ॉल्ट स्तर करने के लिए सेट मिल गया है), तो आप शीघ्र निम्नलिखित मिलती है:

UAC Prompt

क्लिक करने के बाद साथ जारी रखें बटन यूएसी शील्ड, फ़ाइल को C: \ में कॉपी किया गया है जिसमें प्रमाण-पत्रों के लिए कोई संकेत नहीं है (माना जाता है कि आप व्यवस्थापक विशेषाधिकारों के साथ लॉग ऑन हैं)।

मैं व्यवस्थापक के उपयोगकर्ताओं के लिए अपने आवेदन में इस व्यवहार को दोहरा सकता हूं? उन्हें किसी अन्य उपयोगकर्ता का प्रतिरूपण नहीं करना चाहिए क्योंकि उनके पास पहले से ही व्यवस्थापक विशेषाधिकार हैं। क्या कोई इस प्रक्रिया के दौरान विंडोज क्या कर रहा है इस पर विवरण प्रदान कर सकता है? क्या वे उन्नत विशेषाधिकारों के साथ एक नई एक्सप्लोरर.एक्सई प्रक्रिया तैयार कर रहे हैं?

+0

कुछ प्रेरणा: http://stackoverflow.com/questions/573086/how-to-elevate-privileges-only-when-required –

उत्तर

5

आपको विंडोज़ करने की ज़रूरत है। और एक नई प्रक्रिया पैदा करें जो उच्च अधिकारों के साथ चलेगी। यहां कोई शॉर्टकट नहीं हैं। एक प्रक्रिया शुरू होने पर आवंटित टोकन यह निर्धारित करता है कि प्रक्रिया के अधिकार क्या हैं। प्रक्रिया शुरू होने के बाद उस टोकन को बदला नहीं जा सकता है। यदि आपको ऊंचा करने की आवश्यकता है, तो आपको एक नई प्रक्रिया की आवश्यकता है।

मैंने इस विषय के आस-पास बहुत सारे जवाब देखे हैं जिनमें 'रनस' का उपयोग करके उन्नत विशेषाधिकारों के साथ एक नई प्रक्रिया को शामिल करना शामिल है। साथ ही, ऐसा लगता है कि यह किसी अन्य उपयोगकर्ता का प्रतिरूपण करके किया जा सकता है। जो मैं समझता हूं, उन दोनों तरीकों से उपयोगकर्ता को उपयोगकर्ता प्रमाण-पत्र प्रदान करने की आवश्यकता होती है।

ऐसा कोई मामला नहीं है। यदि वर्तमान उपयोगकर्ता व्यवस्थापक नहीं है, तो यूएसी संवाद उस उपयोगकर्ता के नए प्रमाण-पत्रों के लिए संकेत देगा जिसमें व्यवस्थापकीय अधिकार हैं। यह ओवर-द-कंधे यूएसी संवाद है। दूसरी तरफ, यदि वर्तमान उपयोगकर्ता एक व्यवस्थापक है तो उन्हें सहमति संवाद प्राप्त करें। यही वह संवाद है जो सुरक्षित डेस्कटॉप पर दिखाया गया है और केवल आपको जारी रखने के लिए कहता है।

एक बात यह है कि विंडोज घटक ऐसा कर सकते हैं कि आप सहमति संवाद को दिखाए बिना एक प्रक्रिया को उन्नत नहीं कर सकते हैं। यह केवल विंडोज 7 पर होता है (Vista पर नहीं), और केवल तभी यदि आपके पास डिफ़ॉल्ट सेटिंग में यूएसी सेटिंग है जो विंडोज 7 में जोड़ा गया था। इस प्रकार एक्सप्लोरर आपके द्वारा प्रश्न में शामिल संवाद को दिखाने में सक्षम है और फिर सहमति यूएसी संवाद दिखाए बिना प्रतिलिपि बनाने के लिए एक उन्नत प्रक्रिया शुरू करें। केवल विंडोज घटक ही क्षमता प्रदान की जाती हैं।

लेकिन नीचे की रेखा यह है कि आपको एक नई प्रक्रिया शुरू करने की आवश्यकता है जो ऊंचा हो। runas क्रिया का प्रयोग करना ऐसा करने का वैधानिक तरीका है।आवश्यकता से अधिक विशेषाधिकारों के साथ

+0

उत्तर के लिए धन्यवाद। _consent_ संवाद निश्चित रूप से मैं जो खोज रहा हूं वह है। तो 'रनस' विधि उन्नत विशेषाधिकारों के लिए पसंदीदा पैटर्न है? ऐसा लगता है कि प्रति जवाब # की तरह लगता है कि प्रतिरूपण पैटर्न की सिफारिश करने वाले उत्तरों के साथ 50/50 विभाजित हैं (जो पी/आवेदक शामिल है)। –

+0

सहमति संवाद वह है जो आप 'रनस' क्रिया के साथ प्रक्रिया शुरू करते हैं, और उपयोगकर्ता एक व्यवस्थापक है। 'रनस' का उपयोग करना मुश्किल है और मैं नहीं देख सकता कि आपको और कुछ क्यों चाहिए। –

+1

दरअसल अनुशंसित तरीका 'आवश्यक प्रशासक' के निष्पादन स्तर के साथ अनुप्रयोग मैनिफेस्ट का उपयोग करना है। यह काम करता है यदि आपके पास दो अलग-अलग निष्पादन योग्य हैं। यदि केवल एक निष्पादन योग्य है, तो 'रनस' क्रिया ही एकमात्र तरीका है। –

6

Programming Elevated Privilege/UAC

रनिंग अनुप्रयोगों कम से कम विशेषाधिकार की सिद्धांत के खिलाफ है, और संभावित सुरक्षा जोखिम हो सकता है। इसका बचाव करने के लिए, विंडोज विस्टा उपयोगकर्ता खाते नियंत्रण (यूएसी) को ऑपरेटिंग सिस्टम की सुरक्षा के लिए चलाकर कम विशेषाधिकार (सामान्य उपयोगकर्ता के रूप में) चलाकर, वर्तमान उपयोगकर्ता व्यवस्थापक के रूप में साइन इन किया गया है। दैनिक उपयोग के लिए अधिक से अधिक XP/2K उपयोगकर्ता सामान्य उपयोगकर्ता खाते का भी उपयोग करते हैं। यूएसी को पूरी तरह से यूएसी समझने के लिए पहले डीएसी डिमिटिफाइड पढ़ें।

दो आम गलतियों कि डेवलपर्स बना देती हैं कर रहे हैं:

  • अनुरोध अंत उपयोगकर्ता भी हालांकि यह आवश्यक नहीं है व्यवस्थापक विशेषाधिकार के साथ एक आवेदन को चलाने के लिए है, क्योंकि बुरा की ज्यादातर समय डिजाइन प्रथाओं। ये एप्लिकेशन या तो अंत उपयोगकर्ताओं को डराते हैं, या संभावित रूप से सुरक्षा भेद्यता है।
  • एप्लिकेशन को उन्नत करने के लिए अंतिम उपयोगकर्ता का अनुरोध न करें, लेकिन को व्यवस्थापकीय विशेषाधिकार की आवश्यकता वाले संचालन करने का प्रयास करें। ये एप्लिकेशन बस विंडोज विस्टा या विंडोज एक्सपी/2 के सामान्य उपयोगकर्ता खाते के तहत तोड़ते हैं।

डाउनलोड करने योग्य नमूना कोड दर्शाता है कि उन्नत विशेषाधिकार/यूएसी प्रोग्रामिंग कैसे करें। WPF और Windows फॉर्म नमूना अनुप्रयोग दोनों प्रदान किए गए हैं।

  • सामान्य उपयोगकर्ता, Windows XP/Windows Vista: यूएसी शील्ड आइकन प्रदर्शित किया जाता है निम्न परिदृश्यों अंतर को देखने के लिए के लिए आवेदन चलाएँ। "सेव में सहेजें: \" प्रदर्शित करने पर "रन के रूप में" संवाद प्रदर्शित होता है, उपयोगकर्ता को जारी रखने के लिए व्यवस्थापक पासवर्ड दर्ज करने के लिए पूछना;
  • यूएसी अक्षम के साथ व्यवस्थापक, विंडोज एक्सपी/विंडोज विस्टा अक्षम: यूएसी शील्ड आइकन छिपा हुआ है। बिना किसी संवाद के "पूरा करने के लिए सहेजें: \" पर क्लिक करना;
  • व्यवस्थापक, यूएसी सक्षम के साथ विंडोज विस्टा सक्षम: यूएसी शील्ड आइकन प्रदर्शित है। जारी रखने की अनुमति उपयोगकर्ता की पूछने पर संवाद "प्रदर्शित करने के लिए सी: \" पर क्लिक करके संवाद प्रदर्शित करता है।

Link to Download

ऊंचा अमल (व्यवस्थापक के लिए पहला परीक्षण) कॉलिंग:

private void SaveToRootFolder_Click(object sender, EventArgs e) 
    { 
     string fileName = @"C:\Test.txt"; 
     if (App.IsAdmin) 
      DoSaveFile(textBox1.Text, textBox2.Text, fileName); 
     else 
     { 
      NameValueCollection parameters = new NameValueCollection(); 
      parameters.Add("Text1", textBox1.Text); 
      parameters.Add("Text2", textBox2.Text); 
      parameters.Add("FileName", fileName); 
      string result = Program.ElevatedExecute(parameters); 
      if (!string.IsNullOrEmpty(result)) 
       MessageBox.Show(result); 
     } 
    } 

ऊंचा कार्यान्वित:

internal static string ElevatedExecute(NameValueCollection parameters) 
    { 
     string tempFile = Path.GetTempFileName(); 
     File.WriteAllText(tempFile, ConstructQueryString(parameters)); 

     try 
     { 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.UseShellExecute = true; 
      startInfo.WorkingDirectory = Environment.CurrentDirectory; 
      Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase); 
      startInfo.FileName = uri.LocalPath; 
      startInfo.Arguments = "\"" + tempFile + "\""; 
      startInfo.Verb = "runas"; 
      Process p = Process.Start(startInfo); 
      p.WaitForExit(); 
      return File.ReadAllText(tempFile); 
     } 
     catch (Win32Exception exception) 
     { 
      return exception.Message; 
     } 
     finally 
     { 
      File.Delete(tempFile); 
     } 
    } 
+0

विस्तृत उत्तर के लिए धन्यवाद! –

1

एक सीमित विकल्प, उपयोगी केवल जब आगे बढ़ते, फ़ाइलों का नामकरण, प्रतिलिपि बनाना और हटाना:

SHFileOperation

आप इस समारोह के माध्यम से एक फ़ाइल कार्रवाई करने के लिए प्रयास करते हैं, Windows उपयोगकर्ता को पदोन्नति शीघ्र प्रदान करेगा।

नोट वहाँ इस के लिए कुछ कमियां हैं:

  • , चलती का नाम बदलने पर, प्रतिलिपि बनाई जा रही है, और हटाया जा रहा है के लिए यह केवल काम करता है। एक नई फाइल को सहेजने के लिए इस तरह एक अस्थायी निर्देशिका में सहेजने की आवश्यकता होगी, फिर इसे वांछित स्थान पर ले जाना होगा। यह सहेजने वाले फ़ाइल संवाद की समस्या का समाधान नहीं करता है जो आपको एक यूएसी संरक्षित स्थान को लक्ष्य के रूप में चुनने की अनुमति नहीं देता है।
  • यदि लक्ष्य निर्देशिका मौजूद नहीं है (किसी मूव या कॉपी के लिए), SHFileOperation उपयोगकर्ता को संकेत दे सकता है यदि लक्ष्य निर्देशिका बनाई जानी चाहिए। हालांकि, यह ऐसा करने के लिए ऊंचे विशेषाधिकारों के लिए नहीं पूछेगा, और इसलिए यूएसी संरक्षित स्थान के तहत असफल हो जाएगा। इसके लिए वर्कअराउंड मैन्युअल रूप से अस्थायी स्थान में मौजूद गैर-मौजूद निर्देशिका बनाना है, फिर उन्हें स्थानांतरित स्थान पर ले जाएं/कॉपी करें। यह यूएसी प्रॉम्प्ट प्रदान करेगा।
  • यदि उपयोगकर्ता मूव/कॉपी डायलॉग में 'छोड़ें' या 'रद्द करें' चुनता है, या उपयोगकर्ता यूएसी प्रॉम्प्ट पर 'नहीं' चुनता है तो आपको आकस्मिक योजनाएं रखने की आवश्यकता है।
संबंधित मुद्दे