.Net 4 Downgrade PowerShell Script

Recently I re-captured a clients Windows 7 Gold image and published it out in there Production Windows 7 OSD Task Sequence. This was all fine for a month or 2 until a machine using the software “Information at Work” needed to be rebuilt by their Service Desk as there were issues.

The problem was that Information at Work required .Net 4.5.* and no other version. This it seems must have been coded into the installer and the application.  VERY frustrating…

So I had to create a script to downgrade it for Windows 7 Clients and here it is.


#Commented due to PS version 5 only --- $Release = Get-ItemPropertyValue -Name Release -Path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"

##Create Detection key function for ConfigMgr
$Unique = "InfoAtWork"
$DetectKey = "HKLM:\SOFTWARE\SOJ\SCRIPTS\$Unique"
function set-detectionKeys()
{
    New-Item -Path HKLM:\SOFTWARE\ -Name SOJ –Force
    New-Item -Path HKLM:\SOFTWARE\SOJ -Name SCRIPTS –Force
    New-Item -Path HKLM:\SOFTWARE\SOJ\SCRIPTS -Name $Unique –Force
   
}

##Get .Net Version from Registry and hold it in variable $Release
$Key = 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'

If (Test-Path $Key)
{

$Release = (Get-ItemProperty -Path $Key -Name Release).Release

##Check Release version is 4.5
if ($Release -eq 378389)

{
    set-detectionKeys
    Set-ItemProperty -Path $DetectKey -Name NetVersion -Value $Release -Force
    Write-Host "Correct Version Found Exiting" 
    Exit 0
}
##If it is not 4.5 uninstall and reinstall 4.5

Else
{
##Get all applications installed
$InstalledProducts = Get-WmiObject -Namespace 'root\cimv2\sms' -Class SMS_InstalledSoftware
#Filter out .Net
$DotNet = $InstalledProducts | where { $_.ARPDisplayName -imatch 'NET Framework 4' }
#Get uninstall string
#$Uninstall = $DotNet.UninstallString
$CachedMSI = $DotNet.LocalPackage
#Uninstall Dot Net
$Passthru = Start-Process 'msiexec.exe' -ArgumentList "/x $CachedMSI /qb /L*v $env:windir\temp\DotNetRelease$Release.log /norestart" -Wait -NoNewWindow
$Exitcode = [string]$Passthru.ExitCode


    if($Exitcode -eq 0 -Or 3010)
        {
            #Write successfuly removal to the registry
            set-detectionKeys
            Set-ItemProperty -Path $DetectKey -Name Removed -Value $Release -Force
            #Install .Net 4.5.1
            Start-Process "$PSScriptroot\SetupNet451.exe" -ArgumentList "/q /norestart /ChainingPackage ADMINDEPLOYMENT" -Wait -NoNewWindow
            #Set Detection Keys
            $ReleaseInst = (Get-ItemProperty -Path $Key -Name Release).Release
            set-detectionKeys
            Set-ItemProperty -Path $DetectKey -Name Installed451 -Value $ReleaseInst -Force
            #Tell ConfigMgr to Reboot
            Exit 3010
        }
    Else
        {
            set-detectionKeys
            Set-ItemProperty -Path $DetectKey -Name FailedRemoval -Value "ExitCode: $Exitcode" -Force
            Exit 9999

        }
}

}
Else
{
            #Write not found and install 4.5.1
            #set-detectionKeys
            #Set-ItemProperty -Path $DetectKey -Name DotNet4 -Value 'NotFound Installing 451' -Force
            #Install .Net 4.5.1
            Start-Process "$PSScriptroot\SetupNet451.exe" -ArgumentList "/q /norestart /ChainingPackage ADMINDEPLOYMENT" -Wait -NoNewWindow
            #Set Detection Keys
            $ReleaseInst = (Get-ItemProperty -Path $Key -Name Release).Release
            set-detectionKeys
            Set-ItemProperty -Path $DetectKey -Name Installed451 -Value $ReleaseInst -Force
            #Tell ConfigMgr to Reboot
            Exit 3010

}

  • First I create the function to create the detection keys in the registry.
  • Then I test the version of the .Net client installed in the registry by using this version information chart from Microsoft.
  • If it matches, happy days if it doesn’t match… find the uninstall string, create it and remove it (if its not found at all.. then jump to line 74 and install a fresh copy).
  • Check exit code “0” being success and “3010” being reboot, else fail the script and write to registry.
  • Re-install .Net 4.5.1 from the directory of the script, set detection keys and then tell the ConfigMgr client to reboot the device gracefully.

This I deployed using a Task Sequence as the “Information at Work” Software is deployed in that way. Also note that this will only work on Windows 7, so you might want to set a requirement on your application or task sequence step for “All Windows 7” Only.

If you need help creating the command line to run this as an application or task sequence CMD line check out this post.

Leave a Reply

Your email address will not be published. Required fields are marked *