2013-04-24 9 views
13

में विंडोज सेवाओं को स्थापित करने और शुरू करने में विफल रहा है मैं वाईएक्स v3.8 का उपयोग कर विंडोज सेवाओं को स्थापित करने और शुरू करने के लिए एक एमएसआई पैकेज बना रहा हूं। कोड इस प्रकार है:वाईएक्स इंस्टॉलर

<Component Id="INSTALLAPSSERVICE" Guid="991D5F82-0E77-4FE3-B1D8-4C941B84C7CD" Win64="yes"> 
    <File Id="ApsService.exe" 
     Name="ApsService.exe" 
     Source="Resource\ApsService.exe" 
     KeyPath="yes" 
     Vital="yes" 
     DiskId="1"></File> 
    <ServiceInstall Id="ApsServiceInstaller" 
        Name="ApsService" 
        DisplayName="ApsService" 
        Type="ownProcess" 
        Start="auto" 
        ErrorControl="normal" 
        Description="A monitor service for windows application." 
        Account="[SERVICEACCOUNT]" 
        Password="[SERVICEPASSWORD]" 
        Vital="yes" 
        Interactive="no"></ServiceInstall> 
    <ServiceControl Id="StartService" 
        Start="install" 
        Stop="both" 
        Remove="uninstall" 
        Name="ApsService" 
        Wait="yes"/> 
</Component> 

लेकिन स्थापित लॉग में निम्न त्रुटियों के साथ विफल:

Executing op: ServiceControl(,Name=ApsService,Action=1,Wait=1,) 
StartServices: Service: ApsService 
Error 1920. Service 'ApsService' (ApsService) failed to start. Verify that you have  sufficient privileges to start system services. 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3676 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1888 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1764 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3504 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 2100 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 2752 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3672 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3876 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1400 could not be cancelled. Error: 1168 
MSI (s) (F0:C0) [15:57:28:630]: Product: WinApsSetup64 -- Error 1920. Service 'ApsService' (ApsService) failed to start. Verify that you have sufficient privileges to start system services. 

मैं त्रुटियाँ कैसे ठीक कर सकते हैं?

उत्तर

12

आपको जो त्रुटि संदेश मिल रहा है वह सामान्य संदेश है जब Windows इंस्टालर भेजता है जब यह इंस्टॉल के दौरान सेवा शुरू करने में विफल रहता है। लगभग हमेशा मुद्दा यह है कि सेवा एक निर्भरता खो रही है या अन्यथा प्रारंभ होने पर पूरी तरह से कॉन्फ़िगर नहीं किया गया है। रूट समस्या को डीबग करने का प्रयास करें:

  1. एमएसआई पैकेज स्थापित करें।
  2. जब त्रुटि संवाद संकेत मिलता है कि सेवा शुरू करने में विफलता है * संवाद को खारिज न करें।
  3. सेवा शुरू करें। एमएससी या अपनी सेवा शुरू करने के प्रयास के लिए कमांड लाइन से sc.exe का उपयोग करें। विंडोज इंस्टालर को ग़लत डीबग करने में सक्षम होने के लिए पर्याप्त सेवा कॉन्फ़िगर करनी चाहिए, यह विफल क्यों हुआ।
  4. यदि आवश्यक हो तो यह देखने के लिए कि यह क्यों शुरू नहीं किया जा सकता है, आपकी सेवा निष्पादन योग्य में आवश्यक डीबग करें।

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

शुभकामनाएं आपकी सेवा डीबगिंग!

+1

हाय रोब, जबकि सवाल डमी लग सकता है, लेकिन मुझे कैसे पता चलेगा कि मेरा निष्पादन योग्य जीएसी में कुछ फाइल पर निर्भर करता है? – Pant

+0

यह मेरे साथ काम करता है, धन्यवाद – jovenb

6

ServiceInstall खाता ओपी के उदाहरण में समझ से परे है, लेकिन अगर एक पूरी तरह से खाते अर्हता प्राप्त करने के भूल जाता है तो यह त्रुटि भी हो सकता है, जैसे:

<ServiceInstall ... Account="NT AUTHORITY\LocalService" />

आपका संस्थापक यदि आप केवल उपयोगकर्ता नाम निर्दिष्ट असफल हो जायेगी (w/NT प्राधिकरण ओ) इस तरह:

<ServiceInstall ... Account="LocalService" />

+0

इस उत्तर से संबंधित: यदि आप [SERVICEACCOUNT] के लिए स्थानीय खाते का उपयोग करते हैं, तो सुनिश्चित करें कि आप कंप्यूटर का नाम शामिल करते हैं, न केवल खाता नाम। जैसे MySERVER \ UserX काम करेगा, जबकि केवल UserX काम नहीं करेगा। और, ज़ाहिर है, आपको डोमेन नाम निर्दिष्ट करने की आवश्यकता है यह एक डोमेन खाता है। –

4

"एक सेवा के रूप में लॉग ऑन करें", जोड़ने के लिए करने के लिए [SERVICEACCOUNT] अधिकार याद रखें

0,123,

अपने स्थानीय कंप्यूटर पर एक खाते के लिए "सेवा के रूप में लॉग ऑन" जोड़ने के लिए

1) स्थानीय सुरक्षा नीति खोलें।

2) कंसोल ट्री में, डबल-क्लिक करें स्थानीय नीतियाँ, और उसके बाद उपयोगकर्ता अधिकार असाइनमेंट

3) विवरण फलक में, पर डबल-क्लिक करें सेवा के रूप में लॉग ऑन करें।

4) उपयोगकर्ता या समूह जोड़ें, और फिर उन खातों के पर अधिकारी लॉग एक सेवा अधिकार के रूप में की सूची में उचित खाते में जोड़ने पर क्लिक करें।

से: http://technet.microsoft.com/en-us/library/cc739424%28v=ws.10%29.aspx

0

सेवा स्टार्टअप समस्या को डीबग करते समय, मैं हमेशा एक सरल() कथन का उपयोग करता हूं जो स्थापना निर्देशिका में किसी विशेष फ़ाइल के अस्तित्व की जांच करता है। जब सेवा विफल हो जाती है, तो मैं एक कमांड प्रॉम्प्ट खोलता हूं (विफलता को इंगित करने वाले संवाद को खारिज करने से पहले) और उस फ़ाइल को बनाने के लिए "echo> thatfile" का उपयोग करें जिसे मैं() में ढूंढ रहा हूं। If() का उद्देश्य डीबगर है। लॉन्च() आमंत्रण।

अब, मैं संवाद को खारिज कर सकता हूं और इंस्टॉलर को फिर से चालू कर सकता हूं और इस बार यह डीबगर शुरू कर देगा और मैं देख सकता हूं कि क्या होता है। मैं डिबगर लॉन्च करने के पल के रूप में स्थिर वर्ग init का उपयोग करता हूं, लेकिन आप इसे "ऑनस्टार्ट()" में करने का प्रयास कर सकते हैं, लेकिन यदि लोडिंग/बाध्यकारी समस्याएं हैं, तो संभवतः आप उस बिंदु पर नहीं पहुंच पाएंगे । जबकि स्थिर वर्ग init के दौरान ऐसा करने से आप हमेशा उन चीजों को बताएंगे जिन्हें आपको निर्भरताओं के रूप में संबोधित करने की आवश्यकता है।

0

तो मुझे आज यह त्रुटि मिली क्योंकि मेरी सेवा पर निर्भरताएं थीं जिन्हें सेवा शुरू करने से पहले जीएसी किया जाना था। जैसा कि यह पता चला है, निर्भरता आखिरी बार इंस्टॉलर द्वारा जीएसीड की जाती है, और बिना किसी बूटस्ट्रैपर/मल्टीपार्ट इंस्टॉलर के निर्माण के बिना इसे पाने का कोई अच्छा तरीका नहीं है।

हालांकि, मुझे निम्न रिज़ॉल्यूशन मिला: दोनों को जीएसी में असेंबली तैनात करें और उन्हें सेवा के समान निर्देशिका में इंस्टॉल करें। इस तरह, सेवा प्रोग्राम फाइल निर्देशिका में शुरू होने पर डीएलएल को खोजने में सक्षम होगी, और वे जीएसीएड होंगे (जो अन्य कारणों की आवश्यकता थी)।

ऐसा करने के लिए, मैं दो अलग घटक समूह बनाने के लिए किया था, और एक "डमी" निर्देशिका:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id="INSTALLDIR" Name="NameOfProgram" /> 
    <Directory Id="GacDlls" Name="libs" /> 
    </Directory> 
</Directory> 

मैं तो दो घटक समूह बनाएं: exe और सभी पुस्तकालयों है कि एक, और एक दूसरे विधानसभा विशेषता के साथ समान पुस्तकालयों के साथ ".net" पर सेट किया गया:

<ComponentGroup Id="ServiceLibs" Directory="GACDlls"> 
    <Component Id="log4netGAC" 
        Guid="a23099ac-5880-4b6e-af3f-fa7cef113226"> 
     <File Id="log4net.dllGAC" 
       Name="log4net.dll" 
       Source="..\ProjectDir\bin\$(var.Configuration)\log4net.dll" 
       KeyPath="yes" 
       Vital="yes" 
       DiskId="1" 
       Assembly=".net" 
      /> 
    </Component> 
</ComponentGroup> 

<ComponentGroup Id="ProductComponents" Directory="INSTALLDIR"> 
    <Component Id="log4net" 
       Guid="463e05db-e248-44d7-bbde-467358b7310f"> 
     <!-- normally we'd want to GAC this (Assembly=".net"), but that would prevent us from starting the service up during install so we'll just drop it in the program folder --> 
     <File Id="log4net.dll" 
       Name="log4net.dll" 
       Source="..\ProjectName\bin\$(var.Configuration)\log4net.dll" 
       KeyPath="yes" 
       Vital="yes" 
       DiskId="1"      
      />    
    </Component> 
    ... other components ... 
</ComponentGroup> 

और अब यह काम करता है!

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