The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,835 other subscribers

Archive for the ‘Software Development’ Category

PowerShell: get WindowsUpdate information

Posted by jpluimers on 2019/07/11

A while back, I needed to check Windows Update information on a few hosts, so I wanted to script it. Below are a few links that helped me solve this started.

Note: For Windows Update, you need the TiWorker.exe process, which can consume a lot of CPU. See DISM fix for Windows 8.1 high CPU usage of TiWorker.exe which is basically the same for all Windows versions since 8.0.

The infrastructure management on that site was ehm, a bit lacking, so PowerShell modules were out, heck even PowerShell itself was initially problematic (it needed running of unsigned sources.

A few notes on the above links.

Using Microsoft.Update.AutoUpdate

This gets the last date that anything was done (query, actual update, download) on Windows Updates, but does not guarantee the installation date; on some systems it does not even return a result:

$windowsUpdateObject = New-Object -ComObject Microsoft.Update.AutoUpdate
$windowsUpdateObject.Results

This one works better though:

$windowsUpdateObject = New-Object -ComObject Microsoft.Update.AutoUpdate
$windowsUpdateObject.Results.LastInstallationSuccessDate

Based on that, you can get the number of days like this:

(New-TimeSpan -Start $windowsUpdateObject.Results.LastInstallationSuccessDate.Date -End (Get-Date)).Days

Using Get-HotFix

Though some people report that InstalledOn can be empty, I’ve hardly that happen with Get-HotFix. The easiest way to get around that is filtering with | Where-Object InstalledOn -ne $null

The cool thing with Get-HotFix is that you can filter on the kind of security update, so this gets the moment the last security update got installed:

(Get-HotFix -Description "Security Update" | Where-Object InstalledOn -ne $null | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn

And this the number of days since the last security update got installed:

(New-TimeSpan -Start (Get-HotFix -Description "Security Update" | Where-Object InstalledOn -ne $null | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn -End (Get-Date)).Days

Step by step:

Get-HotFix -Description "Security Update"

Gets all the security updates.

| Where-Object InstalledOn -ne $null

Filter out entries having an empty InstalledOn.

Sort-Object InstalledOn -Descending

Get the most recent on the top.

| Select-Object -First 1

Select only the top entry.

(Get-HotFix -Description "Security Update"...).InstalledOn

Get only the InstalledOn property.

Get-Date

Get the current timestamp consisting of date and time.

New-TimeSpan -Start (...).InstalledOn -End (Get-Date)

Get a TimeSpan over a start and end timestamp.

(New-TimeSpan ...).Days

Get the Days property of a TimeSpan.

You can do the same for regular updates by changing the -Description parameter:

(Get-HotFix -Description "Update" | Where-Object InstalledOn -ne $null | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn
(New-TimeSpan -Start (Get-HotFix -Description "Update" | Where-Object InstalledOn -ne $null | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn -End (Get-Date)).Days

The Description values I found are these:

PS C:\Users\Developer> Get-HotFix | Sort-Object -Unique Description | Select-Object Description

Description
-----------
Hotfix
Security Update
Update

Ironically, since the command is called Get-HotFix, the Hotfix entries on my various Windows systems have been a  long long time ago:

(New-TimeSpan -Start (Get-HotFix -Description "Hotfix" | Where-Object InstalledOn -ne $null | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn -End (Get-Date)).Days

When writing this in 2017, on Windows 8.1, this was more than 600 days, Windows 7 more than 400 days and Windows 10 did not have any Hotfix entries.

Old PowerShell versions

On PowerShell 2 and older, you get an error containing “Where-Object : Cannot bind parameter ‘FilterScript'”:

Where-Object : Cannot bind parameter 'FilterScript'. Cannot convert the "InstalledOn" value of type "System.String" to type "System.Management.Automation.ScriptBlock".
At line:1 char:48
+ (New-TimeSpan -Start (Get-HotFix | Where-Object <<<< InstalledOn -ne $null | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn -End (Get-Date)).Days
+ CategoryInfo : InvalidArgument: (:) [Where-Object], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.WhereObjectCommand

You solve it like this:

(New-TimeSpan -Start (Get-HotFix | Where-Object { $_.InstalledOn -ne $null } | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn -End (Get-Date)).Days

By now code has become almost unreadable, so you can split it using backtick ` characters:

( `
New-TimeSpan -Start `
  ( `
    Get-HotFix | Where-Object { $_.InstalledOn -ne $null } `
    | Sort-Object InstalledOn -Descending `
    | Select-Object -First 1 `
  ).InstalledOn `
  -End (Get-Date)`
).Days

One more thing

On non-English Windows systems, the InstalledOn might actually be in the future, as you can view this happening by this simple command which I ran on 2017-11-02 :

Get-HotFix | Out-GridView

You solve it by adding a filter:

Get-HotFix | Where-Object InstalledOn -lt (Get-Date) | Out-GridView

If you run them from a script (like a batch file Get-HotFix ^| Out-GridView or ps1 file Get-HotFix | Out-GridView), then the grid-view will pop-up and immediately close because the PowerShell process ends. In that case, you need to change your scripts to add the -Wait parameter:

PowerShell Get-HotFix ^| Out-GridView -Wait

Powershell.exe -Command "Get-HotFix | Out-GridView -Wait"

Get-HotFix | Out-GridView -Wait

See:

In C#

If I ever want to do the same from C#, I need to figure out where to get the WUApiLib from; more on that library is at [WayBack] Use C# to interact with Windows Update – Stack Overflow and [WayBack] Searching, Downloading, and Installing Updates (Windows).

–jeroen

Posted in Development, Power User, PowerShell, Scripting, Software Development, Windows | Leave a Comment »

XKCD – Making Progress: lots of problems

Posted by jpluimers on 2019/07/10

I think the alt-text is even better than the cartoon itself:

I started off with countless problems. But now I know, thanks to COUNT(), that I have “#REF! ERROR: Circular dependency detected” problems.

Source: [WayBackXKCD 1906: I started the day with lots of problems. But now, after hours and hours of work, I have lots of problems in a spreadsheet.

–jeroen

Read the rest of this entry »

Posted in Agile, Development, Fun, Quotes, Software Development | Leave a Comment »

PowerShell “Set-ExecutionPolicy” via the registry

Posted by jpluimers on 2019/07/10

I wrote about the PowerShell Set-ExecutionPolicy a few times before (links are below).

After writing those, I found out there is another value ByPass and that there are ways to perform this in the Registry not just for the local machine, but also for a user. In retrospect, that last observation is a bit obvious, but it can be really convenient if you want to change it for a different user than yourself.

For the machine and current user, these are the registry paths where Set-ExecutionPolicy will set the value of ExecutionPolicy to the desired enumeration string:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

The trick is that you can set this for any user if you have their SID, which – for many known entities – you can get from [MS-DTYP]: Well-Known SID Structures via The mother lode of well-known SIDs – The Old New Thing.

So for instance, below are the users, keys and statements for the users under which most services run, so after executing the one for your target service, it can run PowerShell scripts:

  • LOCAL_SYSTEM : HKEY_USERS\S-1-5-18\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
  • LOCAL_SERVICE : HKEY_USERS\S-1-5-19\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
  • NETWORK_SERVICE : HKEY_USERS\S-1-5-20\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

A command to set the value of ExecutionPolicy there to RemoteSigned is this:

::LOCAL_SYSTEM
reg add "HKEY_USERS\S-1-5-18\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /v "ExecutionPolicy" /t REG_SZ /d "RemoteSigned" /f

::LOCAL_SERVICE
reg add "HKEY_USERS\S-1-5-19\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /v "ExecutionPolicy" /t REG_SZ /d "RemoteSigned" /f

::NETWORK_SERVICE
reg add "HKEY_USERS\S-1-5-20\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /v "ExecutionPolicy" /t REG_SZ /d "RemoteSigned" /f

Related:

–jeroen

Posted in Development, PowerShell, Scripting, Software Development | Leave a Comment »

Thread around DCEF3 leaking memory, but DCEF4 doesn’t taught me to look at madExcept for memory leak checking too

Posted by jpluimers on 2019/07/09

This thread about [WayBack] DCEF3 memory leak in Delphi XE2  – Alberto Paganini – Google+ taught me that madExcept has a much more elaborate memory leak checking than FastMM4: it checks any Windows memory heap allocation, handle leaks, etc, not just the Delphi code induced memory allocations.

Thanks David Heffernan for commenting this part:

The madExcept leak tracking tools are much more comprehensive than those of FastMM because have much greater coverage. FastMM’s leak tracking tools are great, but only track native Delphi allocations. With the madExcept tooling you get all heap allocations (including non-native ones), handle leaks etc.

That is not to belittle the FastMM tooling at all…

Time to again look at [WayBack] madshi.net – madExcept description

–jeroen

Posted in Delphi, Development, Software Development | 2 Comments »

David A. Koontz on Twitter: “Software – so many options” – rethink SOLID

Posted by jpluimers on 2019/07/09

[WayBackDavid A. Koontz‏ @davidakoontz More Software – so many options

via: [WayBackWeekend Reader 2017.42 – reality-loop

Oldest I could find: [WayBackNo free lunch – Free Agile! Community

–jeroen

Read the rest of this entry »

Posted in Development, Software Development | Leave a Comment »

Colored text output in PowerShell console using ANSI / VT100 codes – Stack Overflow

Posted by jpluimers on 2019/07/08

Cool: Windows 10 allows ANSI/VT100 terminal escape codes without extra tooling. [WayBack] Colored text output in PowerShell console using ANSI / VT100 codes – Stack Overflow.

It is off by default (can be modified through the registry), can be turned on by either using an API call, or by piping through PowerShell.

For older versions, read [WayBack] Windows console with ANSI colors handling – Super User, of which this is a small quote:

For Windows version below 10, the Windows command console doesn’t support output coloring by default. You could install either CmderConEmuANSICON or Mintty (used by default in GitBash and Cygwin) to add coloring support to your Windows command console.

Via [WayBack] Did you know that you can enable VT100 terminal emulation in PowerShell as well as the Cmd window? This will allow you to do adb shell to your Android … – Lars Fosdal – Google+

–jeroen

Posted in Color (software development), CommandLine, Development, Power User, PowerShell, PowerShell, Scripting, Software Development, Windows | Leave a Comment »

A COM Object Collection (IEnumVARIANT) – Delphi Tips – CJC Delphi (Cool Delphi Tips)

Posted by jpluimers on 2019/07/04

Summary of [WayBack] A COM Object Collection (IEnumVARIANT) – Delphi Tips – CJC Delphi (Cool Delphi Tips)

Question: How to implements object collection that support Visual Basic’s For Each construct ?

Answer:
In order to implements an object collection your object has to return  IEnumVariant pointer from a special property named _NewEnum.

Via: [WayBack] What interface to I need to implement to allow ForEach in VBA on a COM object written in delphi? – Stack Overflow

–jeroen

Posted in COM/DCOM/COM+, Delphi, Development, Software Development, Windows Development | Leave a Comment »

Web Audio Modem

Posted by jpluimers on 2019/07/04

Geekpr0n: [WayBackWeb Audio Modem

What do you do when you cannot copy text between computers due to lack of internet connectivity? I built a modem using the Web Audio API, allowing data transfer via audio.

It is on github at martme/webaudio-modem: Encode and decode text using the Web Audio API to enable offline data transfer between devices.

There are three demo pages at [WayBackmartinmelhus.com – Web Audio Encoder too:

–jeroen

Via:

Read the rest of this entry »

Posted in Development, JavaScript/ECMAScript, Scripting, Software Development | Leave a Comment »

Delphi Galileo IDE (version 8 and up): Force files to be saved as UTF8 – The Oracle at Delphi

Posted by jpluimers on 2019/07/04

Though formatting mangled the registry key to add, the article is interesting: since 2003 (C# Builder 1), you can force the IDE to always save files as UTF8 which should alleviate a lot of encoding problems.

It beats me why this isn’t the default setting, but below is an example .reg file for Delphi 8 which should be easily transformed to more recent Delphi versions:


Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Borland\BDS\2.0\Editor]
"DefaultFileFilter"="Borland.FileFilter.UTF8ToUTF8"

So basically (if formatting is kept), you browse to this key (replace Borland with the company for your specific Delphi version, and replace 2.0 by your IDE version):

HKEY_CURRENT_USER\Software\Borland\BDS\16.0\Editor

Then you add a new string value named DefaultFileFilter with value Borland.FileFilter.UTF8ToUTF8

More background [WayBack] The Oracle at Delphi: More IDE secrets – UTF8 and the Editor

The unmangled registry key (and more tips) was from [WayBackBSC Polska: Hidden possibilities of Delphi 8.

Get the list of HKEY_CURRENT_USER paths for your Delphi version at Update to List-Delphi-Installed-Packages.ps1 shows HKCU/HKLM keys and doesn’t truncated fields any more.

–jeroen

Via: [WayBack] Is there any way (IDE expert?) to automatic set encoding of each PAS file in UTF-8 instead of ANSI? – Jacek Laskowski – Google+

Posted in Delphi, Development, Encoding, Software Development, UTF-8, UTF8 | 1 Comment »

[dcc32 Warning] “W1025 Unsupported language feature: ‘operator explicit'”

Posted by jpluimers on 2019/07/03

If the Delphi compiler throws a Source: "W1025 Unsupported language feature: 'operator explicit'" at you, then it is likely that you forgot this, as per Uwe Raabe:

In the project options set “C/C++ Output file generation” to “Generate DCUs only” to get rid of the warning.

Via: [WayBack] Delphi Community Edition Rant. Just installed Delphi CE from the 3rd attempt. Two times I tried to install all features – both times the installer fell… – Sergey Kasandrov – Google+

Note that the documentation still indicates that W1025 has been documented since at least Delphi 2007 ([WayBack] x1025: Unsupported language feature: ‘%s’) as a C++ header translation issue, and still is ([WayBack] X1025 Unsupported language feature: ‘%s’ (Delphi) – RAD Studio), despite other causes (like "W1025 Unsupported language feature: 'custom attribute'") fail if you have only installed the Delphi personality.

–jeroen

Posted in Delphi, Development, Software Development | 1 Comment »