2009-05-28 29 views
14

Có API nào để viết chương trình C# có thể giao tiếp với bản cập nhật Windows và sử dụng nó để cài đặt có chọn lọc các bản cập nhật nhất định không?Sử dụng C# để tương tác với Windows Update

Tôi đang nghĩ đâu đó dọc theo dòng của lưu trữ một danh sách trong một kho lưu trữ trung tâm của bản cập nhật đã được phê duyệt. Sau đó, các ứng dụng phía máy khách (sẽ phải được cài đặt một lần) sẽ giao tiếp với Windows Update để xác định những bản cập nhật nào có sẵn, sau đó cài đặt những bản cập nhật có trong danh sách được phê duyệt. Bằng cách đó, các bản cập nhật vẫn được áp dụng tự động từ góc nhìn phía máy khách, nhưng tôi có thể chọn các bản cập nhật nào đang được áp dụng.

Đây không phải là vai trò của tôi trong công ty bằng cách này, tôi đã thực sự chỉ tự hỏi nếu có một API cho các cửa sổ cập nhật và làm thế nào để sử dụng nó.

+0

Bạn chắc chắn đang tìm API đại lý cập nhật Windows: http://msdn.microsoft.com/en-us/library/aa387099.aspx –

+0

Đó là giao diện COM hướng tới C và C++, vì vậy trừ khi bạn muốn cho tôi một hướng dẫn về cách gọi API COM từ C#, nó không giúp tôi = (. Mặc dù, tôi sẽ là người đầu tiên thừa nhận rằng đây là một sự thất bại của kiến ​​thức của tôi, và không phải câu trả lời của bạn. – DevinB

+0

Tôi không biết bất kỳ API C# nào. Nhưng bạn có xem xét [Dịch vụ cập nhật Windows Server] (http://technet.microsoft.com/en-us/wsus/default.aspx) để giúp bạn quản lý Windows Update cho cấp doanh nghiệp không? –

Trả lời

19

Thêm một tham chiếu đến WUApiLib cho dự án # C của bạn.

using WUApiLib; 
protected override void OnLoad(EventArgs e){ 
    base.OnLoad(e); 
    UpdateSession uSession = new UpdateSession(); 
    IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher(); 
    uSearcher.Online = false; 
    try { 
     ISearchResult sResult = uSearcher.Search("IsInstalled=1 And IsHidden=0"); 
     textBox1.Text = "Found " + sResult.Updates.Count + " updates" + Environment.NewLine; 
     foreach (IUpdate update in sResult.Updates) { 
       textBox1.AppendText(update.Title + Environment.NewLine); 
     } 
    } 
    catch (Exception ex) { 
     Console.WriteLine("Something went wrong: " + ex.Message); 
    } 
} 

Cho bạn có biểu mẫu với Hộp văn bản, danh sách này sẽ cung cấp cho bạn danh sách các bản cập nhật hiện được cài đặt. Xem http://msdn.microsoft.com/en-us/library/aa387102(VS.85).aspx để biết thêm tài liệu.

di chúc này, tuy nhiên, không cho phép bạn tìm hotfixes KB mà không được phân phối thông qua Windows Update.

4

Cách dễ nhất để làm những gì bạn muốn được sử dụng WSUS. Nó hoàn toàn miễn phí và về cơ bản cho phép bạn thiết lập máy chủ cập nhật cửa sổ cục bộ của riêng mình, nơi bạn quyết định bản cập nhật nào được "phê duyệt" cho máy tính của mình. Cả máy chủ WSUS lẫn các máy khách đều không nằm trong một miền, mặc dù nó làm cho việc cấu hình máy khách dễ dàng hơn nếu chúng được. Nếu bạn có các bộ máy khác nhau cần các bộ cập nhật khác nhau được chấp thuận, điều đó cũng được hỗ trợ.

Không chỉ thực hiện mục tiêu đã nêu của bạn, nó cũng tiết kiệm băng thông mạng tổng thể của bạn bằng cách chỉ tải xuống các bản cập nhật một lần từ máy chủ WSUS.

3

Nếu trong ngữ cảnh của bạn, bạn được phép sử dụng Dịch vụ cập nhật Windows Server (WSUS), nó sẽ cấp cho bạn quyền truy cập vào Microsoft.UpdateServices.Administration Namespace.

Từ đó, bạn sẽ có thể làm một số những điều tốt đẹp :)

1

P-L đúng. Tôi đã thử phương pháp Christoph Grimmer-Die đầu tiên, và trong một số trường hợp, nó không hoạt động. Tôi đoán đó là do phiên bản khác nhau của kiến ​​trúc .net hoặc OS (32 hoặc 64 bit). Sau đó, để chắc chắn rằng chương trình của tôi có được luôn là Windows Update danh sách chờ của mỗi miền máy tính của tôi, tôi đã làm như sau:

  • Cài đặt một serveur với WSUS (có thể tiết kiệm một số băng thông internet): http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=5216
  • Thêm tất cả các máy trạm của bạn & máy chủ đến máy chủ WSUS của bạn

  • Nhận SimpleImpersonation Lib để chạy chương trình này với quyền admin khác nhau (không bắt buộc)

  • Chỉ cài đặt cấu phần bảng điều khiển quản trị trên máy trạm của bạn và chạy chương trình sau:

Nó sẽ in trong bàn điều khiển tất cả các cập nhật Windows với UpdateInstallationStates.Downloaded

using System; 
using Microsoft.UpdateServices.Administration; 
using SimpleImpersonation; 

namespace MAJSRS_CalendarChecker 
{ 
    class WSUS 
    { 
     public WSUS() 
     { 
      // I use impersonation to use other logon than mine. Remove the following "using" if not needed 
      using (Impersonation.LogonUser("mydomain.local", "admin_account_wsus", "Password", LogonType.Batch)) 
      { 
       ComputerTargetScope scope = new ComputerTargetScope(); 
       IUpdateServer server = AdminProxy.GetUpdateServer("wsus_server.mydomain.local", false, 80); 
       ComputerTargetCollection targets = server.GetComputerTargets(scope); 
       // Search 
       targets = server.SearchComputerTargets("any_server_name_or_ip"); 

       // To get only on server FindTarget method 
       IComputerTarget target = FindTarget(targets, "any_server_name_or_ip"); 
       Console.WriteLine(target.FullDomainName); 
       IUpdateSummary summary = target.GetUpdateInstallationSummary(); 
       UpdateScope _updateScope = new UpdateScope(); 
       // See in UpdateInstallationStates all other properties criteria 
       _updateScope.IncludedInstallationStates = UpdateInstallationStates.Downloaded; 
       UpdateInstallationInfoCollection updatesInfo = target.GetUpdateInstallationInfoPerUpdate(_updateScope); 

       int updateCount = updatesInfo.Count; 

       foreach (IUpdateInstallationInfo updateInfo in updatesInfo) 
       { 
        Console.WriteLine(updateInfo.GetUpdate().Title); 
       } 
      } 
     } 
     public IComputerTarget FindTarget(ComputerTargetCollection coll, string computername) 
     { 
      foreach (IComputerTarget target in coll) 
      { 
       if (target.FullDomainName.Contains(computername.ToLower())) 
        return target; 
      } 
      return null; 
     } 
    } 
} 
1

tôi đã viết một số dummycode cho điều này (một giao diện điều khiển ứng dụng đơn giản, mà sẽ cài đặt tất cả các bản cập nhật mà chúng tôi muốn dựa trên các thông số dòng lệnh, nó có thể được tìm thấy ở đây và chứa tất cả mọi thứ cần thiết để thực hiện cập nhật)

https://bitbucket.org/LilleCarl/c-windowsupdate

Những gì bạn cần nếu bạn muốn tự mình làm:

Add reference to C:\Windows\System32\wuapi.dll 
using WUApiLib; 

giao diện hữu ích:

UpdateSession 
UpdateCollection 
UpdateDownloader 
IUpdateInstaller 
IInstallationResult 
Các vấn đề liên quan