[Windows] Prüfen ob gerade Updates installiert werden

MeandXP

Ensign
Registriert
Juli 2009
Beiträge
171
Hallo zusammen,

Gibt es irgendeine Möglichkeit aus einem Programm heraus zu überprüfen ob gerade Updates installiert werden? Beispielsweise einen boolschen Registryeintrag oder Ähnliches?
Das Ziel wäre zum Beispiel auf Wunsch den Computer nach Fertigstellung der Updates herunterzufahren, oder aber verschiedene aktionen nicht auszuführen während Updates installiert werden.

Bin leider immer noch nicht fündig geworden... :mad:

mfg, MeandXP.
 
Zuletzt bearbeitet:
Wenn ich mich nicht irre, kannst du über die Gruppenrichtlinien steuern, dass der PC nach Installation der Updates automatisch herunterfährt. Dazu benötigst du auch keinen WSUS-Server im lokalen Netzwerk.
http://technet.microsoft.com/de-de/library/dd939830(v=ws.10).aspx

Eien Option, dass dies nur im Leerlauf oder dergleichen passierne soll, kenne ich leider nicht, sodass dein zweiter Wunsch erfüllt werden könnte.
 
mental.dIseASe schrieb:
Ich habe keine Ahnung, wie man sowas konkret umsetzt, aber google spuckte auf Umwegen ein isBusy-Property von irgendwas aus: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Klingt gut, nur leider ist das nicht einfach eine Funktion die man aus der wuapi.dll ansprechen könnte; habe also auch keine Ahnung wie man das implementiert :rolleyes:

Mir ist eingefallen, dass das doch auch irgendwo in den Tiefen der Ereignisprotokolle auftauche müsste; weiss jemand wie man das z.B. auf "update finished at mm:ss" filtert?

mfg, MeandXP.
 
Der Weg über das IUpdateInstaller COM Interface ist schon der richtige.

Ich hab mal ein kleines PowerShell Script geschrieben, dass dir ausgibt ob gerade ein Windows Update im Gange ist oder nicht:
Code:
$session = New-Object -ComObject 'Microsoft.Update.Session'
$installer = $session.CreateUpdateInstaller()
$installer.IsBusy

Alternativ kannst du auch alle COM Interfaces aus der wuapi.dll in eine Managed Library importieren lassen mit folgendem Befehl (in der Visual Studio Command Line): tlbimp.exe wuapi.dll /out=WindowsUpdateApi.dll

Diese Bibliothek kannst du dann in ein Projekt einbinden und ganz einfach nutzen, z.B. so (Beispiel in C#, klappt aber auch in jeder anderen .NET Sprache):
Code:
using System;
using WindowsUpdateApi;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            IUpdateSession session = new UpdateSession();
            IUpdateInstaller installer = session.CreateUpdateInstaller();

            Console.WriteLine(installer.IsBusy);            
        }
    }
}
 
Grantig schrieb:
Alternativ kannst du auch alle COM Interfaces aus der wuapi.dll in eine Managed Library importieren lassen mit folgendem Befehl (in der Visual Studio Command Line): tlbimp.exe wuapi.dll /out=WindowsUpdateApi.dll

Bin grade ziemlich baff ;) Ich arbeite nicht erst seit gestern mit .NET, aber von tlbimp.exe habe ich bisher noch nie gehört. Vielen Dank dafür ;)
 
Ist die entstehende / exportierte DLL nur mit .NET nutzbar? Oder hab ich das missverstanden?
 
@MeandXP
Jap nur in .NET nutzbar. Für nicht .NET Sprachen brauchst du die Wrapper .dll auch nicht.
Welche Sprache würdest du denn bevorzugen?

Hier ein Beispiel wie du die wuapi.dll in C++ nutzen kannst: klick


@holy
Bitte.
Ich kannte die tlbimp.exe bis gerade eben auch nicht, mich hat nur irgendwie das Thema interessiert, also bin ich dem Link von mental.dIseASe gefolgt und dann auf das gestoßen:
--> Searching, Downloading, and Installing Updates
--> How do I get a list of installed updates and hotfixes?

Daraus hab ich mir dann den Rest zusammengereimt :)
 
C++ wäre ok, oder durch ctypes in Python eingebunden.
Muss ich jetzt eine Klasse erstellen die dieses Interface IUpdateInstaller "implementiert"? Erbt diese Klasse dann die isBusy Property? :freak:
Jap, ich bin leider etwas verkalkt in dem Bereich... :rolleyes:

Edit:
Weise Recherchen haben mich hierhin geführt: IUpdateSession womit man einen IUpdateInstaller erstellen kann. Also hab ich mir gedacht:
Code:
#include<wuapi.h>
#include<iostream>

int main() {
    IUpdateSession* session; //wie im von Grantig verlinkten Quelltext
    installer* = session.CreateUpdateInstaller();
    std::cout<<installer.isBusy;
    //eher pseudo-code...

}
In Zeile 5 beschwert sich der Compiler jedoch:
`IUpdateSession' was not declared in this scope

Da ist noch so einiges im Argen :p

Edit: auch interessant dass Dev-C++ die wuapi.h zu finden scheint, obwohl andere IDEs sie nicht finden (und sie auch offensichtlich nicht auf meinem PC vorhanden ist). Bekommt man die Header nur über das Windows SDK? Das was mit so ausführlichen Fehlermeldungen die Installation abbricht? ...

mfg, MeandXP.
 
Zuletzt bearbeitet: (Header)
Klappt bei mir:
Code:
int _tmain(int argc, _TCHAR* argv[])
{
    IUpdateSession* session;
    IUpdateInstaller* installer;
    VARIANT_BOOL isBusy;
    HRESULT hr = CoInitialize(NULL);

    hr = CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateSession, (LPVOID*)&session);
    hr = session->CreateUpdateInstaller(&installer);
    hr = installer->get_IsBusy(&isBusy);

    cout << isBusy << endl;

    return 0;
}
 
Zurück
Oben