Someone in the forum wanted to get the Description for each windows update, and WMI/the registry were no help. They were going to try to dig the information out of "C:\Windows\SoftwareDistribution\DataStore\DataStore.edb", which is undocumented. Some people say it is a Jet database, but I'm not sure. Exchange server uses that extension too.
Anyway the windows update api will do it. This pic shows the interfaces involved:
First you need to get an IUpdateSession. That has a CreateUpdateSearcher method to get an IUpdateSearcher. That has GetTotalHistoryCount to get the number of IUpdateHistoryEntry items inside the IUpdateHistoryCollection. To get the collection you call QueryHistory on the IUpdateSearcher, passing in the count from before. Each IUpdateHistoryEntry has a bunch of properties, some of which have custom types, but they are all simple to retrieve. To get your hands on the interfaces, the easiest way is to use tlbimp from the Visual studio command line (or the one with the platform sdk, or the one with the framework sdk). Copy the wuapi.dll file from .../Windows/System32 to some directory of your choice, navigate there and run...
tlbimp.exe wuapi.dll /out=WUApiInterop.dll
This creates managed signatures for all the COM interfaces in wuapi.dll and sticks them in WuApiInterop.dll. You can then create a windows forms project, add a reference to WuApiInterop.dll and get your paws on all the interfaces. I made a .Net dll that has a friendly version of the IUpdateHistoryEntry object, and a method to return a collection of them. This is the code that gets the information.
<SecurityPermission(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.UnmanagedCode)> _ Public Shared Function GetHistory() As ReadOnlyCollection(Of HistoryItem) Dim session As UpdateSession = Nothing Dim searcher As IUpdateSearcher = Nothing Try session = New UpdateSession If session Is Nothing Then Throw New InvalidOperationException("Couln't create an IUpdateSearcher.") searcher = session.CreateUpdateSearcher Finally If session IsNot Nothing Then Marshal.ReleaseComObject(session) End Try If searcher Is Nothing Then Throw New InvalidOperationException("Couldn't create an IUpdateSession.") Dim count As Integer = searcher.GetTotalHistoryCount If count = 0 Then Return New ReadOnlyCollection(Of HistoryItem)(Nothing) End If Dim historyCollection As IUpdateHistoryEntryCollection = Nothing Try historyCollection = searcher.QueryHistory(0, count) Finally Marshal.ReleaseComObject(searcher) End Try If historyCollection Is Nothing Then Throw New InvalidOperationException("Couldn't get an IUpdateHistoryEntryCollection.") Dim items As New List(Of HistoryItem)(count) Try For i As Integer = 0 To count - 1 Dim item As IUpdateHistoryEntry = historyCollection.Item(i) Dim friendlyItem As New HistoryItem With friendlyItem .ClientApplicationId = item.ClientApplicationID .Date = item.Date .Description = item.Description .HResult = item.HResult Select Case item.Operation Case WUApiInterop.UpdateOperation.uoInstallation .Operation = UpdateOperation.Installation Case WUApiInterop.UpdateOperation.uoUninstallation .Operation = UpdateOperation.Uninstallation End Select Select Case item.ResultCode Case WUApiInterop.OperationResultCode.orcAborted .ResultCode = OperationResultCode.Aborted Case WUApiInterop.OperationResultCode.orcFailed .ResultCode = OperationResultCode.Failed Case WUApiInterop.OperationResultCode.orcInProgress .ResultCode = OperationResultCode.InProgress Case WUApiInterop.OperationResultCode.orcNotStarted .ResultCode = OperationResultCode.NotStarted Case WUApiInterop.OperationResultCode.orcSucceeded .ResultCode = OperationResultCode.Succeeded Case WUApiInterop.OperationResultCode.orcSucceededWithErrors .ResultCode = OperationResultCode.SucceededWithErrors End Select Select Case item.ServerSelection Case WUApiInterop.ServerSelection.ssDefault .ServerSelection = ServerSelection.Default Case WUApiInterop.ServerSelection.ssManagedServer .ServerSelection = ServerSelection.ManagedServer Case WUApiInterop.ServerSelection.ssOthers .ServerSelection = ServerSelection.Others Case WUApiInterop.ServerSelection.ssWindowsUpdate .ServerSelection = ServerSelection.WindowsUpdate End Select .ServiceId = item.ServiceID Uri.TryCreate(item.SupportUrl, UriKind.Absolute, .SupportUrl) .Title = item.Title .UninstallationNotes = item.UninstallationNotes .UninstallationSteps = New System.Collections.Specialized.StringCollection For j As Integer = 0 To item.UninstallationSteps.Count - 1 .UninstallationSteps.Add(item.UninstallationSteps(j)) Next .UnmappedResultCode = item.UnmappedResultCode Dim identity As New UpdateIdentity(item.UpdateIdentity.RevisionNumber, item.UpdateIdentity.UpdateID) .UpdateIdentity = identity End With items.Add(friendlyItem) Next Finally Marshal.ReleaseComObject(historyCollection) End Try Return New ReadOnlyCollection(Of HistoryItem)(items) End Function
Attached is an example project:
I need some help in reading CID for SD card. Is there any way to read CID via USB?
ReplyDelete