2010-02-09 14 views
13

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

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

हम ServiceInstall और ServiceControl का उपयोग कर रहे घटक है कि सेवा exe फ़ाइल रखती है अंदर। ServiceInstall सशर्त (REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE जैसी स्थिति का उपयोग करके) को निष्पादित करने का कोई तरीका है, इसलिए अपग्रेड करते समय सेवा अनइंस्टॉल नहीं की जाती है (बस बंद कर दिया गया है ताकि हम फ़ाइलों को अपग्रेड कर सकें)?

एक समाधान कस्टम कार्यों का उपयोग करना होगा, लेकिन शायद एक बेहतर तरीका है?

धन्यवाद!

उत्तर

11

ऐसा लगता है कि मैं गलत जगह पर देख रहा था। मेरी समस्या का समाधान NOT UPGRADINGPRODUCTCODE को DeleteServices मानक क्रिया में जोड़ना है।

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

अद्यतन: DeleteServices की स्थिति InstallExecuteSequence तत्व में वाईएक्स से पहुंच योग्य है।

+0

मुझे विश्वास नहीं है कि मैंने इस बारे में नहीं सोचा था। इसे शेयर करने के लिए बहुत धन्यवाद! – Adkins

+0

मिरॉन, क्या आप एक उदाहरण पोस्ट कर सकते हैं? मैं उन्नयन के बीच सेवा खाते को बचाने की कोशिश कर रहा हूं। –

+0

@MuriloLima क्षमा करें, यह कुछ साल पहले था। यह प्रश्न पिछले जीवन से है :) और मेरे पास अब उस स्रोत पेड़ तक पहुंच नहीं है। –

0

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

+1

ठीक है, समस्या यह है कि मुझे फ़ाइलों को प्रतिस्थापित करने की आवश्यकता है, लेकिन कॉन्फ़िगरेशन नहीं। अगर कॉन्फ़िगरेशन को संग्रहीत करने के तरीके पर मेरा नियंत्रण था, तो मैं उन फ़ाइलों पर NeverOverwrite और स्थायी का उपयोग करूंगा। लेकिन यहां समस्या यह है कि पासवर्ड एलएसए संग्रहीत है - इसलिए सर्विसइनस्टॉल को सशर्त बनाने की आवश्यकता है। –

0

मैंने प्रत्येक शर्त के लिए एक ही एक्सई के लिए 2 घटक बनाए। WIX_UPGRADE_DETECTED और WIX_UPGRADE_DETECTED के लिए एक नहीं। WIX_UPGRADE_DETECTED में, मैं सेवा स्थापना तत्व शामिल नहीं करता, और नहीं WIX_UPGRADE_DETECTED, सेवा स्थापना तत्व शामिल करें।

<DeleteServices><![CDATA[NOT UPGRADINGPRODUCTCODE]]></DeleteServices> 

InstallExecuteSequence टैग के तहत इस जोड़ें:

1

यह समाधान देखना चाहिए कि कैसे है।

नोट: सुनिश्चित करें कि मूल प्रथम संस्करण एमएसआई में यह टैग है या नहीं, आपको पूरी तरह से अनइंस्टॉल करना और इंस्टॉल करना होगा और केवल तभी यह कॉन्फ़िगरेशन अपग्रेड पर प्रभावी होगा।

टिप्पणी 2:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 
+0

"पुराने और नए एमएसआई के पास यह ब्लॉक होना चाहिए" संकेत एक महत्वपूर्ण है, क्योंकि अपग्रेड के दौरान पुराने को अनइंस्टॉल किया जाएगा और इस प्रकार पुराने ब्लॉक में इस ब्लॉक का मूल्यांकन किया जाएगा। – MHolzmayr

0

सेवा पर स्थिति का उपयोग करना मानक कार्यों पिछले एक सेवा स्केल नहीं करेगा: यदि आप CDATA टैग यह भी इस तरह दिख सकता उपयोग करने के लिए नहीं है।

इसके बारे में जाने का तरीका InstallFinalize से पहले RemoveExistingProducts शेड्यूल करना है। फिर सुनिश्चित करें कि आपके नए निर्माण में एक ही संस्करण के साथ एक सेवा EXE है जो इसे बदल रहा है। इस तरह विंडोज इंस्टालर उस घटक को अनइंस्टॉल/पुनर्स्थापित नहीं करेगा।

अंत में अपने कॉन्फ़िगरेशन डेटा को किसी अन्य घटक में डालें जो स्थापित हो जाएगा और डेटा को कॉन्फ़िगर करने के लिए आपकी सेवा को कोड कर दिया गया है और आवश्यकता होने पर इसे पुनः लोड करें।

व्यक्तिगत रूप से मैं ऐसा नहीं करता हूं। मैं रोकता हूं, पुनर्स्थापित करता हूं, हर समय किसी भी भयानक परिणाम के साथ सेवाओं को शुरू करता हूं, फिर इंस्टॉल को कुछ सेकंड लगते हैं।

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