views:

1056

answers:

2

I'm writing a code to automatically patch Windows Operation Systems with security hotfixes in a corporate intranet. (I'm using Visual Studio .NET, thus .NET framework 1.1, and developing in c#.)
As a first step, I'd like to list the hotfixes already applied to the system using the WUApi. I've added the reference to the "tlbimped" wuapi.dll, I've also registered the original dll with regsvr32, windows update service seems to be up and running in the service manager, yet the code refuses to work: it returns zero as the number of applied hotfixes, even right after applying a hotfix, and it throws a COMException at reaching the "QueryHistory" function.
The code is as follows:

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;
        }
    }
}
A: 

Please modify below lines of code - hope it will work.

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;
}
Nabin
A: 

This works (changed button1 handler to code to "for (int i=0; i < count - 1; i++").

Good old off by 1 error due to 0 index ... good catch Nabin.

Also - to add the reference for "WUAPiInterop", follow these instructions - http://jo0ls-dotnet-stuff.blogspot.com/2009/02/vbnet-enumerate-windows-update-history.html