.net - Windows Update API c # kode kan ikke få opdateringshistorik

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en kode til automatisk at patch Windows operativsystemer med sikkerheds hotfixes i et corporate intranet. (Jeg bruger mb. Visual Studio .NET, således .NET framework 1.1 og udvikler i c #.)

Som et første skridt vil jeg gerne liste de hotfixes, der allerede er anvendt på systemet ved hjælp af WUApi. Jeg har tilføjet referencen til 'tlbimped' wuapi.dll, jeg har også registreret den oprindelige dll med regsvr32, windows opdatering tjenesten ser ud til at være i gang i serviceadministratoren, men koden nægter at arbejde: den returnerer nul som antallet af anvendte hotfixes, selv lige efter at der er anvendt et hotfix, og det kaster en COMException ved at nå funktionen 'QueryHistory'. < br>
Koden er som følger:


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 + "
";
            } // for loop
            return;
        }
    }
}

Bedste reference


Venligst rediger nedenstående kodeord - håber det vil fungere.


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