2013-09-24 4 views
7

स्थानीय सर्वर से अपडेट डाउनलोड किए जा रहे हैं, न कि WUS या Microsoft Repositories से। स्थानीय सर्वर लिनक्स आधारित है जो होस्ट प्रत्येक अद्यतन के लिए सामग्री है।WUApiLib IUpdateInstaller2 त्रुटि उत्पन्न करता है; कुछ ओएस अपडेट दूसरों को HResult -2145124318

मैं UpdateDownloader उपयोग नहीं करते समय माइक्रोसॉफ्ट सर्वर से डाउनलोड करने के लिए, मैं स्वयं अद्यतन सामग्री डाउनलोड करने और उसके बाद CopyToCache का उपयोग करें।

इन स्थापित ठीक

Windows XP पर Microsoft .NET फ्रेमवर्क 3.5 एसपी 1, सर्वर 2003, विस्टा, सर्वर 2008 x86 के लिए

सुरक्षा अपडेट (KB2736416)

सुरक्षा अपडेट माइक्रोसॉफ्ट विजुअल स्टूडियो 2010 के लिए (KB2542054)

ये

से नहीं किया XP पर माइक्रोसॉफ्ट .NET फ्रेमवर्क 4, सर्वर 2003, विस्टा, विंडोज 7, 2008 86 (KB2840628) Windows XP पर Microsoft .NET फ्रेमवर्क 3.5 एसपी 1 के लिए

अद्यतन, सर्वर 2003, विस्टा और सर्वर के लिए curity अद्यतन 2008 x86 (KB2836940)

कैसे मेरी प्रक्रिया काम करता है

मैं जो मैं अद्यतन के लिए सभी डाउनलोड सामग्री डाउनलोड करने के लिए उपयोग करने के लिए एक स्थानीय सर्वर से एक स्थापित करने के लिए इस प्राप्त करते हैं।

{ 
    "app_uris": [ 
    { 
     "file_name": "msipatchregfix-x86_94a84b80b8b45a1ac53a0e5d085513da0f099655.exe", 
     "file_uri": "https://192.168.5.108/packages/d13c13c81f94fbb48f39c817a71ff239a31773d3a0e821a968dc42a913892841/msipatchregfix-x86_94a84b80b8b45a1ac53a0e5d085513da0f099655.exe", 
     "file_size": 130600 
    }, 
    { 
     "file_name": "ndp40-kb2840628-v2-x86_891d50ff3c1322db3fb0fde222ebb0aaa5260272.exe", 
     "file_uri": "https://192.168.5.108/packages/d13c13c81f94fbb48f39c817a71ff239a31773d3a0e821a968dc42a913892841/ndp40-kb2840628-v2-x86_891d50ff3c1322db3fb0fde222ebb0aaa5260272.exe", 
     "file_size": 13294216 
    } 
    ], 
    "app_id": "d13c13c81f94fbb48f39c817a71ff239a31773d3a0e821a968dc42a913892841", 
    "app_name": "Security Update for Microsoft .NET Framework 4 on XP, Server 2003, Vista, Windows 7, Server 2008 x86 (KB2840628)" 
} 
कि कहा के साथ

(KB2840628 ऊपर ब्लॉककोट पाठ के नीचे प्रदान की उदाहरण है), समस्या यह है कि कुछ अपडेट बिल्कुल ठीक स्थापित करते हैं, लेकिन कुछ अद्यतन (मैं जो कि एक से अधिक bundle-updates है विश्वास करते हैं) है डॉन ' टी के माध्यम से जाना, यह मुझे पागल गाड़ी चला रहा है!

मैं पहले प्रत्येक Uri डाउनलोड करता हूं और फिर उन्हें CopyToCache के साथ अद्यतन में लोड करता हूं। अगर मैं निष्पादन उस पर मैन्युअल रूप से डबल क्लिक करें और इसे मैन्युअल रूप से उपयोग किए बिना स्थापित

IUpdateSession Session = new UpdateSession(); 
var updatesToInstall = //THIS GETS THE RETURN FROM THE ABOVE CODE... 
var installer  = (IUpdateInstaller2)Session.CreateUpdateInstaller(); 

installer.ForceQuiet   = true; 
installer.AllowSourcePrompts = false; 
installer.Updates   = updatesToInstall; 

foreach (IUpdate updateNode in installer.Updates) 
{ 
    updateNode.AcceptEula(); 
} 

//FAILS HERE WITH "-2145124318, Result code: orcFailed", 
var installationRes = installer.Install(); 
var installResult = installationRes.GetUpdateResult(0); 

अद्यतन ठीक स्थापित करता है:

var collection = new UpdateCollection(); 
    IList<string> updateFiles = Directory.GetFiles(updateFolder); 
    var fileCollection = new StringCollection(); 

    try 
    { 
     foreach (var file in updateFiles) 
       fileCollection.Add(file); 

     //Error happens here on certain updates. Not all. 
     ((IUpdate2)update.BundledUpdates[0]).CopyToCache(fileCollection); 
     collection.Add(update); 
     return collection; 
    } 
    catch (Exception e) 
    { 
    return null; 
    } 

इसके बाद लौटे संग्रह मेरी WindowsUpdateInstaller विधि के माध्यम से पारित नीचे दिखाया गया है कोड।

+2

अपने कोड एक इंटरैक्टिव वातावरण में चल रहा है:

Dictionary<string, List<string>> 

पुनरावर्ती क्रिया पीछा कर रहा है? और आम तौर पर इन प्रकार की चीजें काफी विस्तृत लॉग छोड़ती हैं, जो केवल '-2145124318' रिटर्न कोड से अधिक होती हैं। इसके अलावा, एक त्वरित Google ने [यह] अर्जित किया (http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_update/windows-update-will-not-work-getting-error/500d9cbb-d394- 4f3b-ac32-88ad46414d2a) जो सुझाव दे सकता है कि अपडेट इंटरनेट से कनेक्ट नहीं हो सकते हैं? या तो बीआईटीएस, प्रॉक्सी सेटिंग्स या अन्यथा के कारण। –

+0

@ ta.speot.is http://paste.ofcode.org/tzXzURmFHvLRNpYFpiekFG मैंने इसे VS2010 में डीबग मोड में चलाने का परीक्षण किया। मैंने इसे एक्सपी, विंडोज 7 पर परीक्षण किया है। फ़ाइलों को 'IUpdate' पर 'CopyToCache' के माध्यम से धक्का दिया जा रहा है, मैं इसे' WUapi 'माइक्रोसॉफ्ट सर्वर से नहीं ले सकता। इसके अलावा, मेरे पास एयू अक्षम है। – Dayan

+0

वैसे असफल अद्यतन विंडोज डिफेंडर से संबंधित कुछ प्रतीत होता है। Http://support.microsoft.com/kb/918355 देखें, जो 0x80240022 को संदर्भित करता है। यह अद्यतन को स्थापित करने के लिए विधि 2 का उपयोग करने का प्रयास करता है जो मूल रूप से "यह सब बहुत कठिन है, इसे मैन्युअल रूप से इंस्टॉल करें"। त्रुटि का एक संदर्भ है [यहां पर] (http://www.hanselman.com/blog/WindowsDefenderErrors0x8024402c0x80240022And1609.aspx) लेकिन यह संभावना नहीं है कि निर्देश पुराने हैं ... –

उत्तर

2

ऐसा प्रतीत होता है कि WUApiIUpdate का खुलासा करता है जिसमें bundleUpdates के कई स्तर होते हैं। इससे पहले, मैं बस bundleUpdates के शीर्ष स्तर को पुनर्प्राप्त कर रहा था, जो ऐसा करके, अपडेट द्वारा आवश्यक अनुपलब्ध सामग्री के कारण कुछ अपडेट विफल हो गए; अधिकांश विंडोज अपडेट में 1 से अधिक स्तर के बंडल होते हैं।

उदाहरण के लिए, के लिए 1 अद्यतन (उर्फ IUpdate) संरचना की तरह इस पेड़ की कल्पना:

Update 1 
    ---> Bundle 1 
     *URL 1 
     *URL 2 
     ----> Bundle 1A 
       *URL 1 
       *URL 2 
       *URL 3 

    ---> Bundle 2 
     *URL 1 
     ----> Bundle 2A 
       *URL 1 
       *URL 2 
     ----> Bundle 2B 
       *URL 1 

    ----> Bundle 3 
     *URL 1 
      ----> Bundle 3A 
       *URL 1 
       *URL 2 

मेरे समाधान व्यक्तिगत रूप से प्रत्येक अद्यतन पार्स और का एक शब्दकोश में सभी यूआरआई रखने के लिए एक पुनरावर्ती क्रिया का निर्माण करना था कुंजी प्रकार "bundleName" और list of value एस जो उस विशेष बंडल के लिए सभी यूआरआई धारण करेगा।

की तरह तो:

private static Dictionary<string, List<string>> GetAllUpdates(IUpdate iUpdate) 
     { 
      var bundleDict = new Dictionary<string, List<string>>(); 

      foreach (IUpdate bundle in iUpdate.BundledUpdates) 
      { 
       foreach (IUpdateDownloadContent udc in bundle.DownloadContents) 
       { 
        var downloadContents = new List<string>(); 
        if (String.IsNullOrEmpty(udc.DownloadUrl)) 
         continue; 

        var url = udc.DownloadUrl; 
        downloadContents.Add(url); 

        if (!bundleDict.ContainsKey(bundle.Title)) 
         bundleDict.Add(bundle.Title, downloadContents); 
       } 

       if (bundle.BundledUpdates.Count > 0) 
       { 
        var valuesReturned = GetAllUpdates(bundle); 
        foreach (var data in valuesReturned) 
        { 
         if(!bundleDict.ContainsKey(data.Key))  
         bundleDict.Add(data.Key, data.Value); 
        } 

       } 
      } 

      return bundleDict; 
     } 
+0

आप बंडल की सूची के साथ क्या कर रहे थे खिताब और मूत्र? क्या आप प्रत्येक को डाउनलोड करने के लिए कुछ बुला रहे थे? –

+0

@inquisitor हाँ, यह पॉप्युलेट हो जाता है और स्थानीय सर्वर पर भेजा जाता है जो उन पैकेजों को डाउनलोड करेगा और उन्हें मेरे लिए रखेगा। एक बार जरूरी होने पर, मैं अद्यतन प्राप्त कर दूंगा और तदनुसार सभी बंडल अपडेट प्रदान करके इसे इंस्टॉल कर दूंगा। – Dayan

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