From a5624f8fc223881251d4aef5e3d13368bb1e9fe1 Mon Sep 17 00:00:00 2001 From: David Paulson Date: Fri, 23 Jul 2021 10:32:37 -0500 Subject: [PATCH 1/9] Rename Get-VisualCRedistributeableVersion file name Changed to VisualCRedistributableVersionFunctions to be able to add test functions to the same file. --- Diagnostics/HealthChecker/HealthChecker.ps1 | 2 +- Setup/SetupAssist/SetupAssist.ps1 | 2 +- ...leVersion.ps1 => VisualCRedistributableVersionFunctions.ps1} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename Shared/{Get-VisualCRedistributableVersion.ps1 => VisualCRedistributableVersionFunctions.ps1} (100%) diff --git a/Diagnostics/HealthChecker/HealthChecker.ps1 b/Diagnostics/HealthChecker/HealthChecker.ps1 index 4c9d68eae7..307923e851 100644 --- a/Diagnostics/HealthChecker/HealthChecker.ps1 +++ b/Diagnostics/HealthChecker/HealthChecker.ps1 @@ -185,7 +185,7 @@ if ($PSBoundParameters["Verbose"]) { . .\DataCollection\ServerInformation\Get-OperatingSystemInformation.ps1 . .\DataCollection\ServerInformation\Get-PageFileInformation.ps1 . .\DataCollection\ServerInformation\Get-ServerRole.ps1 -. $PSScriptRoot\..\..\Shared\Get-VisualCRedistributableVersion.ps1 +. $PSScriptRoot\..\..\Shared\VisualCRedistributableVersionFunctions.ps1 . .\Analyzer\Add-AnalyzedResultInformation.ps1 . .\Analyzer\Get-DisplayResultsGroupingKey.ps1 . .\Analyzer\Invoke-AnalyzerEngine.ps1 diff --git a/Setup/SetupAssist/SetupAssist.ps1 b/Setup/SetupAssist/SetupAssist.ps1 index 557a1b1cb6..70d317ef57 100644 --- a/Setup/SetupAssist/SetupAssist.ps1 +++ b/Setup/SetupAssist/SetupAssist.ps1 @@ -33,7 +33,7 @@ param( #REPO Shared . $PSScriptRoot\..\..\Shared\Test-ScriptVersion.ps1 . $PSScriptRoot\..\..\Shared\Get-NETFrameworkVersion.ps1 -. $PSScriptRoot\..\..\Shared\Get-VisualCRedistributableVersion.ps1 +. $PSScriptRoot\..\..\Shared\VisualCRedistributableVersionFunctions.ps1 #REPO Shared Dependencies . $PSScriptRoot\..\..\Shared\Get-RemoteRegistrySubKey.ps1 diff --git a/Shared/Get-VisualCRedistributableVersion.ps1 b/Shared/VisualCRedistributableVersionFunctions.ps1 similarity index 100% rename from Shared/Get-VisualCRedistributableVersion.ps1 rename to Shared/VisualCRedistributableVersionFunctions.ps1 From 70eb07ce589de07f4bf79b0b145a1ef12d86d003 Mon Sep 17 00:00:00 2001 From: David Paulson Date: Fri, 23 Jul 2021 10:44:28 -0500 Subject: [PATCH 2/9] Added dependency --- Shared/VisualCRedistributableVersionFunctions.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Shared/VisualCRedistributableVersionFunctions.ps1 b/Shared/VisualCRedistributableVersionFunctions.ps1 index 4da421ec87..d38f7c613a 100644 --- a/Shared/VisualCRedistributableVersionFunctions.ps1 +++ b/Shared/VisualCRedistributableVersionFunctions.ps1 @@ -1,6 +1,8 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +. $PSScriptRoot\Invoke-ScriptBlockHandler.ps1 + Function Get-VisualCRedistributableVersion { [CmdletBinding()] param( From 315bca99e873d6269f5e678bf0405c10a4741686 Mon Sep 17 00:00:00 2001 From: David Paulson Date: Fri, 23 Jul 2021 12:15:11 -0500 Subject: [PATCH 3/9] Created a reusable Visual C Redistributable Version Status Function This function allows you to determine if the version is installed and if it is up to date or not. Makes it easy to use it within other scripts. --- ...VisualCRedistributableVersionFunctions.ps1 | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/Shared/VisualCRedistributableVersionFunctions.ps1 b/Shared/VisualCRedistributableVersionFunctions.ps1 index d38f7c613a..5aa6ca9873 100644 --- a/Shared/VisualCRedistributableVersionFunctions.ps1 +++ b/Shared/VisualCRedistributableVersionFunctions.ps1 @@ -37,3 +37,53 @@ Function Get-VisualCRedistributableVersion { return $softwareList } } + +Function Get-VisualCRedistributable2012Information { + return [PSCustomObject]@{ + VersionNumber = 184610406 + DownloadUrl = "https://www.microsoft.com/en-us/download/details.aspx?id=30679" + DisplayName = "Microsoft Visual C++ 2012*" + } +} + +Function Get-VisualCRedistributable2013Information { + return [PSCustomObject]@{ + VersionNumber = 201367256 + DownloadUrl = "https://support.microsoft.com/en-us/topic/update-for-visual-c-2013-redistributable-package-d8ccd6a5-4e26-c290-517b-8da6cfdf4f10" + DisplayName = "Microsoft Visual C++ 2013*" + } +} + +#Returns a 0 if no version is detected +#Returns a 1 if version is detected, but the the version we wanted. +#Returns a 2 if version is up to date. +Function Get-VcRedistributableVersionStatus { + [CmdletBinding()] + param( + [object]$VisualCRedistributableVersion, + [Parameter(Mandatory = $true)] + [object]$VersionInformation + ) + begin { + $versionDetected = $true + $value = 0 + } + process { + foreach ($detectVersion in $VisualCRedistributableVersion) { + if ($detectVersion.DisplayName -like $VersionInformation.DisplayName) { + $versionDetected = $true + + if ($detectVersion.VersionIdentifier -eq $VersionInformation.VersionNumber) { + $value += 1 + return + } + } + } + } + end { + if ($versionDetected) { + $value += 1 + } + return $value + } +} From 8a39a9cf9b6fdd5861d67a690f32eb2f1beb495e Mon Sep 17 00:00:00 2001 From: David Paulson Date: Fri, 23 Jul 2021 12:17:12 -0500 Subject: [PATCH 4/9] Updated Health Checker and SetupAssist to use the latest check methods for VC --- .../Analyzer/Invoke-AnalyzerEngine.ps1 | 33 +++++++------------ Diagnostics/HealthChecker/Helpers/Class.ps1 | 9 ----- .../Checks/Test-PrerequisiteInstalled.ps1 | 24 ++++---------- 3 files changed, 19 insertions(+), 47 deletions(-) diff --git a/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 b/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 index 1016f21c9a..ebd59e83c1 100644 --- a/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 +++ b/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 @@ -579,32 +579,23 @@ Function Invoke-AnalyzerEngine { $displayValue2013 = "Unknown" if ($null -ne $osInformation.VcRedistributable) { - Write-VerboseOutput("VCRedist2012 Testing value: {0}" -f [HealthChecker.VCRedistVersion]::VCRedist2012.value__) - Write-VerboseOutput("VCRedist2013 Testing value: {0}" -f [HealthChecker.VCRedistVersion]::VCRedist2013.value__) - foreach ($detectedVisualRedistVersion in $osInformation.VcRedistributable) { - Write-VerboseOutput("Testing {0} version id '{1}'" -f $detectedVisualRedistVersion.DisplayName, $detectedVisualRedistVersion.VersionIdentifier) + $version2012Status = Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $osInformation.VcRedistributable ` + -VersionInformation (Get-VisualCRedistributable2012Information) + $version2013Status = Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $osInformation.VcRedistributable ` + -VersionInformation (Get-VisualCRedistributable2013Information) - if ($detectedVisualRedistVersion.DisplayName -like "Microsoft Visual C++ 2012*") { - $vcRedist2012Detected = $true - if ($detectedVisualRedistVersion.VersionIdentifier -eq [HealthChecker.VCRedistVersion]::VCRedist2012) { - $displayWriteType2012 = "Green" - $displayValue2012 = "{0} Version is current" -f $detectedVisualRedistVersion.DisplayVersion - } - } elseif ($detectedVisualRedistVersion.DisplayName -like "Microsoft Visual C++ 2013*") { - $vcRedist2013Detected = $true - if ($detectedVisualRedistVersion.VersionIdentifier -eq [HealthChecker.VCRedistVersion]::VCRedist2013) { - $displayWriteType2013 = "Green" - $displayValue2013 = "{0} Version is current" -f $detectedVisualRedistVersion.DisplayVersion - } - } - } - - if (($vcRedist2012Detected -eq $true) -and ($displayWriteType2012 -ne "Green")) { + if ($version2012Status -band 2) { + $displayWriteType2012 = "Green" + $displayValue2012 = "$((Get-VisualCRedistributable2012Information).VersionNumber) Version is current" + } elseif ($version2012Status -band 1) { $displayValue2012 = "Redistributable is outdated" } - if (($vcRedist2013Detected -eq $true) -and ($displayWriteType2013 -ne "Green")) { + if ($version2013Status -band 2) { + $displayWriteType2013 = "Green" + $displayValue2013 = "$((Get-VisualCRedistributable2013Information).VersionNumber) Version is current" + } elseif ($version2013Status -band 1) { $displayValue2013 = "Redistributable is outdated" } } diff --git a/Diagnostics/HealthChecker/Helpers/Class.ps1 b/Diagnostics/HealthChecker/Helpers/Class.ps1 index 2e04aa2dde..a239ee44da 100644 --- a/Diagnostics/HealthChecker/Helpers/Class.ps1 +++ b/Diagnostics/HealthChecker/Helpers/Class.ps1 @@ -242,15 +242,6 @@ try { public string Seconds; } - //enum for the dword values of the latest supported VC++ redistributable releases - //https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads - public enum VCRedistVersion - { - Unknown = 0, - VCRedist2012 = 184610406, - VCRedist2013 = 201367256 - } - public class OSNetFrameworkInformation { public NetMajorVersion NetMajorVersion; //NetMajorVersion value diff --git a/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 b/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 index ce0e804fb7..f3f9da5e28 100644 --- a/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 +++ b/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 @@ -4,10 +4,7 @@ Function Test-PrerequisiteInstalled { [CmdletBinding()] param() - begin { - $2012VersionFound = $false - $2013VersionFound = $false - } + process { $netVersion = Get-NETFrameworkVersion @@ -17,21 +14,14 @@ Function Test-PrerequisiteInstalled { $vcRedistributable = Get-VisualCRedistributableVersion - foreach ($detectedVc in $vcRedistributable) { - - if ($detectedVc.VersionIdentifier -eq 201347597) { - $2013VersionFound = $true - } elseif ($detectedVc.VersionIdentifier -eq 184600103) { - $2012VersionFound = $true - } - } - - if (-not $2012VersionFound) { - "Download Visual C++ 2012 Redistributable Package and install: https://www.microsoft.com/en-us/download/details.aspx?id=30679" | Receive-Output + if (-not ((Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $vcRedistributable ` + -VersionInformation (Get-VisualCRedistributable2012Information)) -band 2)) { + "Download Visual C++ 2012 Redistributable Package and install: $((Get-VisualCRedistributable2012Information).DownloadUrl)" | Receive-Output } - if (-not $2013VersionFound) { - "Download Visual C++ 2013 Redistributable Package and install: https://support.microsoft.com/en-us/topic/update-for-visual-c-2013-redistributable-package-d8ccd6a5-4e26-c290-517b-8da6cfdf4f10" | Receive-Output + if (-not ((Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $vcRedistributable ` + -VersionInformation (Get-VisualCRedistributable2013Information)) -band 2)) { + "Download Visual C++ 2013 Redistributable Package and install: $((Get-VisualCRedistributable2013Information).DownloadUrl)" | Receive-Output } } } From b7387fed310301534b5d021c574bf4abe45947cf Mon Sep 17 00:00:00 2001 From: David Paulson Date: Fri, 23 Jul 2021 13:27:51 -0500 Subject: [PATCH 5/9] Fixed issue when checking objects from child and tree domain The main objects that we care about should be in the root of the forest which is where the Root Domain Naming Context should be set to. This should always work if the script is run in a domain joined computer. --- Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 b/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 index 43e5d2b9d7..97a65fd0b9 100644 --- a/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 +++ b/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 @@ -3,7 +3,10 @@ Function Test-ValidHomeMDB { $filePath = "$PSScriptRoot\validHomeMdb.txt" - ldifde -t 3268 -r "(&(objectClass=user)(mailnickname=*)(!(msExchRemoteRecipientType=*))(!(targetAddress=*))(msExchHideFromAddressLists=TRUE)(!(cn=HealthMailbox*)))" -l "distinguishedName,homeMDB" -f $filePath | Out-Null + $rootDSE = [ADSI]("LDAP://RootDSE") + ldifde -t 3268 -r "(&(objectClass=user)(mailnickname=*)(!(msExchRemoteRecipientType=*))(!(targetAddress=*))(msExchHideFromAddressLists=TRUE)(!(cn=HealthMailbox*)))" ` + -l "distinguishedName,homeMDB" -f $filePath -d $rootDSE.rootDomainNamingContext | Out-Null + $ldifeObject = @(Get-Content $filePath | ConvertFrom-Ldif) if ($ldifeObject.Count -gt 0) { From 0327cddffe59d55b4b764083a5b27c0475bf1e11 Mon Sep 17 00:00:00 2001 From: David Paulson Date: Fri, 23 Jul 2021 13:28:57 -0500 Subject: [PATCH 6/9] Removed throw that stops script Don't need to have a throw here. Softly handle it with Write-Error instead to have the script continue. --- Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 b/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 index 97a65fd0b9..bbfb0ac382 100644 --- a/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 +++ b/Setup/SetupAssist/Checks/Test-ValidHomeMdb.ps1 @@ -46,6 +46,6 @@ Function Test-ValidHomeMDB { "All Critical Mailboxes have valid HomeMDB values" | Receive-Output } } else { - throw "Unexpected LDIF data." + Write-Error "Unexpected LDIF data in Test-ValidHomeMdb." } } From 32d4d8b25bb8fb6b30b7ccf5b71ba5c905f9ad72 Mon Sep 17 00:00:00 2001 From: Bill Long Date: Fri, 23 Jul 2021 13:23:20 -0500 Subject: [PATCH 7/9] Improve readability --- .../Analyzer/Invoke-AnalyzerEngine.ps1 | 17 +-- .../Checks/Test-PrerequisiteInstalled.ps1 | 12 +- ...VisualCRedistributableVersionFunctions.ps1 | 121 ++++++++++++------ 3 files changed, 91 insertions(+), 59 deletions(-) diff --git a/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 b/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 index ebd59e83c1..b76aebab6f 100644 --- a/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 +++ b/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1 @@ -580,22 +580,17 @@ Function Invoke-AnalyzerEngine { if ($null -ne $osInformation.VcRedistributable) { - $version2012Status = Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $osInformation.VcRedistributable ` - -VersionInformation (Get-VisualCRedistributable2012Information) - $version2013Status = Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $osInformation.VcRedistributable ` - -VersionInformation (Get-VisualCRedistributable2013Information) - - if ($version2012Status -band 2) { + if (Test-VisualCRedistributableUpToDate -Year 2012 -Installed $osInformation.VcRedistributable) { $displayWriteType2012 = "Green" - $displayValue2012 = "$((Get-VisualCRedistributable2012Information).VersionNumber) Version is current" - } elseif ($version2012Status -band 1) { + $displayValue2012 = "$((Get-VisualCRedistributableInfo 2012).VersionNumber) Version is current" + } elseif (Test-VisualCRedistributableInstalled -Year 2012 -Installed $osInformation.VcRedistributable) { $displayValue2012 = "Redistributable is outdated" } - if ($version2013Status -band 2) { + if (Test-VisualCRedistributableUpToDate -Year 2013 -Installed $osInformation.VcRedistributable) { $displayWriteType2013 = "Green" - $displayValue2013 = "$((Get-VisualCRedistributable2013Information).VersionNumber) Version is current" - } elseif ($version2013Status -band 1) { + $displayValue2013 = "$((Get-VisualCRedistributableInfo 2013).VersionNumber) Version is current" + } elseif (Test-VisualCRedistributableInstalled -Year 2013 -Installed $osInformation.VcRedistributable) { $displayValue2013 = "Redistributable is outdated" } } diff --git a/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 b/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 index f3f9da5e28..e93dbaf1aa 100644 --- a/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 +++ b/Setup/SetupAssist/Checks/Test-PrerequisiteInstalled.ps1 @@ -12,16 +12,14 @@ Function Test-PrerequisiteInstalled { "Download .NET 4.8 and install: https://dotnet.microsoft.com/download/dotnet-framework/net48" | Receive-Output } - $vcRedistributable = Get-VisualCRedistributableVersion + $installed = Get-VisualCRedistributableInstalledVersion - if (-not ((Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $vcRedistributable ` - -VersionInformation (Get-VisualCRedistributable2012Information)) -band 2)) { - "Download Visual C++ 2012 Redistributable Package and install: $((Get-VisualCRedistributable2012Information).DownloadUrl)" | Receive-Output + if (-not (Test-VisualCRedistributableUpToDate -Year 2012 -Installed $installed)) { + "Download Visual C++ 2012 Redistributable Package and install: $((Get-VisualCRedistributableInfo 2012).DownloadUrl)" | Receive-Output } - if (-not ((Get-VcRedistributableVersionStatus -VisualCRedistributableVersion $vcRedistributable ` - -VersionInformation (Get-VisualCRedistributable2013Information)) -band 2)) { - "Download Visual C++ 2013 Redistributable Package and install: $((Get-VisualCRedistributable2013Information).DownloadUrl)" | Receive-Output + if (-not (Test-VisualCRedistributableUpToDate -Year 2013 -Installed $installed)) { + "Download Visual C++ 2013 Redistributable Package and install: $((Get-VisualCRedistributableInfo 2013).DownloadUrl)" | Receive-Output } } } diff --git a/Shared/VisualCRedistributableVersionFunctions.ps1 b/Shared/VisualCRedistributableVersionFunctions.ps1 index 5aa6ca9873..d8b2418c39 100644 --- a/Shared/VisualCRedistributableVersionFunctions.ps1 +++ b/Shared/VisualCRedistributableVersionFunctions.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\Invoke-ScriptBlockHandler.ps1 -Function Get-VisualCRedistributableVersion { +Function Get-VisualCRedistributableInstalledVersion { [CmdletBinding()] param( [string]$ComputerName = $env:COMPUTERNAME, @@ -38,52 +38,91 @@ Function Get-VisualCRedistributableVersion { } } -Function Get-VisualCRedistributable2012Information { - return [PSCustomObject]@{ - VersionNumber = 184610406 - DownloadUrl = "https://www.microsoft.com/en-us/download/details.aspx?id=30679" - DisplayName = "Microsoft Visual C++ 2012*" +Function Get-VisualCRedistributableInfo { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [ValidateSet(2012, 2013)] + [int] + $Year + ) + + if ($Year -eq 2012) { + return [PSCustomObject]@{ + VersionNumber = 184610406 + DownloadUrl = "https://www.microsoft.com/en-us/download/details.aspx?id=30679" + DisplayName = "Microsoft Visual C++ 2012*" + } + } else { + return [PSCustomObject]@{ + VersionNumber = 201367256 + DownloadUrl = "https://support.microsoft.com/en-us/topic/update-for-visual-c-2013-redistributable-package-d8ccd6a5-4e26-c290-517b-8da6cfdf4f10" + DisplayName = "Microsoft Visual C++ 2013*" + } } } -Function Get-VisualCRedistributable2013Information { - return [PSCustomObject]@{ - VersionNumber = 201367256 - DownloadUrl = "https://support.microsoft.com/en-us/topic/update-for-visual-c-2013-redistributable-package-d8ccd6a5-4e26-c290-517b-8da6cfdf4f10" - DisplayName = "Microsoft Visual C++ 2013*" - } +Function Test-VisualCRedistributableDesiredVersionInstalled { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [object] + $Installed, + + [Parameter(Mandatory = $true)] + [object] + $Desired + ) + + return ($null -ne $Installed | Where-Object { $_.DisplayName -like $Desired.DisplayName }) } -#Returns a 0 if no version is detected -#Returns a 1 if version is detected, but the the version we wanted. -#Returns a 2 if version is up to date. -Function Get-VcRedistributableVersionStatus { +Function Test-VisualCRedistributableDesiredVersionUpToDate { [CmdletBinding()] - param( - [object]$VisualCRedistributableVersion, + param ( + [Parameter(Mandatory = $true)] + [object] + $Installed, + [Parameter(Mandatory = $true)] - [object]$VersionInformation + [object] + $Desired ) - begin { - $versionDetected = $true - $value = 0 - } - process { - foreach ($detectVersion in $VisualCRedistributableVersion) { - if ($detectVersion.DisplayName -like $VersionInformation.DisplayName) { - $versionDetected = $true - - if ($detectVersion.VersionIdentifier -eq $VersionInformation.VersionNumber) { - $value += 1 - return - } - } - } - } - end { - if ($versionDetected) { - $value += 1 - } - return $value - } + + return ($null -ne ($Installed | Where-Object { + $_.DisplayName -like $Desired.DisplayName -and $_.VersionIdentifier -eq $Desired.VersionNumber + })) +} + + +Function Test-VisualCRedistributableInstalled { + [CmdletBinding()] + param ( + [ValidateSet(2012, 2013)] + [int] + $Year, + + [Parameter(Mandatory = $true)] + [object] + $Installed + ) + + $desired = Get-VisualCRedistributableInfo $Year + Test-VisualCRedistributableDesiredVersionInstalled $Installed $desired +} + +Function Test-VisualCRedistributableUpToDate { + [CmdletBinding()] + param ( + [ValidateSet(2012, 2013)] + [int] + $Year, + + [Parameter(Mandatory = $true)] + [object] + $Installed + ) + + $desired = Get-VisualCRedistributableInfo $Year + Test-VisualCRedistributableDesiredVersionUpToDate $Installed $desired } From 8072c39f32675ecc47ee050731aa37e40faa76cd Mon Sep 17 00:00:00 2001 From: Bill Long Date: Fri, 23 Jul 2021 14:43:12 -0500 Subject: [PATCH 8/9] Fix function name and define positions --- .../Get-OperatingSystemInformation.ps1 | 2 +- .../VisualCRedistributableVersionFunctions.ps1 | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Diagnostics/HealthChecker/DataCollection/ServerInformation/Get-OperatingSystemInformation.ps1 b/Diagnostics/HealthChecker/DataCollection/ServerInformation/Get-OperatingSystemInformation.ps1 index 7a6e494f91..cdec219a2d 100644 --- a/Diagnostics/HealthChecker/DataCollection/ServerInformation/Get-OperatingSystemInformation.ps1 +++ b/Diagnostics/HealthChecker/DataCollection/ServerInformation/Get-OperatingSystemInformation.ps1 @@ -71,7 +71,7 @@ Function Get-OperatingSystemInformation { -ScriptBlockDescription "Getting Current Time Zone" ` -CatchActionFunction ${Function:Invoke-CatchActions} $osInformation.TLSSettings = Get-AllTlsSettingsFromRegistry -MachineName $Script:Server -CatchActionFunction ${Function:Invoke-CatchActions} - $osInformation.VcRedistributable = Get-VisualCRedistributableVersion -ComputerName $Script:Server -CatchActionFunction ${Function:Invoke-CatchActions} + $osInformation.VcRedistributable = Get-VisualCRedistributableInstalledVersion -ComputerName $Script:Server -CatchActionFunction ${Function:Invoke-CatchActions} $osInformation.CredentialGuardEnabled = Get-CredentialGuardEnabled $osInformation.RegistryValues.CurrentVersionUbr = Invoke-RegistryGetValue ` -MachineName $Script:Server ` diff --git a/Shared/VisualCRedistributableVersionFunctions.ps1 b/Shared/VisualCRedistributableVersionFunctions.ps1 index d8b2418c39..ab66172b65 100644 --- a/Shared/VisualCRedistributableVersionFunctions.ps1 +++ b/Shared/VisualCRedistributableVersionFunctions.ps1 @@ -10,7 +10,7 @@ Function Get-VisualCRedistributableInstalledVersion { [scriptblock]$CatchActionFunction ) begin { - Write-Verbose "Calling: Get-VisualCRedistributableVersion" + Write-Verbose "Calling: $($MyInvocation.MyCommand)" $softwareList = New-Object 'System.Collections.Generic.List[object]' } process { @@ -33,7 +33,7 @@ Function Get-VisualCRedistributableInstalledVersion { } } end { - Write-Verbose "Exiting: Get-VisualCRedistributableVersion" + Write-Verbose "Exiting: $($MyInvocation.MyCommand)" return $softwareList } } @@ -65,11 +65,11 @@ Function Get-VisualCRedistributableInfo { Function Test-VisualCRedistributableDesiredVersionInstalled { [CmdletBinding()] param ( - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, Position = 0)] [object] $Installed, - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, Position = 1)] [object] $Desired ) @@ -80,11 +80,11 @@ Function Test-VisualCRedistributableDesiredVersionInstalled { Function Test-VisualCRedistributableDesiredVersionUpToDate { [CmdletBinding()] param ( - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, Position = 0)] [object] $Installed, - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, Position = 1)] [object] $Desired ) @@ -98,11 +98,12 @@ Function Test-VisualCRedistributableDesiredVersionUpToDate { Function Test-VisualCRedistributableInstalled { [CmdletBinding()] param ( + [Parameter(Mandatory = $true, Position = 0)] [ValidateSet(2012, 2013)] [int] $Year, - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, Position = 1)] [object] $Installed ) @@ -114,11 +115,12 @@ Function Test-VisualCRedistributableInstalled { Function Test-VisualCRedistributableUpToDate { [CmdletBinding()] param ( + [Parameter(Mandatory = $true, Position = 0)] [ValidateSet(2012, 2013)] [int] $Year, - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, Position = 1)] [object] $Installed ) From ab9e6160054bf08ac46edf443f077721e60a4eba Mon Sep 17 00:00:00 2001 From: Bill Long Date: Fri, 23 Jul 2021 14:56:33 -0500 Subject: [PATCH 9/9] Simplify --- ...VisualCRedistributableVersionFunctions.ps1 | 41 +++---------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/Shared/VisualCRedistributableVersionFunctions.ps1 b/Shared/VisualCRedistributableVersionFunctions.ps1 index ab66172b65..223a7ec965 100644 --- a/Shared/VisualCRedistributableVersionFunctions.ps1 +++ b/Shared/VisualCRedistributableVersionFunctions.ps1 @@ -62,39 +62,6 @@ Function Get-VisualCRedistributableInfo { } } -Function Test-VisualCRedistributableDesiredVersionInstalled { - [CmdletBinding()] - param ( - [Parameter(Mandatory = $true, Position = 0)] - [object] - $Installed, - - [Parameter(Mandatory = $true, Position = 1)] - [object] - $Desired - ) - - return ($null -ne $Installed | Where-Object { $_.DisplayName -like $Desired.DisplayName }) -} - -Function Test-VisualCRedistributableDesiredVersionUpToDate { - [CmdletBinding()] - param ( - [Parameter(Mandatory = $true, Position = 0)] - [object] - $Installed, - - [Parameter(Mandatory = $true, Position = 1)] - [object] - $Desired - ) - - return ($null -ne ($Installed | Where-Object { - $_.DisplayName -like $Desired.DisplayName -and $_.VersionIdentifier -eq $Desired.VersionNumber - })) -} - - Function Test-VisualCRedistributableInstalled { [CmdletBinding()] param ( @@ -109,7 +76,8 @@ Function Test-VisualCRedistributableInstalled { ) $desired = Get-VisualCRedistributableInfo $Year - Test-VisualCRedistributableDesiredVersionInstalled $Installed $desired + + return ($null -ne $Installed | Where-Object { $_.DisplayName -like $desired.DisplayName }) } Function Test-VisualCRedistributableUpToDate { @@ -126,5 +94,8 @@ Function Test-VisualCRedistributableUpToDate { ) $desired = Get-VisualCRedistributableInfo $Year - Test-VisualCRedistributableDesiredVersionUpToDate $Installed $desired + + return ($null -ne ($Installed | Where-Object { + $_.DisplayName -like $desired.DisplayName -and $_.VersionIdentifier -eq $desired.VersionNumber + })) }