2009-05-29 15 views
1

J'écris un code pour corriger automatiquement les systèmes d'exploitation Windows avec des correctifs de sécurité dans un intranet d'entreprise. (J'utilise Visual Studio .NET, ainsi que .NET framework 1.1, et développe en C#.)
Dans un premier temps, je voudrais lister les correctifs déjà appliqués au système en utilisant le WUApi. J'ai ajouté la référence à la "tlbimped" wuapi.dll, j'ai également enregistré la DLL originale avec regsvr32, le service de mise à jour de Windows semble être opérationnel dans le gestionnaire de service, mais le code refuse de fonctionner: il renvoie zéro comme le nombre de correctifs appliqués, même après l'application d'un correctif, et il lance une exception COMException à atteindre la fonction "QueryHistory".
Le code est le suivant:Le code C# de l'API Windows Update ne peut pas obtenir l'historique des mises à jour

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

Répondre

1

S'il vous plaît modifier les lignes de code ci-dessous - espérons que cela fonctionnera.

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