2012-02-03 12 views
5

मैं इस निम्नलिखित सरल सेवा कार्यक्रम है:'स्थानीय सिस्टम' सेवा वाले डोमेन उपयोगकर्ता के रूप में एक अलग प्रक्रिया कैसे चलाएं?

using System.Diagnostics; 
using System.ServiceProcess; 

namespace BasicService 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      ProcessStartInfo processStartInfo = new ProcessStartInfo 
                { 
                 Verb = "runas", 
                 UserName = "jdoe", 
                 Password = "XXXXXXX".ConvertToSecureString(), 
                 Domain = "abc.com", 
                 UseShellExecute =false, 
                 FileName = "notepad.exe" 
                }; 
      Process.Start(processStartInfo); 
     } 

     protected override void OnStop() 
     { 
     } 
    } 
} 

और मैं मेरी सेवा संस्थापक के रूप में इस का उपयोग कर रहा:

using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace BasicService 
{ 
    [RunInstaller(true)] 
    public class ProjectInstaller : Installer 
    { 
     private readonly ServiceProcessInstaller _process; 
     private readonly ServiceInstaller _service; 

     public ProjectInstaller() 
     { 
      _process = new ServiceProcessInstaller {Account = ServiceAccount.LocalSystem}; 
      _service = new ServiceInstaller 
          { 
           ServiceName = "BasicService", 
           Description = "Just a testing service.", 
           StartType = ServiceStartMode.Automatic, 
          }; 

      Installers.Add(_process); 
      Installers.Add(_service); 
     } 
    } 
} 

अगर मैं एक क्रिया, उपयोगकर्ता नाम, पासवर्ड, डोमेन के बिना इस सेवा चलाने के लिए और utilhellexecute निर्दिष्ट, सब कुछ सिर्फ बेवकूफ चलाता है। जैसे ही मैं ऊपर दिए गए मानों को निर्दिष्ट करता हूं, मुझे निम्न मिलता है:

सेवा शुरू नहीं की जा सकती है। System.ComponentModel.Win32Exception (0x80004005): पहुँच System.Diagnostics.Process.Start (ProcessStartInfo startInfo) पर System.Diagnostics.Process.Start() पर System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) पर इनकार किया है \ BasicService \ BasicService \ Service1.cs: BasicService.Service1.OnStart सी में (String [] args) पर लाइन 24 System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback (वस्तु राज्य) में

कोई भी विचार ?

उत्तर

2

विंडोज विस्टा के बाद, सेवाएं केवल यूईई प्रदर्शित नहीं कर सकती हैं या उपयोगकर्ता के साथ बातचीत नहीं कर सकती हैं।
http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx

इस प्रकार, आपकी सेवा से एक जीयूआई अनुप्रयोग चलाने के लिए, आप CreateProcessAsUser, जो .NET में सीधे उपलब्ध नहीं होता का उपयोग करना होगा। तो तुम, PInvoke पर भरोसा करने की कुछ इसी तरह के रूप में यह यहाँ वर्णित है

http://blogs.msdn.com/b/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx

+0

क्या आपको यकीन है होगा? सेवा अब उपयोगकर्ता के साथ किसी सेवा खाते से बातचीत नहीं कर सकती है, लेकिन मुझे नहीं पता कि विंडोज कैसे जान सकता है कि 'notepad.exe' इंटरैक्टिव है जब तक कि यह वास्तव में इसे चलाता नहीं है। इस मामले में, प्रक्रिया शुरू करनी होगी। –

+1

@ ta.speot.is - हाँ, मुझे दृढ़ विश्वास है कि CreateProcessAsUser सेवा से उपयोगकर्ता दृश्यमान जीयूआई ऐप्स बनाने का सही तरीका है। उपरोक्त "एक्सेस अस्वीकृत" का क्या कारण है, मुझे यकीन नहीं है, लेकिन कॉल स्टैक से आप देखते हैं कि विंडोज वास्तव में इसे चलाता है। विंडोज कैसे जानता है ... शायद '/ सबस्टेस्टेम' वीएस स्विच द्वारा सेट एंट्री-पॉइंट सिंबल का निरीक्षण करके। – user1234883

+1

AFAIK यह एकमात्र तरीका था जिसे मैं करने में सक्षम था। इसे ठीक से काम करने के लिए मुझे CreateProcessAsUser और LogonUser को गठबंधन करना पड़ा। – ymerej

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

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