मैं एक तृतीय पक्ष Windows सेवा है कि CreateProcessAsUser का उपयोग कर स्क्रिप्ट और निष्पादनयोग्य चलाकर कुछ स्वचालन कार्यों को संभालती है() का उपयोग कर रहा से एक यूएसी ऊंचा प्रक्रिया शुरू करने से। मैं यूएसी और जिस तरह की वजह से विंडोज सर्वर 2008 पर समस्याओं LUA ऊंचाई APIs के माध्यम से नियंत्रित किया जाता है में चल रहा हूँ।एक गैर-सहभागी सेवा (Win32/.net/powershell)
सेवा LocalSystem के रूप में चलाता है और "डेस्कटॉप साथ सहभागिता करें" सक्षम नहीं है। प्रक्रियाओं प्रशासक समूह में उपयोगकर्ताओं के रूप में चलाए जा रहे हैं किया जा रहा है, लेकिन नहीं व्यवस्थापक खाते (जो कई यूएसी प्रतिबंध से छूट दी गई है)। जगह में सभी यूएसी डिफ़ॉल्ट सेटिंग्स।
मैं सेवा के लिए मनमानी आदेश या पावरहेल कोड पास कर सकता हूं, लेकिन मैं गैर-उन्नत, गैर-इंटरैक्टिव प्रक्रिया को 'ब्रेक आउट' नहीं कर सकता जो सेवा द्वारा लात मारता है।
इस मुद्दे का क्रूक्स ऐसा लगता है कि एक उन्नत प्रक्रिया शुरू करने के लिए एकमात्र (सार्वजनिक) एपीआई विकल्प 'रनस' क्रिया के साथ ShellExecute() है, लेकिन जहां तक मैं कह सकता हूं कि इसे नहीं कहा जा सकता एक गैर-संवादात्मक सेवा या आपको "इस ऑपरेशन को एक इंटरैक्टिव विंडो स्टेशन की आवश्यकता होती है" जैसी त्रुटियां मिलती हैं।
केवल वैकल्पिक हल मैंने पाया यहाँ उल्लेख किया जाता है: http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
Vista में, सरकारी दस्तावेज रास्ता एक प्रक्रिया ऊंचे होने का केवल खोल एपीआई ShellExecute (पूर्व) का उपयोग किया जाता है (नहीं CreateProcess या CreateProcessAsUser)। तो आपके आवेदन ShellExecute (पूर्व) कॉल करना होगा एक सहायक SendInput कॉल करने के लिए शुरू करने के लिए ऊपर उठाया। इसके अलावा, कारण सत्र के लिए 0 अलगाव, एक सेवा केवल CreateProcessAsUser या CreateProcessWithLogonW का उपयोग करें ( ShellExecute (पूर्व) का उपयोग नहीं कर सकते हैं) इंटरैक्टिव डेस्कटॉप निर्दिष्ट करने के लिए कर सकते हैं।
.. मुझे लगता है कि विंडोज सेवा से एक उन्नत प्रक्रिया को हल करने का कोई सीधा तरीका नहीं है। हम पहले CreateProcessAsUser या CreateProcessWithLogonW को उपयोगकर्ता सत्र (इंटरैक्टिव डेस्कटॉप) में गैर-उन्नत प्रक्रिया को बढ़ाने के लिए पहले उपयोग कर सकते हैं। फिर गैर-उन्नत प्रक्रिया में, यह वास्तविक कार्य के लिए प्रक्रिया को बढ़ाने के लिए शैलएक्सक्यूट (पूर्व) का उपयोग कर सकता है।
.net/powershell कोड से ऐसा करने के लिए, ऐसा लगता है कि मैं/कुछ विस्तृत पी कर दिया था सामान नेट System.Diagnostics.ProcessStartInfo के बाद से CreateProcessAsUser या CreateProcessWithLogonW कॉल करने के लिए एक नहीं है आह्वान lpDesktop के बराबर है कि मैं "winsta0 \ default" पर सेट कर सकता हूं। और मैं अगर स्थानीय सिस्टम भी CreateProcessAsUser या CreateProcessWithLogonW कॉल करने के लिए अधिकार है पर स्पष्ट नहीं कर रहा हूँ।
मैं भी http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx और Process.Start with different credentials with UAC on
सब उस आधार पर को देखा, मैं इस निष्कर्ष है कि वहाँ यह करने के लिए कोई सीधा रास्ता तक पहुंच गया हूँ। क्या मैं कुछ भूल रहा हूँ? यह वास्तव में ऐसा प्रतीत नहीं होता है कि यह इतना कठिन होना चाहिए। ऐसा लगता है कि यूएसी को गैर-इंटरैक्टिव उपयोग मामलों को संभालने के लिए कभी डिजाइन नहीं किया गया था।
और यदि कोई माइक्रोसॉफ्ट लोग इसे पढ़ना समाप्त कर देते हैं, तो मैंने देखा कि शैलएक्सक्यूट आंतरिक रूप से ऊंचाई को संभालने का तरीका एप्लिकेशन सूचना सेवा (एआईएस) को बुलाकर है। कुछ Win32 या .NET API के माध्यम से एआईएस को एक ही कॉल क्यों उपलब्ध नहीं है? http://msdn.microsoft.com/en-us/library/bb756945.aspx
क्षमा करें कि थोड़ा सा भाग गया। किसी भी विचार के लिए धन्यवाद।
बल्कि यह बताते हुए कि सर्वर कोर यूएसी का समर्थन नहीं करता है। मेरे मूल्यांकन की पुष्टि करने के लिए लगता है। http://blogs.technet.com/server_core/archive/2009/01/19/user-account-control-uac-and-server-core.aspx –
मेरी पोस्ट यहां देखें जो बताती है कि, विशेष रूप से लिंक्ड टोकन को कैसे देखें खंड: http://brianbondy.com/blog/id/100/understanding-windows-at-a-deeper-level-sessions-window-stations-and-desktops –