Windows Update API c#代码无法获取更新历史记录

时间:2009-05-29 09:37:28

标签: c# .net windows hotfix

我正在编写代码,以便在企业内部网中使用安全修补程序自动修补Windows操作系统。 (我正在使用Visual Studio .NET,因此使用.NET Framework 1.1,并使用c#进行开发。)
作为第一步,我想列出已使用WUApi应用于系统的修补程序。我添加了对“tlbimped”wuapi.dll的引用,我还用regsvr32注册了原始的dll,windows更新服务似乎已经启动并在服务管理器中运行,但代码拒绝工作:它返回零作为应用修补程序的数量,即使在应用修补程序后,它也会在到达“QueryHistory”函数时抛出COMException。
代码如下:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Security;
using System.Security.Permissions;
using WUApiInterop;

namespace Hotfix_Scanner {
    public class Form1 : System.Windows.Forms.Form {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;

        private UpdateSession session;
        private UpdateSearcher searcher;
        private int count;
        private IUpdateHistoryEntryCollection history;

        private System.ComponentModel.Container components = null;

        public Form1() {
            InitializeComponent();
            SecurityPermission sp = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
            sp.Demand();

            PermissionSet fullTrust = new PermissionSet(PermissionState.Unrestricted);
            fullTrust.Demand();

            session = new UpdateSession();
            searcher = session.CreateUpdateSearcher();
            count = searcher.GetTotalHistoryCount();
            history = searcher.QueryHistory(0, (count - 1));
        }

        protected override void Dispose(bool disposing) {
            if(disposing) {
                if (components != null)  {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        private void InitializeComponent() {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();

            this.button1.Location = new System.Drawing.Point(216, 240);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "Scan";
            this.button1.Click += new System.EventHandler(this.button1_Click);

            this.textBox1.Dock = System.Windows.Forms.DockStyle.Top;
            this.textBox1.Location = new System.Drawing.Point(0, 0);
            this.textBox1.Multiline = true;
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(292, 232);
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "";

            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
        }

        [STAThread]
        static void Main()  {
            Application.Run(new Form1());
        }

        private void button1_Click(object sender, System.EventArgs e) {
            for (int i = 0; i < count; ++i) {
                textBox1.Text += history[i].Title + "\n";
            } // for loop
            return;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

请修改以下代码行 - 希望它能正常工作。

private void button1_Click(object sender, System.EventArgs e) {
  for (int i = 0; i < count - 1; ++i) {
    textBox1.Text += history[i].Title + "\n";
  } // for loop
  return;
}