Код Windows Update API c # не может получить историю обновлений - PullRequest
1 голос
/ 29 мая 2009

Я пишу код для автоматического исправления операционных систем Windows с помощью исправлений безопасности в корпоративной интрасети. (Я использую Visual Studio .NET, таким образом .NET Framework 1.1, и разрабатываю на C #.)
В качестве первого шага я хотел бы перечислить исправления, уже примененные к системе с использованием WUApi. Я добавил ссылку на «tlbimped» wuapi.dll, я также зарегистрировал оригинальную dll с regsvr32, служба обновления Windows, кажется, работает и работает в диспетчере служб, но код отказывается работать: он возвращает ноль как число примененных исправлений, даже сразу после применения исправления, и оно вызывает исключение COMException при достижении функции «QueryHistory».
Код выглядит следующим образом:

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 Ответ

1 голос
/ 22 июня 2009

Пожалуйста, измените строки кода ниже - надеюсь, что это будет работать.

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