2010-09-22 14 views
6

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

मेरे इंस्टॉलर के हिस्से के रूप में मैं कुछ कस्टम काम करने के लिए एक सी # एप्लिकेशन लॉन्च कर रहा हूं। इस छोटे से आवेदन वर्तमान में फोन करके ट्रे आवेदन की शुरूआत:

Process.Start(@"path/to/my/tray/app.exe"); 

वहाँ के बजाय संस्थापक को दिया ऊंचा अनुमतियाँ वर्तमान उपयोगकर्ता के अनुमति के साथ ट्रे ऐप्लिकेशन का इस्तेमाल करने कोई तरीका है?

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

मैं एक एमएसआई इंस्टॉलर बनाने के लिए वाईएक्स का उपयोग कर रहा हूं, इसलिए मैं उन समाधानों को भी स्वीकार करूंगा जो सीधे वाईएक्स/एमएसआई से काम करते हैं।

उत्तर

0

बहुत अच्छा सवाल है। जवाब मैंने पाया कि स्पष्ट रूप से काम सब कुछ गन्दा हैं; सबसे सुंदर समग्र EXE रैपर है।

इस आलेख को देखें: http://www.codeproject.com/KB/vista-security/RunNonElevated.aspx। यह एक विधि का वर्णन करता है जिसके द्वारा आप शैल विंडो में से एक को मूल हुक प्राप्त कर सकते हैं, जो गैर-ऊंचा हो जाता है, और खोल को आपके लिए अपना कोड शुरू करने के लिए कहता है। सी # में मूल हुकों को बहुत अधिक सीएएस अनुमतियों की आवश्यकता होती है; इन अनुमतियों को प्राप्त करने के लिए, आपके इंस्टॉलर को दृढ़ता से नामित और हस्ताक्षरित किया जाना चाहिए, और कोड को सुरक्षा पैरामिशन Flag.UnmanagedCode के साथ सुरक्षा सुरक्षा की मांग या जोर देना चाहिए।

.NET Framework की ProcessStartInfo क्लास में एक UseShellExecute Boolean प्रॉपर्टी भी शामिल है, जो सेट करते समय प्रोसेस.स्टार्ट() को कॉल को वर्तमान एप्लिकेशन डोमेन से सीधे प्रक्रिया शुरू करने के बजाय खोल को देने के लिए बताती है। मुझे नहीं पता कि यह आपको क्या करेगा, लेकिन यह निश्चित रूप से प्रयास करना बहुत आसान है; आप प्रसंस्करण। स्टार्ट() के ProcessStartInfo अधिभार का उपयोग करें, घोषित प्रक्रिया स्टार्टइन्फो के साथ ध्वज सेट है।

याद रखें कि आप वर्तमान में लॉग-इन किए गए उपयोगकर्ता के अलावा किसी उपयोगकर्ता के रूप में EXE प्रारंभ करने के लिए खोल नहीं बता सकते हैं (उपयोगकर्ता नाम और पासवर्ड ProcessStartInfo पर सेट नहीं होना चाहिए)। आपको वर्किंग डायरेक्टरी संपत्ति का उपयोग करके EXE के पथ को भी निर्दिष्ट करना होगा।

+0

UseShellExecute स्पष्ट रूप से सत्य के लिए डिफ़ॉल्ट रूप से डिफॉल्ट किया गया है, ऐसा लगता है कि यह मदद नहीं करेगा हालांकि मैंने अभी तक इसे आजमाया है। आपके उत्तर के लिए धन्यवाद लेकिन मुझे संदेह है कि रैपर एक्सई एकमात्र "साफ" समाधान होगा। – mchr

+0

मैंने अब इसका परीक्षण किया है और यह काम नहीं करता है। मैंने http://msdn.microsoft.com/en-us/library/aa446583%28v=vs.85%29.aspx पर कॉल करने और नई सुरक्षा टोकन का उपयोग करके लॉन्च करने वाले सी ++ डीएल को भी आजमाया है। हालांकि, यह उस उपयोगकर्ता को बदल नहीं सकता है जो लॉन्च प्रक्रिया का मालिक है - केवल लॉन्च की गई प्रक्रिया की अनुमतियां ही हैं। – mchr

3

दो दृष्टिकोण हैं। सरलतम एक शैल एक्सई का उपयोग करना है जो पहले व्यवस्थापक कार्य को ऊपर ले जाता है (ऐसा करने के कई तरीके; मैं एक मैनिफेस्ट पसंद करता हूं) और फिर दूसरा कार्य गैर-ऊंचा होता है। आपको बस इतना करना है कि जो भी कारण के लिए मना कर दिया तो ब्लॉग पोस्ट और CodePlex परियोजना मैं इस पर मेरे ब्लॉग पोस्ट से लिंक पर एक नज़र डालें: http://www.gregcons.com/KateBlog/NonElevatedFromElevatedManagedThisTime.aspx

1

वैकल्पिक रूप से, आप Windows API CreateProcessAsUser काम करने के लिए लगता है कि इस्तेमाल कर सकते हैं,।

+0

यह एक सेवा से लॉग ऑन उपयोगकर्ता के रूप में एक निर्धारित कार्य चलाने के लिए एक तरीके के रूप में मेरे लिए काम किया –

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