2009-07-10 21 views
5

मैंने एक साधारण विंडोज सेवा लिखी है जो onstart() सेवा की विधि में निर्दिष्ट एक्सई लॉन्च करेगी। सेवा शुरू करने के बाद exe लॉन्च किया गया यह केवल स्मृति में प्रस्तुत करता है लेकिन यह एक्सप्लोरर में नहीं दिखाता है।विंडोज सेवा से जीयूआई ऐप लॉन्च करना - विंडो नहीं दिखती

मैं अपने code.it से एक calc.exe शुरू करने की कोशिश कर रहा हूँ स्मृति में exe से पता चलता है, लेकिन यह नहीं करता एक्सप्लोरर में मेरे विचार (यानी) में आता है।

नीचे विधि onStart() में exe शुरू करने के लिए

Process pr=new Process(); 
    pr.StartInfo.FileName="calc.exe"; 
    pr.StartInfo.WindowStyle=ProcessWindowStyle.Maximized; 
    pr.StartInfo.CreateNoWindow=false; 
    pr.Start(); 
// pr.WaitForExit(); 
+0

आप क्या उम्मीद करते हैं? इसके बजाय बैच फ़ाइल चलाने का प्रयास करें। –

+0

आप किस प्रकार का एक्सी लॉन्च करने की कोशिश कर रहे हैं? – abhilash

+0

कृपया अपने प्रश्न को और अधिक सार्थक रूप से दोहराएं। प्रश्नों की सूची के माध्यम से यह बहुत कुछ नहीं बताता है ... – Hemant

उत्तर

1

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

यह डिजाइन द्वारा है ...

4

सेवाएं अलग खाता विशेषाधिकार (LocalService/NetworkService आदि) और इसलिए वे अपने डेस्कटॉप पर पहुँच नहीं है (अपने लॉगिन खाते के नियंत्रण के अधीन) के तहत चलाए जा रहे हैं।

सेवाएं चुपचाप अपना काम करने के लिए हैं और उन्हें यह करना चाहिए कि उन्हें क्या करना चाहिए। (विंडोज़ इवेंट लॉग में कुछ लॉगिंग करने के अपवाद के साथ जब उनके पास कुछ महत्वपूर्ण बात है)

+0

इसके अलावा, डिफ़ॉल्ट रूप से कार्य प्रबंधक केवल * आपके * लॉगिन खाते के अंतर्गत चल रही प्रक्रियाओं को दिखाता है। – MSalters

10

विस्टा या बाद में अन्य सत्र में चलने वाली सेवाएं और सेवाओं से सीधे शुरू की गई एप्लिकेशन डिफ़ॉल्ट रूप से उसी सत्र में शुरू की जाती हैं। अन्य सत्रों में एप्लिकेशन शुरू करना संभव है - आपको उपयोगकर्ता सत्र की आईडी खोजनी है और CreateProcessAsUser का उपयोग करना है।

यदि एक से अधिक उपयोगकर्ता लॉग इन हैं और आपको सभी उपयोगकर्ताओं के लिए अपना प्रोग्राम शुरू करने की आवश्यकता है तो आपको सभी सत्रों के आईडी मिलना चाहिए।

यहाँ नमूना कोड है:

int session = Win32.WTSGetActiveConsoleSessionId(); 
if (session == 0xFFFFFFFF) 
{ 
    return false; 
} 

IntPtr userToken; 
bool res = Win32.WTSQueryUserToken(session, out userToken); 
if (!res) 
{ 
    this.log.WriteEntry("Error WTSQueryUserToken"); 
    return false; 
} 

string path = GetPath(); 
string dir = Path.GetDirectoryName(path); 
Win32.STARTUPINFO si = new Win32.STARTUPINFO(); 
si.lpDesktop = "winsta0\\default"; 
si.cb = Marshal.SizeOf(si); 

Win32.PROCESS_INFORMATION pi = new Win32.PROCESS_INFORMATION(); 
Win32.SECURITY_ATTRIBUTES sa = new Win32.SECURITY_ATTRIBUTES(); 
sa.bInheritHandle = 0; 
sa.nLength = Marshal.SizeOf(sa); 
sa.lpSecurityDescriptor = IntPtr.Zero; 

if (!Win32.CreateProcessAsUser(userToken,  // user token 
           path,   // exexutable path 
           string.Empty, // arguments 
           ref sa,   // process security attributes (none) 
           ref sa,   // thread security attributes (none) 
           false,   // inherit handles? 
           0,    // creation flags 
           IntPtr.Zero, // environment variables 
           dir,   // current directory of the new process 
           ref si,   // startup info 
           out pi))  // receive process information in pi 
{ 
    int error = Marshal.GetLastWin32Error(); 
    this.log.WriteEntry("Error CreateProcessAsUser:" + error); 
    return false; 
} 
0

की तरह पहले से ही दूसरों को एक खिड़कियों सेवा है "सामान्य रूप से" एक अलग खाते ("स्थानीय सिस्टम" या "NetworkService") के तहत चल रहा से उल्लेख किया है। यही कारण है कि आप अपनी सेवा द्वारा शुरू किए गए कार्यक्रम के यूआई को नहीं देख सकते हैं। इसके अलावा सेवाओं का उद्देश्य यूआई नहीं है, वे पृष्ठभूमि सेवा के रूप में कार्य करते हैं।

लेकिन यह भी ध्यान रखें कि एक सेवा द्वारा आवेदन शुरू करना एक उच्च सुरक्षा जोखिम हो सकता है, क्योंकि एप्लिकेशन आपकी सेवा की तुलना में समान विशेषाधिकारों के साथ चल रहा है। आम तौर पर यह स्थानीय सिस्टम खाता होगा।

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

3

यदि आप अपनी सेवा की संपत्ति विंडो खोलते हैं, तो लॉग ऑन टैब पर जाएं, फिर "डेस्कटॉप से ​​बातचीत करने की अनुमति दें" चेक बॉक्स को चेक करें, आपको वह व्यवहार मिलेगा जो आपको चाहिए। यह भी निर्भर करता है कि आप किस ऐप को चलाने के लिए हैं, आपको खाते पर लॉग बदलने की आवश्यकता हो सकती है।

+0

अफसोस की बात यह है कि यह केवल सेवा खाते के लिए काम करता है :( – Grzenio

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