2013-09-24 39 views
7

Các bản cập nhật đang được tải xuống từ máy chủ cục bộ chứ không phải từ WUS hoặc Microsoft Repositories. Máy chủ cục bộ là Linux dựa trên nội dung của máy chủ lưu trữ cho mỗi lần cập nhật.WUApiLib IUpdateInstaller2 mang lại lỗi; Một số cập nhật hệ điều hành cài đặt những người khác ném HResult -2145124318

Tôi không sử dụng UpdateDownloader để tải xuống từ Máy chủ Microsoft, tôi tải xuống nội dung cập nhật theo cách thủ công và sau đó sử dụng CopyToCache.

Những cài đặt tốt

Security Update cho Microsoft .NET Framework 3.5 SP1 trên Windows XP, Server 2003, Vista, Server 2008 x86 (KB2736416)

Security Update cho Microsoft Visual Studio 2010 (KB2542054)

Những Chẳng phải

Se curity Update for Microsoft .NET Framework 4 trên XP, Server 2003, Vista, Windows 7, Server 2008 x86 (KB2840628)

Update for Microsoft .NET Framework 3.5 SP1 trên Windows XP, Server 2003, Vista và Server 2008 x86 (KB2836940)

Làm thế nào quá trình tôi làm việc

tôi nhận được cho một cài đặt từ một máy chủ địa phương mà tôi sử dụng để tải về tất cả các nội dung tải về cho bản cập nhật. (Văn bản blockquote trên KB2840628 là ví dụ dưới đây)

{ 
    "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)" 
} 

Với nói rằng, vấn đề là một số cập nhật cài đặt hoàn toàn tốt đẹp, nhưng thông tin cập nhật nhất định (Tôi tin rằng những người mà có nhiều hơn một bundle-updates) don' t đi qua, lái xe của tôi tôi điên!

Lần đầu tiên tôi tải xuống mỗi Uri và sau đó tải chúng vào bản cập nhật với CopyToCache.

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; 
    } 

Sau này, bộ sưu tập trở lại được truyền thông qua phương pháp WindowsUpdateInstaller tôi trình bày dưới đây:

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); 

Bản cập nhật cài đặt tốt nếu tôi nhấp chuột bằng tay đúp vào thực thi nó và cài đặt nó bằng tay mà không sử dụng mã.

+2

là mã của bạn đang chạy trong một môi trường tương tác? Và thường những thứ này để lại các bản ghi khá chi tiết, nhiều hơn chỉ là một mã trả về '-2145124318'. Ngoài ra, Google nhanh chóng mang lại [this] (http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_update/windows-update-will-not-work-getting-error/500d9cbb-d394- 4f3b-ac32-88ad46414d2a) có thể đề xuất các bản cập nhật không thể kết nối với internet? Hoặc vì BITS, cài đặt proxy hoặc cách khác. –

+0

@ ta.speot.is http://paste.ofcode.org/tzXzURmFHvLRNpYFpiekFG Tôi đã thử chạy nó trong chế độ gỡ lỗi trong VS2010. Tôi đã thử nghiệm nó trên XP, Windows 7. Các tập tin đang được đẩy đến 'IUpdate' thông qua' CopyToCache', tôi không thể có 'WUapi' lấy nó từ máy chủ của Microsoft. Ngoài ra, tôi có AU Disabled. – Dayan

+0

Vâng, bản cập nhật không thành công có vẻ liên quan đến Windows Defender. Xem http://support.microsoft.com/kb/918355, đề cập đến 0x80240022. Nó nói để thử sử dụng phương pháp 2 để cài đặt bản cập nhật mà về cơ bản là "nó quá khó, cài đặt nó bằng tay". Có một tham chiếu đến lỗi [ở đây] (http://www.hanselman.com/blog/WindowsDefenderErrors0x8024402c0x80240022And1609.aspx) nhưng không chắc rằng các hướng dẫn đã lỗi thời ... –

Trả lời

2

Dường như WUApi hiển thị IUpdate chứa nhiều cấp độ bundleUpdates. Trước đây, tôi chỉ đơn giản là lấy mức cao nhất của bundleUpdates mà bằng cách làm như vậy, thực hiện cập nhật nhất định không thành công do thiếu nội dung theo yêu cầu của bản cập nhật; hầu hết các cửa sổ cập nhật có nhiều hơn 1 cấp độ bó.

Ví dụ, hãy tưởng tượng cái cây này như cấu trúc trong vòng 1 Cập nhật (aka 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 

Giải pháp của tôi là tạo ra một hàm đệ quy để phân tích mỗi lần cập nhật cá nhân và giữ tất cả các URI trong một cuốn từ điển của loại khóa "bundleName" và list of value s sẽ giữ tất cả URI cho gói cụ thể đó.

như vậy:

Dictionary<string, List<string>> 

Chức năng đệ quy như sau:

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

bạn đang làm gì với danh sách gói tiêu đề và uris? Bạn đang gọi một cái gì đó để tải về mỗi một? –

+0

@inquisitor yeah, nó được phổ biến và được gửi đến một máy chủ cục bộ sẽ tải xuống các gói đó và giữ chúng cho tôi. Khi cần thiết, tôi sẽ lấy lại bản cập nhật và cài đặt nó bằng cách cung cấp tất cả các bản cập nhật cho phù hợp. – Dayan