3

私は特に Windows 2000/XP に興味がありますが、Vista/7 も (異なる場合) 興味があります。

私は、バッチファイルまたは同等のファイルを毎日スケジュールするタスクの行に沿って考えていました。

編集:申し訳ありませんが、もっと情報を提供する必要がありました。質問は、更新を手動で適用する 10 台のマシンに関するものです。更新プログラムをプログラムでインストールしたくありませんが、バッチまたはスクリプトを使用して、ダウンロード/インストールする準備ができている更新プログラムがあるかどうかを確認します (つまり、システム トレイの更新シールド アイコンがこれを示しています)。ありがとう。

4

6 に答える 6

4

使用できますWUApiLib

UpdateSessionClass session = new UpdateSessionClass();

IUpdateSearcher search = session.CreateUpdateSearcher();

ISearchResult result = search.Search("IsInstalled=0 and IsPresent=0 and Type='Software'");

int numberOfUpdates = result.Updates.Count - 1;

Log.Debug("Found " + numberOfUpdates.ToString() + " updates");

UpdateCollection updateCollection = new UpdateCollection();

for (int i = 0; i < numberOfUpdates; i++)
{
    IUpdate update = result.Updates[i];

    if (update.EulaAccepted == false)
    {
        update.AcceptEula();
    }

    updateCollection.Add(update);
}

if (numberOfUpdates > 0)
{
    UpdateCollection downloadCollection = new UpdateCollection();

    for (int i = 0; i < updateCollection.Count; i++)
    {
        downloadCollection.Add(updateCollection[i]);
    }

    UpdateDownloader downloader = session.CreateUpdateDownloader();

    downloader.Updates =  downloadCollection;

    IDownloadResult dlResult = downloader.Download();

    if (dlResult.ResultCode == OperationResultCode.orcSucceeded)
    {
        for (int i = 0; i < downloadCollection.Count; i++)
        {
            Log.Debug(string.Format("Downloaded {0} with a result of {1}", downloadCollection[i].Title, dlResult.GetUpdateResult(i).ResultCode));
        }

        UpdateCollection installCollection = new UpdateCollection();

        for (int i = 0; i < updateCollection.Count; i++)
        {
            if (downloadCollection[i].IsDownloaded)
            {
                installCollection.Add(downloadCollection[i]);
            }
        }

        UpdateInstaller installer = session.CreateUpdateInstaller() as UpdateInstaller;

        installer.Updates = installCollection;

        IInstallationResult iresult = installer.Install();

        if (iresult.ResultCode == OperationResultCode.orcSucceeded)
        {
            updated = installCollection.Count.ToString() + " updates installed";

            for (int i = 0; i < installCollection.Count; i++)
            {
                Log.Debug(string.Format("Installed {0} with a result of {1}", installCollection[i].Title, iresult.GetUpdateResult(i).ResultCode));
            }

            if (iresult.RebootRequired == true)
            {
                ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");

                foreach (ManagementObject shutdown in mcWin32.GetInstances())
                {
                    shutdown.Scope.Options.EnablePrivileges = true;
                    shutdown.InvokeMethod("Reboot", null);
                }
            }
        }
于 2009-05-13T12:43:08.280 に答える
1

Windows SUSは、ネットワーク上の複数のマシンで非常にうまく機能します。

于 2008-09-23T15:05:40.370 に答える
0

「最も簡単な」方法は、Windows Updateを毎晩実行するように設定し、利用可能な場合は更新をダウンロードして、更新シールドアイコンをシステムトレイに配置することです。トレイを一瞥して、アイコンが表示されているかどうかを確認してください。

また、Windowsをセットアップして、更新を毎晩チェックし、指定した時間にダウンロードしてインストールすることもできます。

于 2008-09-23T15:12:01.460 に答える
0

結局、Windows SUSはオプションではなかったので、 ActiveState ActivePerlと組み合わせてバッチ ファイルで以下を使用しています(推奨)。

perl -nle "print $_ if m/updates detected/i" < c:\Windows\WindowsUpdate.log

これは粗雑で汚れている可能性があり、将来壊れる可能性がありますが、現在必要なことは実行しています。

すべてのアイデアをありがとう。

于 2009-07-22T13:56:19.743 に答える
0

mdsindzeleta の発言に関しては、プログラムでこれを行うことはおそらく最善の解決策ではありません。Windows XP に組み込まれている機能を使用して、更新プログラムをダウンロードしてインストールします。Vistaにも同様の機能があると思います。

于 2008-09-23T15:14:20.630 に答える
0

Windows の更新プログラムは、BITS サービスを使用してダウンロードされると思います。Windows サポート ツールにある Bitsadmin.exe を使用できます。コマンド ラインから bitsadmin.exe /list を実行すると、BITS ジョブの状態を確認できます。(つまり、ダウンロードの進行状況、ジョブ名、ジョブ ステータス)

于 2009-05-13T02:59:24.867 に答える