2010-08-29 11 views
13

के साथ काम नहीं करता है, मैं ऊंचे विशेषाधिकारों के साथ ही छुपा खिड़की के साथ एक बाल प्रक्रिया (वास्तव में वही, कंसोल ऐप) शुरू करना चाहता हूं।विशेषाधिकारों को बढ़ाना UseShellExecute = false

मैं आगे क्या:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location) 
{ 
    UseShellExecute = true, // ! 
    Verb = "runas", 
}; 

var process = new Process 
{ 
    StartInfo = info 
}; 

process.Start(); 

और इस काम करता है:

var identity = new WindowsPrincipal(WindowsIdentity.GetCurrent()); 
identity.IsInRole(WindowsBuiltInRole.Administrator); // returns true 

लेकिन UseShellExecute = true एक नई विंडो बनाता है और मैं भी मैं उत्पादन उपयोग नहीं कर सकते।

तो जब मैं आगे क्या:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location) 
{ 
    RedirectStandardError = true, 
    RedirectStandardOutput = true, 
    UseShellExecute = false, // ! 
    Verb = "runas" 
}; 

var process = new Process 
{ 
    EnableRaisingEvents = true, 
    StartInfo = info 
}; 

DataReceivedEventHandler actionWrite = (sender, e) => 
{ 
    Console.WriteLine(e.Data); 
}; 

process.ErrorDataReceived += actionWrite; 
process.OutputDataReceived += actionWrite; 

process.Start(); 
process.BeginOutputReadLine(); 
process.BeginErrorReadLine(); 
process.WaitForExit(); 

यह विशेषाधिकार तरक्की नहीं करता है और कोड ऊपर झूठी देता है। क्यूं कर??

+0

BTW, आप 'DataReceivedEventHandler actionWrite = ...' और 'process.ErrorDataReceived + = actionWrite' लिख सकते हैं: यह एक अस्थायी फ़ाइल का उपयोग करता है। – SLaks

+0

क्या आप UseShellExecute = true, Verb = "runas", और ErrorDataReceived ईवेंट @SLaks टिप्पणी के रूप में उपयोग कर परीक्षण कर सकते हैं? – Kiquenet

उत्तर

14

ProcessStartInfo.Verb केवल प्रभाव होगा यदि प्रक्रिया ShellExecuteEx() द्वारा शुरू की जाती है। जिसके लिए UseShellExecute = true की आवश्यकता है। I/O को पुनर्निर्देशित करना और विंडो को छिपाना केवल तभी काम कर सकता है जब प्रक्रिया CreateProcess() द्वारा शुरू की जाती है। जिसके लिए UseShellExecute = false की आवश्यकता है।

ठीक है, यही कारण है कि यह काम नहीं करता है। सुनिश्चित नहीं है कि यूएसी को छोड़कर छिपी हुई प्रक्रिया शुरू करने से मना कर दिया गया हो। शायद। शायद शायद।

मैसेज एलिमेंटेशन प्रॉम्प्ट प्रदर्शित करने के लिए आपको मेनिफेस्ट के लिए this Q+A देखें।

+0

WinAPI के पीछे दृश्य विवरण के लिए आपको बहुत बहुत धन्यवाद। छिपी हुई खिड़की वाली प्रक्रिया के लिए मांग पर ऊंचे विशेषाधिकार प्राप्त करना संभव है? या यह परस्पर अनन्य चीजें हैं? – abatishchev

+0

और क्या मैनिफेस्ट का उपयोग करके चालू/बंद करना संभव है? अर्थात। जब मैं अपना ऐप पहली बार (मैन्युअल रूप से) शुरू करता हूं - एक मैनिफेस्ट का उपयोग न करें, जब दूसरा (प्रोग्रामेटिक रूप से) - उपयोग करने के लिए बल। – abatishchev

+0

उपयोगकर्ता के बारे में जानने के बिना उन्नत विशेषाधिकारों के साथ एक प्रक्रिया शुरू करना संभव नहीं है। आपको एक अलग .exe की आवश्यकता है ताकि उसका अपना अभिव्यक्ति हो। असल में आपको केवल मुख्य() विधि की आवश्यकता होती है। –

0

this answer देखें।

ऐसा लगता है कि यह एक कामकाज प्रदान करता है। लेकिन जब आप बच्चे की प्रक्रिया के स्रोत कोड तक पहुंच प्राप्त करते हैं तो Named Pipes जैसी अन्य विधियों को आजमाने की सलाह देते हैं।

+1

मैंने यूएसी आलेख दृष्टिकोण का परीक्षण नहीं किया है, हालांकि इसमें स्वयं नमूना है। लेकिन यदि आपका नाम नामित पाइप्स के लिए नमूना है, तो आप आसानी से उनमें से कई को ढूंढ सकते हैं (जैसे [यह] (http://stackoverflow.com/questions/13806153/example-of-named-pipes) या [यह] (http: //www.codeproject.com/Tips/492231/Csharp-Async- नामांकित- पाइप्स)) थोड़ी सी खोज के साथ। मुद्दा यह है कि I/O पुनर्निर्देशन की तरह, आप डेटा को भेजने और प्राप्त करने के लिए नामित पाइप्स के साथ भी पाठ्य धाराओं का उपयोग कर सकते हैं (भले ही दो प्रक्रियाएं विभिन्न मशीनों पर हों)। बेशक आपको पूरी तरह से काम करने के लिए आवेदन करने के लिए कुछ बारीकियों से निपटना होगा। –

+0

@abatishchev IMHO, फ़ाइल से ट्रेस का बेहतर उपयोग, उत्पादन को रीडायरेक्ट नहीं, क्रिया = रनस। नामांकित पाइप्स आसान डिबगिंग के लिए बहुत जटिल और जटिल है। – Kiquenet

2

मेरे मामले में, ऊंचे बच्चे की प्रक्रिया पूरी होने के बाद आउटपुट प्राप्त करना ठीक था। यहां मेरा समाधान आया है।

var output = Path.GetTempFileName(); 
var process = Process.Start(new ProcessStartInfo 
{ 
    FileName = "cmd", 
    Arguments = "/c echo I'm an admin > " + output, // redirect to temp file 
    Verb = "runas", // UAC prompt 
    UseShellExecute = true, 
}); 
process.WaitForExit(); 
string res = File.ReadAllText(output); 
// do something with the output 
File.Delete(output); 
+0

यह वास्तव में मेरे लिए काम कर रहा प्रतीत होता है। समेकित विवरण (विंडोज 10, एफ #) - https://gist.github.com/ImaginaryDevelopment/f4bc33ae75bdf29e5aad8fd4045f193d – Maslow

+0

पर स्वीकार्य उत्तर एक स्पष्टीकरण है, यह एक समाधान है .. +1 – caesay

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