17

Windows Update と連携し、それを使用して特定の更新プログラムを選択的にインストールできる C# プログラムを作成するための API はありますか?

私は、承認された更新の中央リポジトリにリストを保存する方向に沿ってどこかで考えています。次に、クライアント側のアプリケーション (一度インストールする必要があります) が Windows Update と連携して利用可能な更新プログラムを判断し、承認済みリストにあるものをインストールします。そうすれば、更新はクライアント側の観点からは引き続き自動的に適用されますが、適用する更新を選択できます。

ちなみに、これは会社での私の役割ではありません。Windows Update 用の API とその使用方法があるかどうか、本当に疑問に思っていました。

4

4 に答える 4

24

WUApiLib への参照を C# プロジェクトに追加します。

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

TextBox を含むフォームがある場合、現在インストールされている更新プログラムのリストが表示されます。詳細なドキュメントについては、 http://msdn.microsoft.com/en-us/library/aa387102 (VS.85).aspx を参照してください。

ただし、これにより、Windows Update 経由で配布されていない KB ホットフィックスを見つけることができなくなります。

于 2011-09-07T10:48:39.377 に答える
4

必要なことを行う最も簡単な方法は、WSUSを使用することです。これは無料で、基本的に、自分のローカル Windows Update サーバーをセットアップして、自分のコンピューターで "承認" する更新プログラムを決定できます。WSUS サーバーもクライアントもドメイン内にある必要はありませんが、ドメイン内にあるとクライアントの構成が容易になります。さまざまな更新セットの承認が必要なさまざまなマシン セットがある場合、それもサポートされます。

これにより、指定した目標が達成されるだけでなく、WSUS サーバーから更新プログラムを 1 回ダウンロードするだけで、ネットワーク全体の帯域幅を節約できます。

于 2009-05-28T17:25:33.767 に答える
3

コンテキストで Windows Server Update Service ( WSUS ) の使用が許可されている場合、 Microsoft.UpdateServices.Administration Namespaceへのアクセスが許可されます。

そこから、いくつかの素晴らしいことができるはずです:)

于 2011-03-31T21:19:24.353 に答える
1

PLそうですね。最初にクリストフ・グリマー・ダイ法を試しましたが、うまくいかない場合もありました。.net または OS アーキテクチャ (32 ビットまたは 64 ビット) のバージョンが異なるためだと思います。次に、プログラムが常に各コンピューター ドメインの Windows Update 待機リストを取得するようにするために、次のことを行いました。

  • WSUS でサーバーをインストールします (インターネット帯域幅を節約できる場合があります) : http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=5216
  • すべてのワークステーションとサーバーを WSUS サーバーに追加します

  • SimpleImpersonation Lib を取得して、別の管理者権限でこのプログラムを実行します (オプション)

  • 開発ワークステーションに管理コンソール コンポーネントのみをインストールし、次のプログラムを実行します。

UpdateInstallationStates.Downloaded を使用してすべての Windows 更新プログラムをコンソールに出力します。

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;
        }
    }
}
于 2014-10-04T12:56:55.740 に答える