From b4f9215e954ca0385bdf4841d6697ffaa3caaa82 Mon Sep 17 00:00:00 2001 From: nithilin1 Date: Wed, 27 Sep 2023 14:26:45 +0200 Subject: [PATCH 1/3] Testing application changes --- Apps/NotepadPlusPlus/App.json | 2 +- Apps/Steam/App.json | 40 ++++ Apps/Steam/Deploy-Application.ps1 | 246 ++++++++++++++++++++++ Apps/Steam/Icon.png | Bin 0 -> 313617 bytes Apps/Treesize Free/App.json | 41 ++++ Apps/Treesize Free/Deploy-Application.ps1 | 246 ++++++++++++++++++++++ Apps/Treesize Free/Icon.png | Bin 0 -> 2150 bytes appList.json | 18 ++ publish.yml | 8 +- 9 files changed, 596 insertions(+), 5 deletions(-) create mode 100644 Apps/Steam/App.json create mode 100644 Apps/Steam/Deploy-Application.ps1 create mode 100644 Apps/Steam/Icon.png create mode 100644 Apps/Treesize Free/App.json create mode 100644 Apps/Treesize Free/Deploy-Application.ps1 create mode 100644 Apps/Treesize Free/Icon.png diff --git a/Apps/NotepadPlusPlus/App.json b/Apps/NotepadPlusPlus/App.json index 52b2e98..5cadc51 100644 --- a/Apps/NotepadPlusPlus/App.json +++ b/Apps/NotepadPlusPlus/App.json @@ -21,7 +21,7 @@ "DeviceRestartBehavior": "suppress" }, "RequirementRule": { - "MinimumSupportedWindowsRelease": "21H2", + "MinimumSupportedWindowsRelease": "W10_21H2", "Architecture": "x64" }, "CustomRequirementRule": [ diff --git a/Apps/Steam/App.json b/Apps/Steam/App.json new file mode 100644 index 0000000..3506a1d --- /dev/null +++ b/Apps/Steam/App.json @@ -0,0 +1,40 @@ +{ + "PackageInformation": { + "SetupType": "EXE", + "SetupFile": "Deploy-Application.exe", + "SourceFolder": "Source", + "OutputFolder": "Package", + "IconFile": "Icon.png" + }, + "Information": { + "DisplayName": "", + "AppVersion": "", + "Description": "Installs Steam", + "Publisher": "", + "Notes": "", + "Owner": "" + }, + "Program": { + "InstallCommand": "Deploy-Application.exe Install", + "UninstallCommand": "Deploy-Application.exe Uninstall", + "InstallExperience": "system", + "DeviceRestartBehavior": "suppress", + "AllowAvailableUninstall": "false" + }, + "RequirementRule": { + "MinimumSupportedWindowsRelease": "W10_21H2", + "Architecture": "x86" + }, + "CustomRequirementRule": [ + ], + "DetectionRule": [ + { + "Type": "Registry", + "DetectionMethod": "Existence", + "KeyPath": "HKEY_CURRENT_USER\\SOFTWARE\\Valve\\Steam", + "ValueName": "SteamExe", + "DetectionType": "exists", + "Check32BitOn64System": "false" + } + ] +} \ No newline at end of file diff --git a/Apps/Steam/Deploy-Application.ps1 b/Apps/Steam/Deploy-Application.ps1 new file mode 100644 index 0000000..f9c9ccd --- /dev/null +++ b/Apps/Steam/Deploy-Application.ps1 @@ -0,0 +1,246 @@ +<# +.SYNOPSIS + This script performs the installation or uninstallation of an application(s). + # LICENSE # + PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. + Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . +.DESCRIPTION + The script is provided as a template to perform an install or uninstall of an application(s). + The script either performs an "Install" deployment type or an "Uninstall" deployment type. + The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. +.PARAMETER DeploymentType + The type of deployment to perform. Default is: Install. +.PARAMETER DeployMode + Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. +.PARAMETER AllowRebootPassThru + Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. +.PARAMETER TerminalServerMode + Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers. +.PARAMETER DisableLogging + Disables logging to file for the script. Default is: $false. +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" +.EXAMPLE + Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" +.NOTES + Toolkit Exit Code Ranges: + 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 + 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 + 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 +.LINK + http://psappdeploytoolkit.com +#> +[CmdletBinding()] +Param ( + [Parameter(Mandatory=$false)] + [ValidateSet('Install','Uninstall')] + [string]$DeploymentType = 'Install', + [Parameter(Mandatory=$false)] + [ValidateSet('Interactive','Silent','NonInteractive')] + [string]$DeployMode = 'Interactive', + [Parameter(Mandatory=$false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory=$false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory=$false)] + [switch]$DisableLogging = $false +) + +Try { + ## Set the script execution policy for this process + Try { Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' } Catch {} + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Main Application + [string]$appVendor = '###APPPUBLISHER###' + [string]$appName = '###INTUNEAPPNAME###' + [string]$appVersion = '###VERSION###' + [string]$appArch = '' + [string]$appLang = '' + ## Variables: Additional applications + ## - Not required + ## Variables: Application package details + [string]$appRevision = '1.0' + [string]$appScriptVersion = '3.7.0' + [string]$appScriptDate = '###DATETIME###' + [string]$appScriptAuthor = 'IntuneAppFactory' + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [string]$installName = '' + [string]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [int32]$mainExitCode = 0 + + ## Variables: Script + [string]$deployAppScriptFriendlyName = 'Deploy Application' + [version]$deployAppScriptVersion = [version]'3.7.0' + [string]$deployAppScriptDate = '02/13/2018' + [hashtable]$deployAppScriptParameters = $psBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation } + [string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." } + If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain } + } + Catch { + If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [string]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + #Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Remove-MSIApplicationsEx -Name "" + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [string]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } } + } + + ## ******************************************* + + ## SAMPLE: EXE + $exeInstall = "###SETUPFILENAME###" + $exeInstallParams = "/S" + Execute-Process -Path "$($dirFiles)\$($exeInstall)" -Parameters "$($exeInstallParams)" + + ## SAMPLE: PowerShell Script + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -File ""$($dirFiles)\ScriptName.ps1""" + + ## SAMPLE: PowerShell Script + parameter input + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -Command ""& '$($dirFiles)\ScriptName.ps1' -Parameter Input""" + + ## SAMPLE: MSI + #$msiInstall = "###SETUPFILENAME###" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + Params + #$msiInstall = "###SETUPFILENAME###" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + ## SAMPLE: MSI + MST + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + MST + Params + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [string]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } + } + ElseIf ($deploymentType -ieq 'Uninstall') + { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } + Execute-MSI @ExecuteDefaultMSISplat + } + + # ******************************************* + + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Execute-MSI -Action "Uninstall" -Path "" + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Post-Uninstallation' + + ## + + } + + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode +} +Catch { + [int32]$mainExitCode = 60001 + [string]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +} \ No newline at end of file diff --git a/Apps/Steam/Icon.png b/Apps/Steam/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f546990a3b8ed3ee54dfeefba5f0dd601855bd51 GIT binary patch literal 313617 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 z

-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", + "AppVersion": "", + "Description": "Install Treesize Free", + "Publisher": "", + "Notes": "", + "Owner": "" + }, + "Program": { + "InstallCommand": "Deploy-Application.exe Install", + "UninstallCommand": "Deploy-Application.exe Uninstall", + "InstallExperience": "system", + "DeviceRestartBehavior": "suppress", + "AllowAvailableUninstall": "false" + }, + "RequirementRule": { + "MinimumSupportedWindowsRelease": "W10_21H2", + "Architecture": "x86" + }, + "CustomRequirementRule": [ + ], + "DetectionRule": [ + { + "Type": "Registry", + "DetectionMethod": "VersionComparison", + "KeyPath": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Treesize Free_is1", + "ValueName": "DisplayVersion", + "Operator": "greaterThanOrEqual", + "Value": "", + "Check32BitOn64System": "false" + } + ] +} \ No newline at end of file diff --git a/Apps/Treesize Free/Deploy-Application.ps1 b/Apps/Treesize Free/Deploy-Application.ps1 new file mode 100644 index 0000000..f9c9ccd --- /dev/null +++ b/Apps/Treesize Free/Deploy-Application.ps1 @@ -0,0 +1,246 @@ +<# +.SYNOPSIS + This script performs the installation or uninstallation of an application(s). + # LICENSE # + PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. + Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . +.DESCRIPTION + The script is provided as a template to perform an install or uninstall of an application(s). + The script either performs an "Install" deployment type or an "Uninstall" deployment type. + The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. +.PARAMETER DeploymentType + The type of deployment to perform. Default is: Install. +.PARAMETER DeployMode + Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. +.PARAMETER AllowRebootPassThru + Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. +.PARAMETER TerminalServerMode + Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers. +.PARAMETER DisableLogging + Disables logging to file for the script. Default is: $false. +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" +.EXAMPLE + Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" +.NOTES + Toolkit Exit Code Ranges: + 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 + 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 + 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 +.LINK + http://psappdeploytoolkit.com +#> +[CmdletBinding()] +Param ( + [Parameter(Mandatory=$false)] + [ValidateSet('Install','Uninstall')] + [string]$DeploymentType = 'Install', + [Parameter(Mandatory=$false)] + [ValidateSet('Interactive','Silent','NonInteractive')] + [string]$DeployMode = 'Interactive', + [Parameter(Mandatory=$false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory=$false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory=$false)] + [switch]$DisableLogging = $false +) + +Try { + ## Set the script execution policy for this process + Try { Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' } Catch {} + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Main Application + [string]$appVendor = '###APPPUBLISHER###' + [string]$appName = '###INTUNEAPPNAME###' + [string]$appVersion = '###VERSION###' + [string]$appArch = '' + [string]$appLang = '' + ## Variables: Additional applications + ## - Not required + ## Variables: Application package details + [string]$appRevision = '1.0' + [string]$appScriptVersion = '3.7.0' + [string]$appScriptDate = '###DATETIME###' + [string]$appScriptAuthor = 'IntuneAppFactory' + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [string]$installName = '' + [string]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [int32]$mainExitCode = 0 + + ## Variables: Script + [string]$deployAppScriptFriendlyName = 'Deploy Application' + [version]$deployAppScriptVersion = [version]'3.7.0' + [string]$deployAppScriptDate = '02/13/2018' + [hashtable]$deployAppScriptParameters = $psBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation } + [string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." } + If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain } + } + Catch { + If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [string]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + #Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Remove-MSIApplicationsEx -Name "" + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [string]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } } + } + + ## ******************************************* + + ## SAMPLE: EXE + $exeInstall = "###SETUPFILENAME###" + $exeInstallParams = "/S" + Execute-Process -Path "$($dirFiles)\$($exeInstall)" -Parameters "$($exeInstallParams)" + + ## SAMPLE: PowerShell Script + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -File ""$($dirFiles)\ScriptName.ps1""" + + ## SAMPLE: PowerShell Script + parameter input + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -Command ""& '$($dirFiles)\ScriptName.ps1' -Parameter Input""" + + ## SAMPLE: MSI + #$msiInstall = "###SETUPFILENAME###" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + Params + #$msiInstall = "###SETUPFILENAME###" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + ## SAMPLE: MSI + MST + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + MST + Params + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [string]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } + } + ElseIf ($deploymentType -ieq 'Uninstall') + { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } + Execute-MSI @ExecuteDefaultMSISplat + } + + # ******************************************* + + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Execute-MSI -Action "Uninstall" -Path "" + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Post-Uninstallation' + + ## + + } + + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode +} +Catch { + [int32]$mainExitCode = 60001 + [string]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +} \ No newline at end of file diff --git a/Apps/Treesize Free/Icon.png b/Apps/Treesize Free/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a1f999e02fe4ce4a473bded3ea674325b05c1c GIT binary patch literal 2150 zcmb7``#aMOAIHDnZJ5){kTcub2r+cd9kWa%1v^} zHqEIOBT{rn+&x6yDHW1^AJ6k2JlFNPKCjmg@9X;f@cHGPOLIG*te~R+0D!WylY=J! zfEx+|NcaX$)*SZUz)_m3x8nu@zR&+P5CkzNtG}#$M?a;L2bq@Qvy;p7*xnO^OOsb- zn(G&yF(xW#FZ1|cMk{9d^s(!B?s=V!E9f{+H!t7|x`NNNqz#gjdrjxM~+c^SPa$ko$|`_@?ekRTC2|D zVoLtL+e5uto~GRszWu>%mmV_{S#43b@a~np*T093XJ-}R-yL%8e&u=_Z|fSg;5L`7 zx+_d?Z=iNCSVDZM0=M>uHW`zT7pD@kQ!muAh7? zBQi%f!Yd3F=_c`*QrnWF-sRKG7jAvLceQ0yH3m_7qu`<;RxnlIFpEuF$QQa!t{=x& z65a52klN|SM~RgcQ10AkpGW@dEMuYU(~2=vjEcvvsDq#AYb{&hL!VQ_8dy;_>yz`c zDJIZPds?O#$~W`Ph5L31s|y=+ihQti$ISA2L!?azRI9wA(ZrwqeqnNfUzO%lXE>J- z2pM+`jH&!D(S8#uacVDx%=T%j*W3;>#MV!*E}sp0lrVE3im9UH@NG7PrMfFw>c7ry zdKxkJQ-?W=eJfU*f-)F@Sg&^sKA`lD|na@ZNoj~ssMWH4$!`zCa41-bUkD)Baw^_MGqaAWXP24 zKxX?ebASU609A1AuwR!qLWygFG=))z)e#zCU-2wJrV1R|Hjy@C$K|&>QUNDJ*^kIA zWu%!n1i=k4hs-HMN>qUXbu0nvbq~OSY9AINabViFWh4cb>>{fm4-nzk5#c?{S6yIx zd-Qk&Z0Q?)ojZi7%T`D;`J8+sHUWq*sJ)7rs%7u+ggv{@%zWh}?^FSU1#Bi_(LI0( z_|;2b_;bL#*F!6Z^N-P>Gq<&;=Z|m9_4*isZI`>dnRl>eN!y?-XT<<*$`TtN_8Nhe z={+|&0WP)!ma_@qh2JpIEvP6kb06y8+iM|}Q}9^5{M-yETNnhB3-nyz-*s>378Z}M zW#Nxxp|ZK}28#)485;E~;v#`Cn<(ufFf89|q@Ka-)@l%i+(w{Qle$AV8~B(^ntp?` zla;xevPkLDZ{2f@lzZ0Q&WndAJ(+&+_g$9;vHzx!X_8;M=}b=_CRK>}dqO*4niP;T4~$^HCT^4N-0}Gy=GupW7p_(_yAoTK>5F38q zfP;bKE;J)>lpddb)Z+w^dm%kDKO?!&lP;=fVaXy#I~OsV3%we!cKAJ{;@tFG|}Ukn$_0R}Jy5rri~Nrc&9@P&q|9Ltazr9PU}@EeYZU5bbqw zGuIM?6izRnl8(^USjsENHGn2CuIQM1M;fi)i1kP%Q=a zu7Qj0xEBqca(_VTnr0LK;C-p^l^msxE0oh&_q0aolv^2K%CT#XQ`YgidG_#5w5HH3f?F<--&ky+ zTGts~ugCDF{Q<(zewxzbO!-qv+iysE$XARrUy=p++mVJ~pLV9jdzH4B6#Wa~(tbt)HpE&Gxz8GsoVP6_jhWb zC1X{5A@h9+WK3+=GHFtdZ4`6gMlRbW#l(XL4BAxt%FAuZ$0@GyMe6Mbq3LZCp=CBF zq?)GZupLdEt9K8v`{Qr&mc-F3ShGOz2vMnIUAa0Bz0}mYds{9K|8@b?z%*iPBY2(v PEey_%ZVq)6dis9=o*B(( literal 0 HcmV?d00001 diff --git a/appList.json b/appList.json index 1c9e7a9..56177a7 100644 --- a/appList.json +++ b/appList.json @@ -27,6 +27,24 @@ "Type": "exe" } ] + }, + { + "IntuneAppName": "TreeSize Free", + "AppPublisher": "Jam Software", + "AppSource": "Winget", + "AppID": "JAMSoftware.TreeSize.Free", + "AppFolderName": "TreeSize Free", + "AppSetupFileName": "TreeSizeSetup.exe" + }, + { + "IntuneAppName": "Steam", + "AppPublisher": "Valve", + "AppSource": "Storage Account", + "AppID": "", + "AppFolderName": "Steam", + "AppSetupFileName": "SteamSetup.exe", + "StorageAccountName": "iafstorage", + "StorageAccountContainerName": "Steam" } ] } \ No newline at end of file diff --git a/publish.yml b/publish.yml index ad9f447..7690fe1 100644 --- a/publish.yml +++ b/publish.yml @@ -3,15 +3,15 @@ name: IntuneAppFactory trigger: none schedules: -- cron: "0 */6 * * *" - displayName: Every 6 hours +- cron: "0 3 * * *" + displayName: Daily every evening at 3AM branches: include: - main always: true pool: - name: '<>' + name: 'MSE-WIN-01' parameters: - name: operationalMode @@ -25,7 +25,7 @@ parameters: - name: archiveMode displayName: Archive published apps type: string - default: 'No' + default: 'Yes' values: - 'Yes' - 'No' From b47408f890ac23857146a9c87fc3b47599aa1114 Mon Sep 17 00:00:00 2001 From: nithilin1 Date: Fri, 29 Sep 2023 11:02:50 +0200 Subject: [PATCH 2/3] changes to template --- Templates/Application/Deploy-Application.ps1 | 496 +++++++++++-------- 1 file changed, 282 insertions(+), 214 deletions(-) diff --git a/Templates/Application/Deploy-Application.ps1 b/Templates/Application/Deploy-Application.ps1 index 7d2f1b9..d50ef9d 100644 --- a/Templates/Application/Deploy-Application.ps1 +++ b/Templates/Application/Deploy-Application.ps1 @@ -1,66 +1,112 @@ <# .SYNOPSIS - This script performs the installation or uninstallation of an application(s). - # LICENSE # - PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. - Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. - This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +PSApppDeployToolkit - This script performs the installation or uninstallation of an application(s). + .DESCRIPTION - The script is provided as a template to perform an install or uninstall of an application(s). - The script either performs an "Install" deployment type or an "Uninstall" deployment type. - The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. - The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +- The script is provided as a template to perform an install or uninstall of an application(s). +- The script either performs an "Install" deployment type or an "Uninstall" deployment type. +- The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + +The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + .PARAMETER DeploymentType - The type of deployment to perform. Default is: Install. + +The type of deployment to perform. Default is: Install. + .PARAMETER DeployMode - Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. + +Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. + .PARAMETER AllowRebootPassThru - Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. + +Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. + .PARAMETER TerminalServerMode - Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers. + +Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Desktop Session Hosts/Citrix servers. + .PARAMETER DisableLogging - Disables logging to file for the script. Default is: $false. + +Disables logging to file for the script. Default is: $false. + .EXAMPLE - powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" + .EXAMPLE - powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" + .EXAMPLE - powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" + .EXAMPLE - Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" + +Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + .NOTES - Toolkit Exit Code Ranges: - 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 - 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 - 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 -.LINK - http://psappdeploytoolkit.com + +Toolkit Exit Code Ranges: +- 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 +- 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 +- 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 + +.LINK + +https://psappdeploytoolkit.com #> + + [CmdletBinding()] Param ( - [Parameter(Mandatory=$false)] - [ValidateSet('Install','Uninstall')] - [string]$DeploymentType = 'Install', - [Parameter(Mandatory=$false)] - [ValidateSet('Interactive','Silent','NonInteractive')] - [string]$DeployMode = 'Interactive', - [Parameter(Mandatory=$false)] - [switch]$AllowRebootPassThru = $false, - [Parameter(Mandatory=$false)] - [switch]$TerminalServerMode = $false, - [Parameter(Mandatory=$false)] - [switch]$DisableLogging = $false + [Parameter(Mandatory = $false)] + [ValidateSet('Install', 'Uninstall', 'Repair')] + [String]$DeploymentType = 'Install', + [Parameter(Mandatory = $false)] + [ValidateSet('Interactive', 'Silent', 'NonInteractive')] + [String]$DeployMode = 'Interactive', + [Parameter(Mandatory = $false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory = $false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory = $false)] + [switch]$DisableLogging = $false ) Try { - ## Set the script execution policy for this process - Try { Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' } Catch {} - - ##*=============================================== - ##* VARIABLE DECLARATION - ##*=============================================== - ## Variables: Main Application + ## Set the script execution policy for this process + Try { + Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' + } + Catch { + } + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Main Application [string]$appVendor = '###APPPUBLISHER###' [string]$appName = '###INTUNEAPPNAME###' [string]$appVersion = '###VERSION###' @@ -70,177 +116,199 @@ Try { ## - Not required ## Variables: Application package details [string]$appRevision = '1.0' - [string]$appScriptVersion = '3.7.0' + [string]$appScriptVersion = '3.9.3' [string]$appScriptDate = '###DATETIME###' [string]$appScriptAuthor = 'IntuneAppFactory' - ##*=============================================== - ## Variables: Install Titles (Only set here to override defaults set by the toolkit) - [string]$installName = '' - [string]$installTitle = '' - - ##* Do not modify section below - #region DoNotModify - - ## Variables: Exit Code - [int32]$mainExitCode = 0 - - ## Variables: Script - [string]$deployAppScriptFriendlyName = 'Deploy Application' - [version]$deployAppScriptVersion = [version]'3.7.0' - [string]$deployAppScriptDate = '02/13/2018' - [hashtable]$deployAppScriptParameters = $psBoundParameters - - ## Variables: Environment - If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation } - [string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent - - ## Dot source the required App Deploy Toolkit Functions - Try { - [string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" - If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." } - If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain } - } - Catch { - If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 } - Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' - ## Exit the script, returning the exit code to SCCM - If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode } - } - - #endregion - ##* Do not modify section above - ##*=============================================== - ##* END VARIABLE DECLARATION - ##*=============================================== - - If ($deploymentType -ine 'Uninstall') { - ##*=============================================== - ##* PRE-INSTALLATION - ##*=============================================== - [string]$installPhase = 'Pre-Installation' - - ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt - #Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt - - ## Show Progress Message (with the default message) - #Show-InstallationProgress - - ## - - ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string - #Remove-MSIApplications -Name "" - - ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x - #Remove-MSIApplicationsEx -Name "" - - ##*=============================================== - ##* INSTALLATION - ##*=============================================== - [string]$installPhase = 'Installation' - - ## Handle Zero-Config MSI Installations - If ($useDefaultMsi) { - [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } - Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } } - } - - ## ******************************************* - - ## SAMPLE: EXE - #$exeInstall = "###SETUPFILENAME###" - #$exeInstallParams = "" - #Execute-Process -Path "$($dirFiles)\$($exeInstall)" -Parameters "$($exeInstallParams)" - - ## SAMPLE: PowerShell Script - #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -File ""$($dirFiles)\ScriptName.ps1""" - - ## SAMPLE: PowerShell Script + parameter input - #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -Command ""& '$($dirFiles)\ScriptName.ps1' -Parameter Input""" - - ## SAMPLE: MSI - #$msiInstall = "###SETUPFILENAME###" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" - - ## SAMPLE: MSI + Params - #$msiInstall = "###SETUPFILENAME###" - #$msiInstallParams = "" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams - - ## SAMPLE: MSI + MST - #$msiInstall = "###SETUPFILENAME###" - #$mstInstall = "setup.mst" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" - - ## SAMPLE: MSI + MST + Params - #$msiInstall = "###SETUPFILENAME###" - #$mstInstall = "setup.mst" - #$msiInstallParams = "" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams - - ##*=============================================== - ##* POST-INSTALLATION - ##*=============================================== - [string]$installPhase = 'Post-Installation' - - ## - - ## Display a message at the end of the install - #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } - } - ElseIf ($deploymentType -ieq 'Uninstall') - { - ##*=============================================== - ##* PRE-UNINSTALLATION - ##*=============================================== - [string]$installPhase = 'Pre-Uninstallation' - - ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing - #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 - - ## Show Progress Message (with the default message) - #Show-InstallationProgress - - ## - - ##*=============================================== - ##* UNINSTALLATION - ##*=============================================== - [string]$installPhase = 'Uninstallation' - - ## Handle Zero-Config MSI Uninstallations - If ($useDefaultMsi) { - [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } - Execute-MSI @ExecuteDefaultMSISplat - } - - # ******************************************* - - ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string - #Remove-MSIApplications -Name "" - - ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x - #Execute-MSI -Action "Uninstall" -Path "" - - ##*=============================================== - ##* POST-UNINSTALLATION - ##*=============================================== - [string]$installPhase = 'Post-Uninstallation' - - ## - - } - - ##*=============================================== - ##* END SCRIPT BODY - ##*=============================================== - - ## Call the Exit-Script function to perform final cleanup operations - Exit-Script -ExitCode $mainExitCode + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [String]$installName = '' + [String]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [Int32]$mainExitCode = 0 + + ## Variables: Script + [String]$deployAppScriptFriendlyName = 'Deploy Application' + [Version]$deployAppScriptVersion = [Version]'3.9.3' + [String]$deployAppScriptDate = '02/05/2023' + [Hashtable]$deployAppScriptParameters = $PsBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $InvocationInfo = $HostInvocation + } + Else { + $InvocationInfo = $MyInvocation + } + [String]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [String]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { + Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." + } + If ($DisableLogging) { + . $moduleAppDeployToolkitMain -DisableLogging + } + Else { + . $moduleAppDeployToolkitMain + } + } + Catch { + If ($mainExitCode -eq 0) { + [Int32]$mainExitCode = 60008 + } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $script:ExitCode = $mainExitCode; Exit + } + Else { + Exit $mainExitCode + } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall' -and $deploymentType -ine 'Repair') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [String]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { + $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } + } + } + + ## + + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } + } + ElseIf ($deploymentType -ieq 'Uninstall') { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + + ## + + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Uninstallation' + + ## + + + } + ElseIf ($deploymentType -ieq 'Repair') { + ##*=============================================== + ##* PRE-REPAIR + ##*=============================================== + [String]$installPhase = 'Pre-Repair' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + ##*=============================================== + ##* REPAIR + ##*=============================================== + [String]$installPhase = 'Repair' + + ## Handle Zero-Config MSI Repairs + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Repair'; Path = $defaultMsiFile; }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + ## + + ##*=============================================== + ##* POST-REPAIR + ##*=============================================== + [String]$installPhase = 'Post-Repair' + + ## + + + } + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode } Catch { - [int32]$mainExitCode = 60001 - [string]$mainErrorMessage = "$(Resolve-Error)" - Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName - Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' - Exit-Script -ExitCode $mainExitCode -} \ No newline at end of file + [Int32]$mainExitCode = 60001 + [String]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +} From d6a53673f6336b5adbbcc268393f3fecb29748d2 Mon Sep 17 00:00:00 2001 From: nithilin1 Date: Thu, 25 Apr 2024 10:20:31 +0200 Subject: [PATCH 3/3] Reupload --- 7zipexample.png | Bin 0 -> 41012 bytes Apps/Adobe Acrobat Reader/App.json | 41 + .../Deploy-Application.ps1 | 227 + Apps/Adobe Acrobat Reader/Icon.png | Bin 0 -> 71174 bytes Apps/Adobe Photoshop/App.json | 41 + Apps/Adobe Photoshop/Deploy-Application.ps1 | 351 + Apps/Adobe Photoshop/Icon.png | Bin 0 -> 14349 bytes Apps/Steam/App.json | 2 +- CreateNewApp.md | 113 + README.md | 9 +- Scripts/Install-Modules.ps1 | 2 +- Scripts/New-Win32App.ps1 | 1 + Templates/Application/Deploy-Application.ps1 | 40 +- .../AppDeployToolkitBanner.png | Bin 6288 -> 11569 bytes .../AppDeployToolkitConfig.xml | Bin 148458 -> 101067 bytes .../AppDeployToolkitExtensions.ps1 | 512 +- .../AppDeployToolkit/AppDeployToolkitHelp.ps1 | 197 +- .../AppDeployToolkit/AppDeployToolkitLogo.ico | Bin 300318 -> 151459 bytes .../AppDeployToolkit/AppDeployToolkitLogo.png | Bin 0 -> 606823 bytes .../AppDeployToolkit/AppDeployToolkitMain.cs | 249 +- .../AppDeployToolkit/AppDeployToolkitMain.ps1 | 23999 ++++++++++------ .../Framework/Source/Deploy-Application.exe | Bin 314880 -> 274944 bytes .../Source/Deploy-Application.exe.config | 12 +- .../Framework/Source/Deploy-Application.ps1 | 517 +- appList.json | 14 +- containerexample.png | Bin 0 -> 65051 bytes publish.yml | 21 +- 27 files changed, 16177 insertions(+), 10171 deletions(-) create mode 100644 7zipexample.png create mode 100644 Apps/Adobe Acrobat Reader/App.json create mode 100644 Apps/Adobe Acrobat Reader/Deploy-Application.ps1 create mode 100644 Apps/Adobe Acrobat Reader/Icon.png create mode 100644 Apps/Adobe Photoshop/App.json create mode 100644 Apps/Adobe Photoshop/Deploy-Application.ps1 create mode 100644 Apps/Adobe Photoshop/Icon.png create mode 100644 CreateNewApp.md create mode 100644 Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitLogo.png create mode 100644 containerexample.png diff --git a/7zipexample.png b/7zipexample.png new file mode 100644 index 0000000000000000000000000000000000000000..71184111d5e5f513709d59ecbd32fc08a983fb73 GIT binary patch literal 41012 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 J%5|J${slJ>9L4|u literal 0 HcmV?d00001 diff --git a/Apps/Adobe Acrobat Reader/App.json b/Apps/Adobe Acrobat Reader/App.json new file mode 100644 index 0000000..10c2b72 --- /dev/null +++ b/Apps/Adobe Acrobat Reader/App.json @@ -0,0 +1,41 @@ +{ + "PackageInformation": { + "SetupType": "EXE", + "SetupFile": "Deploy-Application.exe", + "SourceFolder": "Source", + "OutputFolder": "Package", + "IconFile": "Icon.png" + }, + "Information": { + "DisplayName": "", + "AppVersion": "", + "Description": "Install Adobe Acrobat Reader", + "Publisher": "", + "Notes": "", + "Owner": "" + }, + "Program": { + "InstallCommand": "Deploy-Application.exe Install", + "UninstallCommand": "Deploy-Application.exe Uninstall", + "InstallExperience": "system", + "DeviceRestartBehavior": "suppress", + "AllowAvailableUninstall": "true" + }, + "RequirementRule": { + "MinimumSupportedWindowsRelease": "W10_21H2", + "Architecture": "x64" + }, + "CustomRequirementRule": [ + ], + "DetectionRule": [ + { + "Type": "Registry", + "DetectionMethod": "VersionComparison", + "KeyPath": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{AC76BA86-1033-FF00-7760-BC15014EA700}", + "ValueName": "DisplayVersion", + "Operator": "greaterThanOrEqual", + "Value": "", + "Check32BitOn64System": "false" + } + ] +} \ No newline at end of file diff --git a/Apps/Adobe Acrobat Reader/Deploy-Application.ps1 b/Apps/Adobe Acrobat Reader/Deploy-Application.ps1 new file mode 100644 index 0000000..5db1ede --- /dev/null +++ b/Apps/Adobe Acrobat Reader/Deploy-Application.ps1 @@ -0,0 +1,227 @@ +<# +.SYNOPSIS + This script performs the installation or uninstallation of an application(s). + # LICENSE # + PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. + Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . +.DESCRIPTION + The script is provided as a template to perform an install or uninstall of an application(s). + The script either performs an "Install" deployment type or an "Uninstall" deployment type. + The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. +.PARAMETER DeploymentType + The type of deployment to perform. Default is: Install. +.PARAMETER DeployMode + Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. +.PARAMETER AllowRebootPassThru + Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. +.PARAMETER TerminalServerMode + Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers. +.PARAMETER DisableLogging + Disables logging to file for the script. Default is: $false. +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" +.EXAMPLE + powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" +.EXAMPLE + Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" +.NOTES + Toolkit Exit Code Ranges: + 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 + 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 + 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 +.LINK + http://psappdeploytoolkit.com +#> +[CmdletBinding()] +Param ( + [Parameter(Mandatory=$false)] + [ValidateSet('Install','Uninstall')] + [string]$DeploymentType = 'Install', + [Parameter(Mandatory=$false)] + [ValidateSet('Interactive','Silent','NonInteractive')] + [string]$DeployMode = 'Interactive', + [Parameter(Mandatory=$false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory=$false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory=$false)] + [switch]$DisableLogging = $false +) + +Try { + ## Set the script execution policy for this process + Try { Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' } Catch {} + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Main Application + [string]$appVendor = '###APPPUBLISHER###' + [string]$appName = '###INTUNEAPPNAME###' + [string]$appVersion = '###VERSION###' + [string]$appArch = '' + [string]$appLang = '' + ## Variables: Additional applications + ## - Not required + ## Variables: Application package details + [string]$appRevision = '1.0' + [string]$appScriptVersion = '3.7.0' + [string]$appScriptDate = '###DATETIME###' + [string]$appScriptAuthor = 'IntuneAppFactory' + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [string]$installName = '' + [string]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [int32]$mainExitCode = 0 + + ## Variables: Script + [string]$deployAppScriptFriendlyName = 'Deploy Application' + [version]$deployAppScriptVersion = [version]'3.7.0' + [string]$deployAppScriptDate = '02/13/2018' + [hashtable]$deployAppScriptParameters = $psBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation } + [string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." } + If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain } + } + Catch { + If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [string]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + #Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Remove-MSIApplicationsEx -Name "" + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [string]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } } + } + + ## ******************************************* + + ## SAMPLE: EXE + $exeInstall = "###SETUPFILENAME###" + $exeInstallParams = "/S" + Execute-Process -Path "$($dirFiles)\$($exeInstall)" -Parameters "$($exeInstallParams)" + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [string]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } + } + ElseIf ($deploymentType -ieq 'Uninstall') + { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } + Execute-MSI @ExecuteDefaultMSISplat + } + + # ******************************************* + + #Uninstall any previous versions of application by calling the command from Uninstall-string + $AppList = Get-InstalledApplication -Name 'Adobe Acrobat Reader' + foreach ($App in $AppList) { + if ($App.UninstallString) { + $UninstallPath = $App.UninstallString -replace '"', '' + if (Test-Path -Path $UninstallPath) { + Write-log -Message "Found $($App.DisplayName) ($($App.DisplayVersion)) and a valid uninstall string, now attempting to uninstall." + Execute-Process -Path $UninstallPath -Parameters '/S' + Start-Sleep -Seconds 5 + } + } + } + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [string]$installPhase = 'Post-Uninstallation' + + ## + + } + + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode +} +Catch { + [int32]$mainExitCode = 60001 + [string]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +} \ No newline at end of file diff --git a/Apps/Adobe Acrobat Reader/Icon.png b/Apps/Adobe Acrobat Reader/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..275932b0fd0c1f3c2f856264e60ff83c8306da2c GIT binary patch literal 71174 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 z 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 ud", + "AppVersion": "", + "Description": "Photoshop testing", + "Publisher": "", + "Notes": "", + "Owner": "" + }, + "Program": { + "InstallCommand": "Deploy-Application.exe Install", + "UninstallCommand": "Deploy-Application.exe Uninstall", + "InstallExperience": "user", + "DeviceRestartBehavior": "suppress", + "AllowAvailableUninstall": "true" + }, + "RequirementRule": { + "MinimumSupportedWindowsRelease": "W10_21H1", + "Architecture": "x64" + }, + "CustomRequirementRule": [ + ], + "DetectionRule": [ + { + "Type": "Registry", + "DetectionMethod": "VersionComparison", + "KeyPath": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\###PRODUCTCODE###", + "ValueName": "DisplayVersion", + "Operator": "greaterThanOrEqual", + "Value": "6.0.0.571", + "Check32BitOn64System": "false" + } + ] +} \ No newline at end of file diff --git a/Apps/Adobe Photoshop/Deploy-Application.ps1 b/Apps/Adobe Photoshop/Deploy-Application.ps1 new file mode 100644 index 0000000..16fbf0e --- /dev/null +++ b/Apps/Adobe Photoshop/Deploy-Application.ps1 @@ -0,0 +1,351 @@ +<# +.SYNOPSIS + +PSApppDeployToolkit - This script performs the installation or uninstallation of an application(s). + +.DESCRIPTION + +- The script is provided as a template to perform an install or uninstall of an application(s). +- The script either performs an "Install" deployment type or an "Uninstall" deployment type. +- The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + +The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +.PARAMETER DeploymentType + +The type of deployment to perform. Default is: Install. + +.PARAMETER DeployMode + +Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. + +.PARAMETER AllowRebootPassThru + +Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. + +.PARAMETER TerminalServerMode + +Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Desktop Session Hosts/Citrix servers. + +.PARAMETER DisableLogging + +Disables logging to file for the script. Default is: $false. + +.EXAMPLE + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" + +.EXAMPLE + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" + +.EXAMPLE + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" + +.EXAMPLE + +Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + +.NOTES + +Toolkit Exit Code Ranges: +- 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 +- 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 +- 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 + +.LINK + +https://psappdeploytoolkit.com +#> + + +[CmdletBinding()] +Param ( + [Parameter(Mandatory = $false)] + [ValidateSet('Install', 'Uninstall', 'Repair')] + [String]$DeploymentType = 'Install', + [Parameter(Mandatory = $false)] + [ValidateSet('Interactive', 'Silent', 'NonInteractive')] + [String]$DeployMode = 'Interactive', + [Parameter(Mandatory = $false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory = $false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory = $false)] + [switch]$DisableLogging = $false +) + +Try { + ## Set the script execution policy for this process + Try { + Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' + } + Catch { + } + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Main Application + [string]$appVendor = '###APPPUBLISHER###' + [string]$appName = '###INTUNEAPPNAME###' + [string]$appVersion = '###VERSION###' + [string]$appArch = '' + [string]$appLang = '' + ## Variables: Additional applications + ## - Not required + ## Variables: Application package details + [string]$appRevision = '1.0' + [string]$appScriptVersion = '3.9.3' + [string]$appScriptDate = '###DATETIME###' + [string]$appScriptAuthor = 'IntuneAppFactory' + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [String]$installName = '' + [String]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [Int32]$mainExitCode = 0 + + ## Variables: Script + [String]$deployAppScriptFriendlyName = 'Deploy Application' + [Version]$deployAppScriptVersion = [Version]'3.9.3' + [String]$deployAppScriptDate = '02/05/2023' + [Hashtable]$deployAppScriptParameters = $PsBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $InvocationInfo = $HostInvocation + } + Else { + $InvocationInfo = $MyInvocation + } + [String]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [String]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { + Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." + } + If ($DisableLogging) { + . $moduleAppDeployToolkitMain -DisableLogging + } + Else { + . $moduleAppDeployToolkitMain + } + } + Catch { + If ($mainExitCode -eq 0) { + [Int32]$mainExitCode = 60008 + } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $script:ExitCode = $mainExitCode; Exit + } + Else { + Exit $mainExitCode + } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall' -and $deploymentType -ine 'Repair') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [String]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { + $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } + } + } + + ## <<<<<<<<<<<<<<< Perform Installation tasks here>>>>>>>>>>>>>>>> + + ## SAMPLE: EXE + $exeInstall = "###SETUPFILENAME###" + Execute-Process -Path "$($dirFiles)\$($exeInstall)" --silent" + + ## SAMPLE: PowerShell Script + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -File ""$($dirFiles)\ScriptName.ps1""" + + ## SAMPLE: PowerShell Script + parameter input + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -Command ""& '$($dirFiles)\ScriptName.ps1' -Parameter Input""" + + ## SAMPLE: MSI + #$msiInstall = "###SETUPFILENAME###" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + Params + #$msiInstall = "###SETUPFILENAME###" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + ## SAMPLE: MSI + MST + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + MST + Params + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } + } + ElseIf ($deploymentType -ieq 'Uninstall') { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + + ## + + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Execute-MSI -Action "Uninstall" -Path "" + + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Uninstallation' + + ## + + + } + ElseIf ($deploymentType -ieq 'Repair') { + ##*=============================================== + ##* PRE-REPAIR + ##*=============================================== + [String]$installPhase = 'Pre-Repair' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + ##*=============================================== + ##* REPAIR + ##*=============================================== + [String]$installPhase = 'Repair' + + ## Handle Zero-Config MSI Repairs + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Repair'; Path = $defaultMsiFile; }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + ## + + ##*=============================================== + ##* POST-REPAIR + ##*=============================================== + [String]$installPhase = 'Post-Repair' + + ## + + + } + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode +} +Catch { + [Int32]$mainExitCode = 60001 + [String]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +} diff --git a/Apps/Adobe Photoshop/Icon.png b/Apps/Adobe Photoshop/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..34f115ae1e20de4a629cc9f231355d62cad35f67 GIT binary patch literal 14349 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", + "AppPublisher": "<>", + "AppSource": "<>", + "AppID": "<>", + "AppFolderName": "<>", + "AppSetupFileName": "<>", +} +``` +### IntuneAppname +The display name for the application in Intune. Field is freetext. + +### AppPublisher +Who published the app. Field is freetext. + +### AppSource +Pick a repository to check for new versions. + +### AppID +The AppID is found in the specific repo - here an example from winget: + +![winget example for 7zip](7zipexample.png) + +### AppFolderName +We need to create a folder for our new App. In the "Apps" folder, create a new folder for your Application, and write the name of that new folder here. + +### AppSetupFileName +Whatever the name of the installer is, should be inputted here. + +# Apps folder +Next step is creating a folder in the "Apps" section with the name of your new Application. + +If you're in any doubt, look at the other apps in the applist.json file. +If you're using the Evergreen Repo, do note that you need to add some filter options to the app: + +```powershell +{ + "IntuneAppName": "<>", + "AppPublisher": "<>", + "AppSource": "<>", + "AppID": "<>", + "AppFolderName": "<>", + "AppSetupFileName": "<>", +} +``` + +The folder _has_ to contain the following: + +- an App.json file +- an Icon.png file +- some kind of deployment script + + +### _app.json file_ +In the template folder, grab the app.json file and copy it to your new folder. The fields with should be left alone. + +### _icon.png file_ +Should be selfexplanatory as well - the icon that is uploaded in Intune. The file **has to be named Icon.png** or the pipeline will fail. + +### _some kind of deployment script_ +use the deploy-application.ps1 from the template folder and use one of the sample lines if you dont have any crazy installation instructions for your app. + +### app.json rundown +Lets start with having a look at the app.json file. Open up the template folder and look at the App.json file in there for starters. + +As said, you'll find that a lot of the fields are inputted with <>. That means 'leave this field, the pipeline will take care of these values'! If you have intune experience, you'll find that these fields represent a similar box in Intune if you were to deploy the app yourself. + +Copy over the app.json to your new applcation folder. Write a description in line 12, and go through all the lines that has "Select value" listed. + +If you're ever in doubt about the detection rule, install the app and have a look at the registry for this application - preferably the version comparison if at all possible. This should be your go-to - detection rules that looks at files will eventually have issues because files change names in versions, changes extensions, changes folders.. You get the idea. + +### Icon.png rundown +Icon.png should be self-explanatory. pick an Icon, name it as said - the pipeline will throw an error if it's named anything else. + +### Deploy-application.ps1 rundown +deploy-application.ps1 is a lot of text, but what we really want to look at is the section that says ###installation###. In there, pick an install line that is suitable and do the same for uninstall. Then move on. + +# What about storage account based apps? + +We have the latest.json file for that! Grab that file from the template folder, fill out the name of the setup file and the setup version, and you're good to go. +Whenever you need to update the Application, make sure you update the 'setupversion' line as well, and the pipeline will push the new version for you. + +```powershell +{ + "SetupName": "", + "SetupVersion": "" +} +``` +And yes, you still need to create a folder for it in the 'apps' section. Those files are mandatory. just make a note that in the applist.json file we dont point at a repo, but at our storage account. Speaking of which.. +The applist.json file looks a little bit different: + +```powershell +{ + "IntuneAppName": "7-Zip", + "AppPublisher": "Igor Pavlov", + "AppSource": "StorageAccount", + "AppID": "", + "AppFolderName": "7zip", + "AppSetupFileName": "setup_7zip.msi", + "StorageAccountName": "mseazdevopsapps", + "StorageAccountContainerName": "7Zip" +} +``` +AppID should remain blank, we're not asking any repos for the ID so this is not needed, and the StorageAccountName & StorageAccountContainerName is added. Storageaccountname should be selfexplanatory, the ContainerName should be the name of a fresh container for the setupfile and latest.json file. + +![storage account example](containerexample.png) \ No newline at end of file diff --git a/README.md b/README.md index 782095a..1b4fafb 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ # IntuneAppFactory -IntuneAppFactory is a set of PowerShell scripts used in an Azure DevOps Pipeline to detect, download, package and publish onboarded applications as a Win32 application to Intune, to ensure the latest version of onboarded applications are available in Intune. \ No newline at end of file +IntuneAppFactory is a set of PowerShell scripts used in an Azure DevOps Pipeline to detect, download, package and publish onboarded applications as a Win32 application to Intune, to ensure the latest version of onboarded applications are available in Intune. + +Currently IntuneAppFactory supports the following repositories: +- Winget +- Evergreen +- In-house applications can also be deployed and intalled via the Storage Account created for the Pipeline Agent. + +If you're new to this, have a look at the [CreateNewApp file!](CreateNewApp.md) \ No newline at end of file diff --git a/Scripts/Install-Modules.ps1 b/Scripts/Install-Modules.ps1 index 20fb2e5..4a84822 100644 --- a/Scripts/Install-Modules.ps1 +++ b/Scripts/Install-Modules.ps1 @@ -5,5 +5,5 @@ $PackageProvider = Install-PackageProvider -Name "NuGet" -Force $Modules = @("Evergreen", "IntuneWin32App", "MSGraphRequest", "Az.Storage", "Az.Resources") foreach ($Module in $Modules) { Write-Output -InputObject "Attempting to install the following module: $($Module)" - Install-Module -Name $Module -Force -Confirm:$false + Install-Module -Name $Module -Force -AllowClobber -Confirm:$false } \ No newline at end of file diff --git a/Scripts/New-Win32App.ps1 b/Scripts/New-Win32App.ps1 index dd29c35..e40b007 100644 --- a/Scripts/New-Win32App.ps1 +++ b/Scripts/New-Win32App.ps1 @@ -170,6 +170,7 @@ Process { # Create required .intunewin package from source folder Write-Output -InputObject "Creating .intunewin package file from source folder" + Invoke-WebRequest -URI "https://github.com/microsoft/Microsoft-Win32-Content-Prep-Tool/raw/1a00a2a786de646c5fc46d6e1b79988c636e764e/IntuneWinAppUtil.exe" -outfile "$env:TEMP\IntuneWinAppUtil.exe" $IntuneAppPackage = New-IntuneWin32AppPackage -SourceFolder $SourceFolder -SetupFile $AppData.PackageInformation.SetupFile -OutputFolder $OutputFolder # Create default requirement rule diff --git a/Templates/Application/Deploy-Application.ps1 b/Templates/Application/Deploy-Application.ps1 index d50ef9d..6e437d4 100644 --- a/Templates/Application/Deploy-Application.ps1 +++ b/Templates/Application/Deploy-Application.ps1 @@ -208,7 +208,39 @@ Try { } } - ## + ## <<<<<<<<<<<<<<< Perform Installation tasks here>>>>>>>>>>>>>>>> + + ## SAMPLE: EXE + #$exeInstall = "###SETUPFILENAME###" + #$exeInstallParams = "" + #Execute-Process -Path "$($dirFiles)\$($exeInstall)" -Parameters "$($exeInstallParams)" + + ## SAMPLE: PowerShell Script + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -File ""$($dirFiles)\ScriptName.ps1""" + + ## SAMPLE: PowerShell Script + parameter input + #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -Command ""& '$($dirFiles)\ScriptName.ps1' -Parameter Input""" + + ## SAMPLE: MSI + #$msiInstall = "###SETUPFILENAME###" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + Params + #$msiInstall = "###SETUPFILENAME###" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + + ## SAMPLE: MSI + MST + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" + + ## SAMPLE: MSI + MST + Params + #$msiInstall = "###SETUPFILENAME###" + #$mstInstall = "setup.mst" + #$msiInstallParams = "" + #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams + ##*=============================================== @@ -251,6 +283,12 @@ Try { ## + ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string + #Remove-MSIApplications -Name "" + + ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x + #Execute-MSI -Action "Uninstall" -Path "" + ##*=============================================== ##* POST-UNINSTALLATION diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitBanner.png b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitBanner.png index 891d1da21eda9bbd307860d5f8f7bfa16ac40001..e8eb310f1566723287315c999c2bedd019f099d4 100644 GIT binary patch literal 11569 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 S_Y2{Sq$vAdrb_A){Qm&9A@*MY literal 6288 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 diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitConfig.xml b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitConfig.xml index bfe3eeb149141ff9aa6b9f42a814adbd8e85f39e..59ffc4e2831a344b4ff2ee2093153757bdae330f 100644 GIT binary patch literal 101067 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 z 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 literal 148458 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

crY215gM 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 J*@LF{|3A|{Hdg=u diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitExtensions.ps1 b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitExtensions.ps1 index 953e633..7dc5a5a 100644 --- a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitExtensions.ps1 +++ b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitExtensions.ps1 @@ -1,497 +1,65 @@ <# .SYNOPSIS - This script is a template that allows you to extend the toolkit with your own custom functions. - # LICENSE # - PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. - Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. - This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . -.DESCRIPTION - The script is automatically dot-sourced by the AppDeployToolkitMain.ps1 script. -.NOTES - Toolkit Exit Code Ranges: - 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 - 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 - 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 -.LINK - http://psappdeploytoolkit.com -#> -[CmdletBinding()] -Param ( -) - -##*=============================================== -##* VARIABLE DECLARATION -##*=============================================== - -# Variables: Script -[string]$appDeployToolkitExtName = 'PSAppDeployToolkitExt' -[string]$appDeployExtScriptFriendlyName = 'App Deploy Toolkit Extensions' -[version]$appDeployExtScriptVersion = [version]'1.5.0' -[string]$appDeployExtScriptDate = '02/12/2017' -[hashtable]$appDeployExtScriptParameters = $PSBoundParameters - -##*=============================================== -##* FUNCTION LISTINGS -##*=============================================== - -# Add-ScheduledTask - Function that creates a scheduled task -function Add-ScheduledTask { - param( - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Specify the scheduled task should be based on an interval trigger.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [switch]$Interval, - - [parameter(Mandatory = $true, ParameterSetName = "Event", HelpMessage = "Specify the scheduled task should be based on an event trigger.")] - [switch]$Event, - [parameter(Mandatory = $true, ParameterSetName = "Daily", HelpMessage = "Specify the interval trigger type as daily.")] - [switch]$Daily, +PSAppDeployToolkit - Provides the ability to extend and customise the toolkit by adding your own functions that can be re-used. - [parameter(Mandatory = $true, ParameterSetName = "Hourly", HelpMessage = "Specify the interval trigger type as hourly.")] - [switch]$Hourly, - - [parameter(Mandatory = $true, ParameterSetName = "Minutes", HelpMessage = "Specify the interval trigger type as minutes.")] - [switch]$Minutes, +.DESCRIPTION - [parameter(Mandatory = $true, ParameterSetName = "Event", HelpMessage = "Specify the event based trigger type.")] - [ValidateNotNullOrEmpty()] - [ValidateSet("AtWorkstationUnlock", "AtLogon", "AtStartup")] - [string[]]$Trigger, +This script is a template that allows you to extend the toolkit with your own custom functions. - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Set the interval trigger frequency.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [ValidateNotNullOrEmpty()] - [int]$Frequency, +This script is dot-sourced by the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. - [parameter(Mandatory = $false, ParameterSetName = "Interval", HelpMessage = "Set the start time of the interval trigger, only required when daily interval is used.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [ValidateNotNullOrEmpty()] - [datetime]$Time, +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Specify the name of the scheduled task.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [parameter(Mandatory = $true, ParameterSetName = "Event")] - [ValidateNotNullOrEmpty()] - [string]$Name, +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Specify the path of the scheduled task, e.g. '\' when using the root path.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [parameter(Mandatory = $true, ParameterSetName = "Event")] - [ValidateNotNullOrEmpty()] - [string]$Path, +.EXAMPLE - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Specify the process name of the action the scheduled task triggers.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [parameter(Mandatory = $true, ParameterSetName = "Event")] - [ValidateNotNullOrEmpty()] - [string]$ProcessName, +powershell.exe -File .\AppDeployToolkitHelp.ps1 - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Specify arguments for the process triggered by the action.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [parameter(Mandatory = $true, ParameterSetName = "Event")] - [ValidateNotNullOrEmpty()] - [string]$Arguments, +.INPUTS - [parameter(Mandatory = $true, ParameterSetName = "Interval", HelpMessage = "Specify whether the scheduled task will run in System or User context.")] - [parameter(Mandatory = $true, ParameterSetName = "Daily")] - [parameter(Mandatory = $true, ParameterSetName = "Hourly")] - [parameter(Mandatory = $true, ParameterSetName = "Minutes")] - [parameter(Mandatory = $true, ParameterSetName = "Event")] - [ValidateNotNullOrEmpty()] - [ValidateSet("System", "User")] - [string]$Principal, +None - [parameter(Mandatory = $false, ParameterSetName = "Interval", HelpMessage = "Specify whether a random delay of the scheduled task trigger should occurr.")] - [parameter(Mandatory = $false, ParameterSetName = "Daily")] - [parameter(Mandatory = $false, ParameterSetName = "Hourly")] - [parameter(Mandatory = $false, ParameterSetName = "Minutes")] - [parameter(Mandatory = $false, ParameterSetName = "Event")] - [ValidateNotNullOrEmpty()] - [int]$RandomDelayInMinutes - ) - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - try { - # Construct scheduled task action - $TaskAction = New-ScheduledTaskAction -Execute $ProcessName -Argument $Arguments -ErrorAction Stop +You cannot pipe objects to this script. - # Construct the scheduled task principal - switch ($Principal) { - "System" { - $TaskPrincipal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType "ServiceAccount" -RunLevel "Highest" -ErrorAction Stop - } - "User" { - $TaskPrincipal = New-ScheduledTaskPrincipal -GroupId "BUILTIN\Users" -RunLevel "Highest" -ErrorAction - } - } +.OUTPUTS - # Construct array list for scheduled task triggers - $TaskTriggerList = New-Object -TypeName "System.Collections.ArrayList" +None - if ($PSBoundParameters["Interval"]) { - # Construct the scheduled task trigger for interval selection - switch ($PSCmdlet.ParameterSetName) { - "Daily" { - $TaskTriggerArgs = @{ - "At" = $Time - "Daily" = $true - "DaysInterval" = $Frequency - } - if ($PSBoundParameters["RandomDelayInMinutes"]) { - $TaskTriggerArgs.Add("RandomDelay", (New-TimeSpan -Minutes $RandomDelayInMinutes)) - } - $TaskTrigger = New-ScheduledTaskTrigger @TaskTriggerArgs - } - "Hourly" { - $TaskTriggerArgs = @{ - "Once" = $true - "At" = $Time - "RepetitionInterval" = (New-TimeSpan -Hours $Frequency) - } - if ($PSBoundParameters["RandomDelayInMinutes"]) { - $TaskTriggerArgs.Add("RandomDelay", (New-TimeSpan -Minutes $RandomDelayInMinutes)) - } - $TaskTrigger = New-ScheduledTaskTrigger @TaskTriggerArgs - } - "Minutes" { - $TaskTriggerArgs = @{ - "Once" = $true - "At" = $Time - "RepetitionInterval" = (New-TimeSpan -Minutes $Frequency) - } - if ($PSBoundParameters["RandomDelayInMinutes"]) { - $TaskTriggerArgs.Add("RandomDelay", (New-TimeSpan -Minutes $RandomDelayInMinutes)) - } - $TaskTrigger = New-ScheduledTaskTrigger @TaskTriggerArgs - } - } +This script does not generate any output. - # Add scheduled task trigger to list - $TaskTriggerList.Add($TaskTrigger) | Out-Null - } +.NOTES - if ($PSBoundParameters["Event"]) { - # Construct the scheduled task trigger for each event-based selection - foreach ($EventItem in $Trigger) { - switch ($EventItem) { - "AtWorkstationUnlock" { - $StateChangeTrigger = Get-CimClass -Namespace "root\Microsoft\Windows\TaskScheduler" -ClassName "MSFT_TaskSessionStateChangeTrigger" - $TaskTrigger = New-CimInstance -CimClass $StateChangeTrigger -Property @{ StateChange = 8 } -ClientOnly - } - "AtLogon" { - $TaskTrigger = New-ScheduledTaskTrigger -AtLogOn - } - "AtStartup" { - $TaskTrigger = New-ScheduledTaskTrigger -AtStartup - } - } +.LINK - # Add scheduled task trigger to list - $TaskTriggerList.Add($TaskTrigger) | Out-Null - } - } +https://psappdeploytoolkit.com +#> - # Construct the scheduled task settings - $TaskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -Hidden -DontStopIfGoingOnBatteries -Compatibility "Win8" -RunOnlyIfNetworkAvailable -MultipleInstances "IgnoreNew" -ErrorAction Stop - # Construct the scheduled task XML data - $ScheduledTask = New-ScheduledTask -Action $TaskAction -Principal $TaskPrincipal -Settings $TaskSettings -Trigger $TaskTriggerList -ErrorAction Stop +[CmdletBinding()] +Param ( +) - # Register the scheduled task - $Task = Register-ScheduledTask -InputObject $ScheduledTask -TaskName $Name -TaskPath $Path -ErrorAction Stop - } - catch [System.Exception] { - Write-Log -Message "Failed to create notification scheduled task. Error message: $($_.Exception.Message)." -Source ${CmdletName} - } - } -} +##*=============================================== +##* VARIABLE DECLARATION +##*=============================================== -# Get-LatestGoogleChromeInstaller (added to support direct download of the latest stable Google Chrome browser Enterprise MSI setup file) -function Get-LatestGoogleChromeInstaller { - param( - [parameter(Mandatory = $false, HelpMessage = "Select the desired channel, either Stable, Beta or Dev.")] - [ValidateNotNullOrEmpty()] - [ValidateSet("Stable", "Beta", "Dev")] - [string]$Channel = "Stable" - ) - $ChromeReleasesURI = "https://omahaproxy.appspot.com/all.json" - $ChromeReleasesContentJSON = Invoke-WebRequest -Uri $ChromeReleasesURI -UseBasicParsing - $ChromeReleasesContent = $ChromeReleasesContentJSON | ConvertFrom-Json - $ChromeReleasesOSContent = $ChromeReleasesContent | Where-Object { $_.os -like "win64" } - foreach ($ChromeVersion in $ChromeReleasesOSContent.versions) { - if ($ChromeVersion.channel -like $Channel.ToLower()) { - switch ($Channel) { - "Stable" { - $ChannelURI = "/dl/chrome/install/googlechromestandaloneenterprise64.msi" - } - "Beta" { - $ChannelURI = "/dl/chrome/install/beta/googlechromebetastandaloneenterprise64.msi" - } - "Dev" { - $ChannelURI = "/dl/chrome/install/dev/googlechromedevstandaloneenterprise64.msi" - } - } +# Variables: Script +[string]$appDeployToolkitExtName = 'PSAppDeployToolkitExt' +[string]$appDeployExtScriptFriendlyName = 'App Deploy Toolkit Extensions' +[version]$appDeployExtScriptVersion = [version]'3.9.3' +[string]$appDeployExtScriptDate = '02/05/2023' +[hashtable]$appDeployExtScriptParameters = $PSBoundParameters - $PSObject = [PSCustomObject]@{ - Channel = $Channel - Version = $ChromeVersion.current_version - Date = ([DateTime]::ParseExact($ChromeVersion.current_reldate.Trim(), 'MM/dd/yy', [CultureInfo]::InvariantCulture)) - URL = -join@("https://dl.google.com", $ChannelURI) - FileName = "googlechrome{0}standaloneenterprise64.msi" -f $Channel.ToLower() - } - Write-Output -InputObject $PSObject - } - } -} +##*=============================================== +##* FUNCTION LISTINGS +##*=============================================== -# Remove-MSIApplicationsEx (added to support removal of MSI applications that doesn't contain an Uninstall value in the registry) -Function Remove-MSIApplicationsEx { - <# - .SYNOPSIS - Removes all MSI applications matching the specified application name. - .DESCRIPTION - Removes all MSI applications matching the specified application name. - Enumerates the registry for installed applications matching the specified application name and uninstalls that application using the product code, provided the uninstall string matches "msiexec". - .PARAMETER Name - The name of the application to uninstall. Performs a contains match on the application display name by default. - .PARAMETER Exact - Specifies that the named application must be matched using the exact name. - .PARAMETER WildCard - Specifies that the named application must be matched using a wildcard search. - .PARAMETER Parameters - Overrides the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". - .PARAMETER AddParameters - Adds to the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". - .PARAMETER FilterApplication - Two-dimensional array that contains one or more (property, value, match-type) sets that should be used to filter the list of results returned by Get-InstalledApplication to only those that should be uninstalled. - Properties that can be filtered upon: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication - .PARAMETER ExcludeFromUninstall - Two-dimensional array that contains one or more (property, value, match-type) sets that should be excluded from uninstall if found. - Properties that can be excluded: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication - .PARAMETER IncludeUpdatesAndHotfixes - Include matches against updates and hotfixes in results. - .PARAMETER LoggingOptions - Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". - .PARAMETER LogName - Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. - For uninstallations, by default the product code is resolved to the DisplayName and version of the application. - .PARAMETER PassThru - Returns ExitCode, STDOut, and STDErr output from the process. - .PARAMETER ContinueOnError - Continue if an exit code is returned by msiexec that is not recognized by the App Deploy Toolkit. Default is: $true. - .EXAMPLE - Remove-MSIApplications -Name 'Adobe Flash' - Removes all versions of software that match the name "Adobe Flash" - .EXAMPLE - Remove-MSIApplications -Name 'Adobe' - Removes all versions of software that match the name "Adobe" - .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication ('Is64BitApplication', $false, 'Exact'),('Publisher', 'Oracle Corporation', 'Exact') - Removes all versions of software that match the name "Java 8 Update" where the software is 32-bits and the publisher is "Oracle Corporation". - .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication (,('Publisher', 'Oracle Corporation', 'Exact')) -ExcludeFromUninstall (,('DisplayName', 'Java 8 Update 45', 'Contains')) - Removes all versions of software that match the name "Java 8 Update" and also have "Oracle Corporation" as the Publisher; however, it does not uninstall "Java 8 Update 45" of the software. - NOTE: if only specifying a single row in the two-dimensional arrays, the array must have the extra parentheses and leading comma as in this example. - .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall (,('DisplayName', 'Java 8 Update 45', 'Contains')) - Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall "Java 8 Update 45" of the software. - NOTE: if only specifying a single row in the two-dimensional array, the array must have the extra parentheses and leading comma as in this example. - .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall - ('Is64BitApplication', $true, 'Exact'), - ('DisplayName', 'Java 8 Update 45', 'Exact'), - ('DisplayName', 'Java 8 Update 4*', 'WildCard'), - ('DisplayName', 'Java \d Update \d{3}', 'RegEx'), - ('DisplayName', 'Java 8 Update', 'Contains') - Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall 64-bit versions of the software, Update 45 of the software, or any Update that starts with 4. - .NOTES - More reading on how to create arrays if having trouble with -FilterApplication or -ExcludeFromUninstall parameter: http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx - .LINK - http://psappdeploytoolkit.com - #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [switch]$Exact = $false, - [Parameter(Mandatory=$false)] - [switch]$WildCard = $false, - [Parameter(Mandatory=$false)] - [Alias('Arguments')] - [ValidateNotNullorEmpty()] - [string]$Parameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$AddParameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [array]$FilterApplication = @(@()), - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [array]$ExcludeFromUninstall = @(@()), - [Parameter(Mandatory=$false)] - [switch]$IncludeUpdatesAndHotfixes = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$LoggingOptions, - [Parameter(Mandatory=$false)] - [Alias('LogName')] - [string]$private:LogName, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Build the hashtable with the options that will be passed to Get-InstalledApplication using splatting - [hashtable]$GetInstalledApplicationSplat = @{ Name = $name } - If ($Exact) { $GetInstalledApplicationSplat.Add( 'Exact', $Exact) } - ElseIf ($WildCard) { $GetInstalledApplicationSplat.Add( 'WildCard', $WildCard) } - If ($IncludeUpdatesAndHotfixes) { $GetInstalledApplicationSplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) } - - [psobject[]]$installedApplications = Get-InstalledApplication @GetInstalledApplicationSplat - - Write-Log -Message "Found [$($installedApplications.Count)] application(s) that matched the specified criteria [$Name]." -Source ${CmdletName} - - ## Filter the results from Get-InstalledApplication - [Collections.ArrayList]$removeMSIApplications = New-Object -TypeName 'System.Collections.ArrayList' - If (($null -ne $installedApplications) -and ($installedApplications.Count)) { - ForEach ($installedApplication in $installedApplications) { - If ([string]::IsNullOrEmpty($installedApplication.ProductCode)) { - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName)] because unable to discover MSI ProductCode from application's registry Uninstall subkey [$($installedApplication.UninstallSubkey)]." -Severity 2 -Source ${CmdletName} - Continue - } - - # Filter the results from Get-InstalledApplication to only those that should be uninstalled - If (($null -ne $FilterApplication) -and ($FilterApplication.Count)) { - Write-Log -Message "Filter the results to only those that should be uninstalled as specified in parameter [-FilterApplication]." -Source ${CmdletName} - [boolean]$addAppToRemoveList = $false - ForEach ($Filter in $FilterApplication) { - If ($Filter[2] -eq 'RegEx') { - If ($installedApplication.($Filter[0]) -match $Filter[1]) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - ElseIf ($Filter[2] -eq 'Contains') { - If ($installedApplication.($Filter[0]) -match [regex]::Escape($Filter[1])) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - ElseIf ($Filter[2] -eq 'WildCard') { - If ($installedApplication.($Filter[0]) -like $Filter[1]) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - ElseIf ($Filter[2] -eq 'Exact') { - If ($installedApplication.($Filter[0]) -eq $Filter[1]) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - } - } - Else { - [boolean]$addAppToRemoveList = $true - } - - # Filter the results from Get-InstalledApplication to remove those that should never be uninstalled - If (($null -ne $ExcludeFromUninstall) -and ($ExcludeFromUninstall.Count)) { - ForEach ($Exclude in $ExcludeFromUninstall) { - If ($Exclude[2] -eq 'RegEx') { - If ($installedApplication.($Exclude[0]) -match $Exclude[1]) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - ElseIf ($Exclude[2] -eq 'Contains') { - If ($installedApplication.($Exclude[0]) -match [regex]::Escape($Exclude[1])) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - ElseIf ($Exclude[2] -eq 'WildCard') { - If ($installedApplication.($Exclude[0]) -like $Exclude[1]) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - ElseIf ($Exclude[2] -eq 'Exact') { - If ($installedApplication.($Exclude[0]) -eq $Exclude[1]) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - } - } - - If ($addAppToRemoveList) { - Write-Log -Message "Adding application to list for removal: [$($installedApplication.DisplayName) $($installedApplication.Version)]." -Source ${CmdletName} - $removeMSIApplications.Add($installedApplication) - } - } - } - - ## Build the hashtable with the options that will be passed to Execute-MSI using splatting - [hashtable]$ExecuteMSISplat = @{ Action = 'Uninstall'; Path = '' } - If ($ContinueOnError) { $ExecuteMSISplat.Add( 'ContinueOnError', $ContinueOnError) } - If ($Parameters) { $ExecuteMSISplat.Add( 'Parameters', $Parameters) } - ElseIf ($AddParameters) { $ExecuteMSISplat.Add( 'AddParameters', $AddParameters) } - If ($LoggingOptions) { $ExecuteMSISplat.Add( 'LoggingOptions', $LoggingOptions) } - If ($LogName) { $ExecuteMSISplat.Add( 'LogName', $LogName) } - If ($PassThru) { $ExecuteMSISplat.Add( 'PassThru', $PassThru) } - If ($IncludeUpdatesAndHotfixes) { $ExecuteMSISplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) } - - If (($null -ne $removeMSIApplications) -and ($removeMSIApplications.Count)) { - ForEach ($removeMSIApplication in $removeMSIApplications) { - Write-Log -Message "Remove application [$($removeMSIApplication.DisplayName) $($removeMSIApplication.Version)]." -Source ${CmdletName} - $ExecuteMSISplat.Path = $removeMSIApplication.ProductCode - If ($PassThru) { - [psobject[]]$ExecuteResults += Execute-MSI @ExecuteMSISplat - } - Else { - Execute-MSI @ExecuteMSISplat - } - } - } - Else { - Write-Log -Message 'No applications found for removal. Continue...' -Source ${CmdletName} - } - } - End { - If ($PassThru) { Write-Output -InputObject $ExecuteResults } - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } -} +# ##*=============================================== ##* END FUNCTION LISTINGS @@ -502,12 +70,12 @@ Function Remove-MSIApplicationsEx { ##*=============================================== If ($scriptParentPath) { - Write-Log -Message "Script [$($MyInvocation.MyCommand.Definition)] dot-source invoked by [$(((Get-Variable -Name MyInvocation).Value).ScriptName)]" -Source $appDeployToolkitExtName + Write-Log -Message "Script [$($MyInvocation.MyCommand.Definition)] dot-source invoked by [$(((Get-Variable -Name MyInvocation).Value).ScriptName)]" -Source $appDeployToolkitExtName } Else { - Write-Log -Message "Script [$($MyInvocation.MyCommand.Definition)] invoked directly" -Source $appDeployToolkitExtName + Write-Log -Message "Script [$($MyInvocation.MyCommand.Definition)] invoked directly" -Source $appDeployToolkitExtName } ##*=============================================== ##* END SCRIPT BODY -##*=============================================== \ No newline at end of file +##*=============================================== diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitHelp.ps1 b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitHelp.ps1 index 83c6e4a..339f495 100644 --- a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitHelp.ps1 +++ b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitHelp.ps1 @@ -1,20 +1,45 @@ <# .SYNOPSIS - Displays a graphical console to browse the help for the App Deployment Toolkit functions - # LICENSE # - PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. - Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. - This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +PSApppDeployToolkit - Displays a graphical console to browse the help for the App Deployment Toolkit functions. + .DESCRIPTION - Displays a graphical console to browse the help for the App Deployment Toolkit functions + +Displays a graphical console to browse the help for the App Deployment Toolkit functions + +The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + .EXAMPLE - AppDeployToolkitHelp.ps1 + +powershell.exe -File .\AppDeployToolkitHelp.ps1 + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> + ##*=============================================== ##* VARIABLE DECLARATION ##*=============================================== @@ -22,14 +47,14 @@ ## Variables: Script [string]$appDeployToolkitHelpName = 'PSAppDeployToolkitHelp' [string]$appDeployHelpScriptFriendlyName = 'App Deploy Toolkit Help' -[version]$appDeployHelpScriptVersion = [version]'3.6.5' -[string]$appDeployHelpScriptDate = '02/12/2017' +[version]$appDeployHelpScriptVersion = [version]'3.9.2' +[string]$appDeployHelpScriptDate = '02/02/2023' ## Variables: Environment [string]$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent # Dot source the App Deploy Toolkit Functions . "$scriptDirectory\AppDeployToolkitMain.ps1" -DisableLogging - +. "$scriptDirectory\AppDeployToolkitExtensions.ps1" ##*=============================================== ##* END VARIABLE DECLARATION ##*=============================================== @@ -39,77 +64,81 @@ ##*=============================================== Function Show-HelpConsole { - ## Import the Assemblies - Add-Type -AssemblyName 'System.Windows.Forms' -ErrorAction 'Stop' - Add-Type -AssemblyName System.Drawing -ErrorAction 'Stop' - - ## Form Objects - $HelpForm = New-Object -TypeName 'System.Windows.Forms.Form' - $HelpListBox = New-Object -TypeName 'System.Windows.Forms.ListBox' - $HelpTextBox = New-Object -TypeName 'System.Windows.Forms.RichTextBox' - $InitialFormWindowState = New-Object -TypeName 'System.Windows.Forms.FormWindowState' - - ## Form Code - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 665 - $System_Drawing_Size.Width = 957 - $HelpForm.ClientSize = $System_Drawing_Size - $HelpForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $HelpForm.Name = 'HelpForm' - $HelpForm.Text = 'PowerShell App Deployment Toolkit Help Console' - $HelpForm.WindowState = 'Normal' - $HelpForm.ShowInTaskbar = $true - $HelpForm.FormBorderStyle = 'Fixed3D' - $HelpForm.MaximizeBox = $false - $HelpForm.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon - $HelpListBox.Anchor = 7 - $HelpListBox.BorderStyle = 1 - $HelpListBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $HelpListBox.Font = New-Object -TypeName 'System.Drawing.Font' -ArgumentList ('Microsoft Sans Serif', 9.75, 1, 3, 1) - $HelpListBox.FormattingEnabled = $true - $HelpListBox.ItemHeight = 16 - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 0 - $System_Drawing_Point.Y = 0 - $HelpListBox.Location = $System_Drawing_Point - $HelpListBox.Name = 'HelpListBox' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 658 - $System_Drawing_Size.Width = 271 - $HelpListBox.Size = $System_Drawing_Size - $HelpListBox.Sorted = $true - $HelpListBox.TabIndex = 2 - $HelpListBox.add_SelectedIndexChanged({ $HelpTextBox.Text = Get-Help -Name $HelpListBox.SelectedItem -Full | Out-String }) - $helpFunctions = Get-Command -CommandType 'Function' | Where-Object { ($_.HelpUri -match 'psappdeploytoolkit') -and ($_.Definition -notmatch 'internal script function') } | Select-Object -ExpandProperty Name - ForEach ($helpFunction in $helpFunctions) { - $null = $HelpListBox.Items.Add($helpFunction) - } - $HelpForm.Controls.Add($HelpListBox) - $HelpTextBox.Anchor = 11 - $HelpTextBox.BorderStyle = 1 - $HelpTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $HelpTextBox.Font = New-Object -TypeName 'System.Drawing.Font' -ArgumentList ('Microsoft Sans Serif', 8.5, 0, 3, 1) - $HelpTextBox.ForeColor = [System.Drawing.Color]::FromArgb(255, 0, 0, 0) - $System_Drawing_Point = New-Object -TypeName System.Drawing.Point - $System_Drawing_Point.X = 277 - $System_Drawing_Point.Y = 0 - $HelpTextBox.Location = $System_Drawing_Point - $HelpTextBox.Name = 'HelpTextBox' - $HelpTextBox.ReadOnly = $True - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 658 - $System_Drawing_Size.Width = 680 - $HelpTextBox.Size = $System_Drawing_Size - $HelpTextBox.TabIndex = 1 - $HelpTextBox.Text = '' - $HelpForm.Controls.Add($HelpTextBox) - - ## Save the initial state of the form - $InitialFormWindowState = $HelpForm.WindowState - ## Init the OnLoad event to correct the initial state of the form - $HelpForm.add_Load($OnLoadForm_StateCorrection) - ## Show the Form - $null = $HelpForm.ShowDialog() + ## Import the Assemblies + Add-Type -AssemblyName 'System.Windows.Forms' -ErrorAction 'Stop' + Add-Type -AssemblyName System.Drawing -ErrorAction 'Stop' + + ## Get the default font to use in the user interface + [System.Drawing.Font]$defaultFont = [System.Drawing.SystemFonts]::DefaultFont + + ## Form Objects + $HelpForm = New-Object -TypeName 'System.Windows.Forms.Form' + $HelpListBox = New-Object -TypeName 'System.Windows.Forms.ListBox' + $HelpTextBox = New-Object -TypeName 'System.Windows.Forms.RichTextBox' + $InitialFormWindowState = New-Object -TypeName 'System.Windows.Forms.FormWindowState' + + ## Form Code + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' + $System_Drawing_Size.Height = 665 + $System_Drawing_Size.Width = 957 + $HelpForm.ClientSize = $System_Drawing_Size + $HelpForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $HelpForm.Name = 'HelpForm' + $HelpForm.Text = 'PowerShell App Deployment Toolkit Help Console' + $HelpForm.WindowState = 'Normal' + $HelpForm.ShowInTaskbar = $true + $HelpForm.FormBorderStyle = 'Fixed3D' + $HelpForm.MaximizeBox = $false + $HelpForm.AutoSize = $true + $HelpForm.AutoScaleMode = 'Font' + $HelpForm.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $HelpForm.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon + $HelpListBox.Anchor = 7 + $HelpListBox.BorderStyle = 1 + $HelpListBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $HelpListBox.Font = "$($defaultFont.Name), $($defaultFont.Size + 1), style=Regular" + $HelpListBox.FormattingEnabled = $true + $HelpListBox.ItemHeight = 16 + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' + $System_Drawing_Point.X = 0 + $System_Drawing_Point.Y = 0 + $HelpListBox.Location = $System_Drawing_Point + $HelpListBox.Name = 'HelpListBox' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' + $System_Drawing_Size.Height = 658 + $System_Drawing_Size.Width = 271 + $HelpListBox.Size = $System_Drawing_Size + $HelpListBox.Sorted = $true + $HelpListBox.TabIndex = 2 + $HelpListBox.add_SelectedIndexChanged({ $HelpTextBox.Text = Get-Help -Name $HelpListBox.SelectedItem -Full | Out-String }) + $helpFunctions = Get-Command -CommandType 'Function' | Where-Object { ($_.HelpUri -match 'psappdeploytoolkit') -and ($_.Definition -notmatch 'internal script function') } | Select-Object -ExpandProperty Name + $null = $HelpListBox.Items.AddRange($helpFunctions) + $HelpForm.Controls.Add($HelpListBox) + $HelpTextBox.Anchor = 11 + $HelpTextBox.BorderStyle = 1 + $HelpTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $HelpTextBox.Font = "$($defaultFont.Name), $($defaultFont.Size), style=Regular" + $HelpTextBox.ForeColor = [System.Drawing.Color]::FromArgb(255, 0, 0, 0) + $System_Drawing_Point = New-Object -TypeName System.Drawing.Point + $System_Drawing_Point.X = 277 + $System_Drawing_Point.Y = 0 + $HelpTextBox.Location = $System_Drawing_Point + $HelpTextBox.Name = 'HelpTextBox' + $HelpTextBox.ReadOnly = $True + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' + $System_Drawing_Size.Height = 658 + $System_Drawing_Size.Width = 680 + $HelpTextBox.Size = $System_Drawing_Size + $HelpTextBox.TabIndex = 1 + $HelpTextBox.Text = '' + $HelpForm.Controls.Add($HelpTextBox) + + ## Save the initial state of the form + $InitialFormWindowState = $HelpForm.WindowState + ## Init the OnLoad event to correct the initial state of the form + $HelpForm.add_Load($OnLoadForm_StateCorrection) + ## Show the Form + $null = $HelpForm.ShowDialog() } ##*=============================================== @@ -129,4 +158,4 @@ Write-Log -Message "[$appDeployHelpScriptFriendlyName] console closed." -Source ##*=============================================== ##* END SCRIPT BODY -##*=============================================== \ No newline at end of file +##*=============================================== diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitLogo.ico b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitLogo.ico index 411f4abf097b2ce0120c5c6ee948d5233e3a18ee..845ee1d4e683a4823f71561f7c9fb493d230a993 100644 GIT binary patch literal 151459 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 z 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 KILI)ASjueR?0wPU%P3S?TBOppqvC@?$D1@S* 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

TU1rTVA<60A2 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 z

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 z%0D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
    -&pgT&!++@(TKW&>P+b<9DXJ0ggeGVO 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�wu3G!b`7U8-)QIVSu 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 literal 0 HcmV?d00001 diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.cs b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.cs index b1653b0..dc9a186 100644 --- a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.cs +++ b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.cs @@ -1,5 +1,5 @@ -// Date Modified: 01-08-2016 -// Version Number: 3.6.8 +// Date Modified: 26/01/2021 +// Version Number: 3.8.4 using System; using System.Text; @@ -25,40 +25,41 @@ enum LoadLibraryFlags : int LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 } - + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, LoadLibraryFlags dwFlags); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] - static extern int LoadString(IntPtr hInstance, int uID, StringBuilder lpBuffer, int nBufferMax); - + static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax); + // Get MSI exit code message from msimsg.dll resource dll public static string GetMessageFromMsiExitCode(int errCode) { IntPtr hModuleInstance = LoadLibraryEx("msimsg.dll", IntPtr.Zero, LoadLibraryFlags.LOAD_LIBRARY_AS_DATAFILE); - + StringBuilder sb = new StringBuilder(255); - LoadString(hModuleInstance, errCode, sb, sb.Capacity + 1); - + uint u = Convert.ToUInt32(errCode); + LoadString(hModuleInstance, u, sb, sb.Capacity + 1); + return sb.ToString(); } } - + public class Explorer { private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff); private const int WM_SETTINGCHANGE = 0x1a; private const int SMTO_ABORTIFHUNG = 0x0002; - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern bool SendNotifyMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] - private static extern IntPtr SendMessageTimeout(IntPtr hWnd, int Msg, IntPtr wParam, string lParam, int fuFlags, int uTimeout, IntPtr lpdwResult); - + private static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult); + [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = false)] - private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2); - + private static extern void SHChangeNotify(int eventId, uint flags, IntPtr item1, IntPtr item2); + public static void RefreshDesktopAndEnvironmentVariables() { // Update desktop icons @@ -68,51 +69,51 @@ public static void RefreshDesktopAndEnvironmentVariables() SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "Environment", SMTO_ABORTIFHUNG, 100, IntPtr.Zero); } } - + public sealed class FileVerb { [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] - public static extern int LoadString(IntPtr h, int id, StringBuilder sb, int maxBuffer); - + public static extern int LoadString(IntPtr h, uint id, StringBuilder sb, int maxBuffer); + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr LoadLibrary(string s); - + public static string GetPinVerb(int VerbId) { IntPtr hShell32 = LoadLibrary("shell32.dll"); const int nChars = 255; StringBuilder Buff = new StringBuilder("", nChars); - - LoadString(hShell32, VerbId, Buff, Buff.Capacity); + uint u = Convert.ToUInt32(VerbId); + LoadString(hShell32, u, Buff, Buff.Capacity); return Buff.ToString(); } } - + public sealed class IniFile { [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); - + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, StringBuilder lpString, string lpFileName); - + public static string GetIniValue(string section, string key, string filepath) { string sDefault = ""; const int nChars = 1024; StringBuilder Buff = new StringBuilder(nChars); - + GetPrivateProfileString(section, key, sDefault, Buff, Buff.Capacity, filepath); return Buff.ToString(); } - + public static void SetIniValue(string section, string key, StringBuilder value, string filepath) { WritePrivateProfileString(section, key, value, filepath); } } - + public class UiAutomation { public enum GetWindow_Cmd : int @@ -125,7 +126,7 @@ public enum GetWindow_Cmd : int GW_CHILD = 5, GW_ENABLEDPOPUP = 6 } - + public enum ShowWindowEnum { Hide = 0, @@ -142,7 +143,7 @@ public enum ShowWindowEnum ShowDefault = 10, ForceMinimized = 11 } - + public enum UserNotificationState { // http://msdn.microsoft.com/en-us/library/bb762533(v=vs.85).aspx @@ -154,75 +155,95 @@ public enum UserNotificationState QuietTime =6, // Introduced in Windows 7. The current user is in "quiet time", which is the first hour after a new user logs into his or her account for the first time. WindowsStoreAppRunning =7 // Introduced in Windows 8. A Windows Store app is running. } - + // Only for Vista or above [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern int SHQueryUserNotificationState(out UserNotificationState pquns); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnumWindows(EnumWindowsProcD lpEnumFunc, ref IntPtr lParam); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int GetWindowTextLength(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr GetDesktopWindow(); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr GetShellWindow(); - + + public enum DeviceCap + { + HORZRES = 8, + VERTRES = 10, + DESKTOPVERTRES = 117, + DESKTOPHORZRES = 118 + } + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetDeviceCaps(IntPtr hDC, int nIndex); + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWindowEnabled(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern bool IsWindowVisible(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsIconic(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool ShowWindow(IntPtr hWnd, ShowWindowEnum flags); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr SetActiveWindow(IntPtr hwnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetForegroundWindow(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr GetForegroundWindow(); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr SetFocus(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern bool BringWindowToTop(IntPtr hWnd); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); - + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int GetCurrentThreadId(); - + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach); - + [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex); - + [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex); - + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr DestroyMenu(IntPtr hWnd); + public delegate bool EnumWindowsProcD(IntPtr hWnd, ref IntPtr lItems); - + public static bool EnumWindowsProc(IntPtr hWnd, ref IntPtr lItems) { if (hWnd != IntPtr.Zero) @@ -237,7 +258,7 @@ public static bool EnumWindowsProc(IntPtr hWnd, ref IntPtr lItems) return false; } } - + public static List EnumWindows() { try @@ -254,7 +275,7 @@ public static List EnumWindows() throw new Exception("An error occured during window enumeration: " + ex.Message); } } - + public static string GetWindowText(IntPtr hWnd) { int iTextLength = GetWindowTextLength(hWnd); @@ -269,7 +290,7 @@ public static string GetWindowText(IntPtr hWnd) return String.Empty; } } - + public static bool BringWindowToFront(IntPtr windowHandle) { bool breturn = false; @@ -278,28 +299,28 @@ public static bool BringWindowToFront(IntPtr windowHandle) // Show minimized window because SetForegroundWindow does not work for minimized windows ShowWindow(windowHandle, ShowWindowEnum.ShowMaximized); } - + int lpdwProcessId; int windowThreadProcessId = GetWindowThreadProcessId(GetForegroundWindow(), out lpdwProcessId); int currentThreadId = GetCurrentThreadId(); AttachThreadInput(windowThreadProcessId, currentThreadId, true); - + BringWindowToTop(windowHandle); breturn = SetForegroundWindow(windowHandle); SetActiveWindow(windowHandle); SetFocus(windowHandle); - + AttachThreadInput(windowThreadProcessId, currentThreadId, false); return breturn; } - + public static int GetWindowThreadProcessId(IntPtr windowHandle) { int processID = 0; GetWindowThreadProcessId(windowHandle, out processID); return processID; } - + public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex) { if (IntPtr.Size == 4) @@ -308,7 +329,7 @@ public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex) } return GetWindowLongPtr64(hWnd, nIndex); } - + public static string GetUserNotificationState() { // Only works for Windows Vista or higher @@ -317,33 +338,33 @@ public static string GetUserNotificationState() return state.ToString(); } } - + public class QueryUser { [DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr WTSOpenServer(string pServerName); - + [DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern void WTSCloseServer(IntPtr hServer); - + [DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = false)] public static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out IntPtr pBuffer, out int pBytesReturned); - + [DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = false)] public static extern int WTSEnumerateSessions(IntPtr hServer, int Reserved, int Version, out IntPtr pSessionInfo, out int pCount); - + [DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern void WTSFreeMemory(IntPtr pMemory); - + [DllImport("winsta.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int WinStationQueryInformation(IntPtr hServer, int sessionId, int information, ref WINSTATIONINFORMATIONW pBuffer, int bufferLength, ref int returnedLength); - + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int GetCurrentProcessId(); - + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern bool ProcessIdToSessionId(int processId, ref int pSessionId); - + public class TerminalSessionData { public int SessionId; @@ -358,7 +379,7 @@ public TerminalSessionData(int sessionId, string connState, string sessionName, IsUserSession = isUserSession; } } - + public class TerminalSessionInfo { public string NTAccount; @@ -382,7 +403,7 @@ public class TerminalSessionInfo public string ClientDirectory; public int ClientBuildNumber; } - + [StructLayout(LayoutKind.Sequential)] private struct WTS_SESSION_INFO { @@ -391,7 +412,7 @@ private struct WTS_SESSION_INFO public string SessionName; public WTS_CONNECTSTATE_CLASS State; } - + [StructLayout(LayoutKind.Sequential)] public struct WINSTATIONINFORMATIONW { @@ -408,12 +429,12 @@ public struct WINSTATIONINFORMATIONW private byte[] Reserved3; public FILETIME CurrentTime; } - + public enum WINSTATIONINFOCLASS { WinStationInformation = 8 } - + public enum WTS_CONNECTSTATE_CLASS { Active, @@ -427,7 +448,7 @@ public enum WTS_CONNECTSTATE_CLASS Down, Init } - + public enum WTS_INFO_CLASS { SessionId=4, @@ -440,24 +461,24 @@ public enum WTS_INFO_CLASS ClientDirectory, ClientProtocolType=16 } - + private static IntPtr OpenServer(string Name) { IntPtr server = WTSOpenServer(Name); return server; } - + private static void CloseServer(IntPtr ServerHandle) { WTSCloseServer(ServerHandle); } - + private static IList PtrToStructureList(IntPtr ppList, int count) where T : struct { List result = new List(); long pointer = ppList.ToInt64(); int sizeOf = Marshal.SizeOf(typeof(T)); - + for (int index = 0; index < count; index++) { T item = (T) Marshal.PtrToStructure(new IntPtr(pointer), typeof(T)); @@ -466,7 +487,7 @@ private static IList PtrToStructureList(IntPtr ppList, int count) where T } return result; } - + public static DateTime? FileTimeToDateTime(FILETIME ft) { if (ft.dwHighDateTime == 0 && ft.dwLowDateTime == 0) @@ -476,7 +497,7 @@ private static IList PtrToStructureList(IntPtr ppList, int count) where T long hFT = (((long) ft.dwHighDateTime) << 32) + ft.dwLowDateTime; return DateTime.FromFileTime(hFT); } - + public static WINSTATIONINFORMATIONW GetWinStationInformation(IntPtr server, int sessionId) { int retLen = 0; @@ -484,7 +505,7 @@ public static WINSTATIONINFORMATIONW GetWinStationInformation(IntPtr server, int WinStationQueryInformation(server, sessionId, (int) WINSTATIONINFOCLASS.WinStationInformation, ref wsInfo, Marshal.SizeOf(typeof(WINSTATIONINFORMATIONW)), ref retLen); return wsInfo; } - + public static TerminalSessionData[] ListSessions(string ServerName) { IntPtr server = IntPtr.Zero; @@ -492,9 +513,9 @@ public static TerminalSessionData[] ListSessions(string ServerName) { ServerName = Environment.MachineName; } - + List results = new List(); - + try { server = OpenServer(ServerName); @@ -502,12 +523,12 @@ public static TerminalSessionData[] ListSessions(string ServerName) int count; bool _isUserSession = false; IList sessionsInfo; - + if (WTSEnumerateSessions(server, 0, 1, out ppSessionInfo, out count) == 0) { throw new Win32Exception(); } - + try { sessionsInfo = PtrToStructureList(ppSessionInfo, count); @@ -516,7 +537,7 @@ public static TerminalSessionData[] ListSessions(string ServerName) { WTSFreeMemory(ppSessionInfo); } - + foreach (WTS_SESSION_INFO sessionInfo in sessionsInfo) { if (sessionInfo.SessionName != "Services" && sessionInfo.SessionName != "RDP-Tcp") @@ -531,11 +552,11 @@ public static TerminalSessionData[] ListSessions(string ServerName) { CloseServer(server); } - + TerminalSessionData[] returnData = results.ToArray(); return returnData; } - + public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionId) { IntPtr server = IntPtr.Zero; @@ -555,7 +576,7 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI { currentSessionID = -1; } - + // Get all members of the local administrators group bool _IsLocalAdminCheckSuccess = false; List localAdminGroupSidsList = new List(); @@ -565,43 +586,51 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI string localAdminGroupName = new SecurityIdentifier("S-1-5-32-544").Translate(typeof(NTAccount)).Value.Split('\\')[1]; DirectoryEntry admGroup = localMachine.Children.Find(localAdminGroupName, "group"); object members = admGroup.Invoke("members", null); + string validSidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$"; foreach (object groupMember in (IEnumerable)members) { DirectoryEntry member = new DirectoryEntry(groupMember); if (member.Name != String.Empty) { - localAdminGroupSidsList.Add((new NTAccount(member.Name)).Translate(typeof(SecurityIdentifier)).Value); + if (Regex.IsMatch(member.Name, validSidPattern)) + { + localAdminGroupSidsList.Add(member.Name); + } + else + { + localAdminGroupSidsList.Add((new NTAccount(member.Name)).Translate(typeof(SecurityIdentifier)).Value); + } } } _IsLocalAdminCheckSuccess = true; } catch { } - + try { server = OpenServer(ServerName); - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientBuildNumber, out buffer, out bytesReturned) == false) { return data; } int lData = Marshal.ReadInt32(buffer); data.ClientBuildNumber = lData; - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientDirectory, out buffer, out bytesReturned) == false) { return data; } string strData = Marshal.PtrToStringAnsi(buffer); data.ClientDirectory = strData; - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientName, out buffer, out bytesReturned) == false) { return data; } strData = Marshal.PtrToStringAnsi(buffer); data.ClientName = strData; - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientProtocolType, out buffer, out bytesReturned) == false) { return data; @@ -618,21 +647,21 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI data.IsRdpSession = false; } data.ClientProtocolType = strData; - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ConnectState, out buffer, out bytesReturned) == false) { return data; } lData = Marshal.ReadInt32(buffer); data.ConnectState = ((WTS_CONNECTSTATE_CLASS) lData).ToString(); - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.SessionId, out buffer, out bytesReturned) == false) { return data; } lData = Marshal.ReadInt32(buffer); data.SessionId = lData; - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.DomainName, out buffer, out bytesReturned) == false) { return data; @@ -643,7 +672,7 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI { _NTAccount = strData; } - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.UserName, out buffer, out bytesReturned) == false) { return data; @@ -671,7 +700,7 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI } } } - + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.SessionName, out buffer, out bytesReturned) == false) { return data; @@ -688,7 +717,7 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI _IsConsoleSession = true; } data.IsConsoleSession = _IsConsoleSession; - + WINSTATIONINFORMATIONW wsInfo = GetWinStationInformation(server, SessionId); DateTime? _loginTime = FileTimeToDateTime(wsInfo.LoginTime); DateTime? _lastInputTime = FileTimeToDateTime(wsInfo.LastInputTime); @@ -698,7 +727,7 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI data.LogonTime = _loginTime; data.IdleTime = _idleTime; data.DisconnectTime = _disconnectTime; - + if (currentSessionID == SessionId) { _IsCurrentSessionId = true; @@ -713,14 +742,14 @@ public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionI } return data; } - + public static TerminalSessionInfo[] GetUserSessionInfo(string ServerName) { if (ServerName == "localhost" || ServerName == String.Empty) { ServerName = Environment.MachineName; } - + // Find and get detailed information for all user sessions // Also determine the active user session. If a console user exists, then that will be the active user session. // If no console user exists but users are logged in, such as on terminal servers, then select the first logged-in non-console user that is either 'Active' or 'Connected' as the active user. @@ -740,7 +769,7 @@ public static TerminalSessionInfo[] GetUserSessionInfo(string ServerName) { firstActiveUserNTAccount = sessionInfo.NTAccount; } - + if (sessionInfo.IsConsoleSession == true) { sessionInfo.IsActiveUserSession = true; @@ -750,12 +779,12 @@ public static TerminalSessionInfo[] GetUserSessionInfo(string ServerName) { sessionInfo.IsActiveUserSession = false; } - + userSessionsInfo.Add(sessionInfo); } } } - + TerminalSessionInfo[] userSessions = userSessionsInfo.ToArray(); if (IsActiveUserSessionSet == false) { @@ -768,7 +797,7 @@ public static TerminalSessionInfo[] GetUserSessionInfo(string ServerName) } } } - + return userSessions; } } diff --git a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.ps1 b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.ps1 index 7beb731..9163b9a 100644 --- a/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.ps1 +++ b/Templates/Framework/Source/AppDeployToolkit/AppDeployToolkitMain.ps1 @@ -1,62 +1,100 @@ <# .SYNOPSIS - This script contains the functions and logic engine for the Deploy-Application.ps1 script. - # LICENSE # - PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. - Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. - This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +PSAppDeployToolkit - This script contains the PSADT core runtime and functions using by a Deploy-Application.ps1 script. + .DESCRIPTION - The script can be called directly to dot-source the toolkit functions for testing, but it is usually called by the Deploy-Application.ps1 script. - The script can usually be updated to the latest version without impacting your per-application Deploy-Application scripts. - Please check release notes before upgrading. + +The script can be called directly to dot-source the toolkit functions for testing, but it is usually called by the Deploy-Application.ps1 script. + +The script can usually be updated to the latest version without impacting your per-application Deploy-Application scripts. Please check release notes before upgrading. + +PSAppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + .PARAMETER CleanupBlockedApps - Clean up the blocked applications. - This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +Clean up the blocked applications. + +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + .PARAMETER ShowBlockedAppDialog - Display a dialog box showing that the application execution is blocked. - This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +Display a dialog box showing that the application execution is blocked. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + .PARAMETER ReferredInstallName - Name of the referring application that invoked the script externally. - This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +Name of the referring application that invoked the script externally. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + .PARAMETER ReferredInstallTitle - Title of the referring application that invoked the script externally. - This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +Title of the referring application that invoked the script externally. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + .PARAMETER ReferredLogname - Logfile name of the referring application that invoked the script externally. - This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +Logfile name of the referring application that invoked the script externally. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + .PARAMETER AsyncToolkitLaunch - This parameter is passed to the script when it is being called externally, e.g. from a scheduled task or asynchronously. + +This parameter is passed to the script when it is being called externally, e.g. from a scheduled task or asynchronously. + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + .NOTES - The other parameters specified for this script that are not documented in this help section are for use only by functions in this script that call themselves by running this script again asynchronously. + +The other parameters specified for this script that are not documented in this help section are for use only by functions in this script that call themselves by running this script again asynchronously. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> + + [CmdletBinding()] Param ( - ## Script Parameters: These parameters are passed to the script when it is called externally from a scheduled task or because of an Image File Execution Options registry setting - [switch]$ShowInstallationPrompt = $false, - [switch]$ShowInstallationRestartPrompt = $false, - [switch]$CleanupBlockedApps = $false, - [switch]$ShowBlockedAppDialog = $false, - [switch]$DisableLogging = $false, - [string]$ReferredInstallName = '', - [string]$ReferredInstallTitle = '', - [string]$ReferredLogName = '', - [string]$Message = '', - [string]$MessageAlignment = '', - [string]$ButtonRightText = '', - [string]$ButtonLeftText = '', - [string]$ButtonMiddleText = '', - [string]$Icon = '', - [string]$Timeout = '', - [switch]$ExitOnTimeout = $false, - [boolean]$MinimizeWindows = $false, - [switch]$PersistPrompt = $false, - [int32]$CountdownSeconds, - [int32]$CountdownNoHideSeconds, - [switch]$NoCountdown = $false, - [switch]$AsyncToolkitLaunch = $false + ## Script Parameters: These parameters are passed to the script when it is called externally from a scheduled task or because of an Image File Execution Options registry setting + [Switch]$ShowInstallationPrompt = $false, + [Switch]$ShowInstallationRestartPrompt = $false, + [Switch]$CleanupBlockedApps = $false, + [Switch]$ShowBlockedAppDialog = $false, + [Switch]$DisableLogging = $false, + [String]$ReferredInstallName = '', + [String]$ReferredInstallTitle = '', + [String]$ReferredLogName = '', + [String]$Title = '', + [String]$Message = '', + [String]$MessageAlignment = '', + [String]$ButtonRightText = '', + [String]$ButtonLeftText = '', + [String]$ButtonMiddleText = '', + [String]$Icon = '', + [String]$Timeout = '', + [Switch]$ExitOnTimeout = $false, + [Boolean]$MinimizeWindows = $false, + [Switch]$PersistPrompt = $false, + [Int32]$CountdownSeconds = 60, + [Int32]$CountdownNoHideSeconds = 30, + [Switch]$NoCountdown = $false, + [Switch]$AsyncToolkitLaunch = $false, + [Boolean]$TopMost = $true ) ##*============================================= @@ -65,396 +103,638 @@ Param ( #region VariableDeclaration ## Variables: Toolkit Name -[string]$appDeployToolkitName = 'PSAppDeployToolkit' -[string]$appDeployMainScriptFriendlyName = 'App Deploy Toolkit Main' +[String]$appDeployToolkitName = 'PSAppDeployToolkit' +[String]$appDeployMainScriptFriendlyName = 'App Deploy Toolkit Main' ## Variables: Script Info -[version]$appDeployMainScriptVersion = [version]'3.7.0' -[version]$appDeployMainScriptMinimumConfigVersion = [version]'3.7.0' -[string]$appDeployMainScriptDate = '02/13/2018' -[hashtable]$appDeployMainScriptParameters = $PSBoundParameters +[Version]$appDeployMainScriptVersion = [Version]'3.9.3' +[Version]$appDeployMainScriptMinimumConfigVersion = [Version]'3.9.3' +[String]$appDeployMainScriptDate = '02/05/2023' +[Hashtable]$appDeployMainScriptParameters = $PSBoundParameters ## Variables: Datetime and Culture -[datetime]$currentDateTime = Get-Date -[string]$currentTime = Get-Date -Date $currentDateTime -UFormat '%T' -[string]$currentDate = Get-Date -Date $currentDateTime -UFormat '%d-%m-%Y' -[timespan]$currentTimeZoneBias = [timezone]::CurrentTimeZone.GetUtcOffset([datetime]::Now) +[DateTime]$currentDateTime = Get-Date +[String]$currentTime = Get-Date -Date $currentDateTime -UFormat '%T' +[String]$currentDate = Get-Date -Date $currentDateTime -UFormat '%d-%m-%Y' +[Timespan]$currentTimeZoneBias = [TimeZone]::CurrentTimeZone.GetUtcOffset($currentDateTime) [Globalization.CultureInfo]$culture = Get-Culture -[string]$currentLanguage = $culture.TwoLetterISOLanguageName.ToUpper() +[String]$currentLanguage = $culture.TwoLetterISOLanguageName.ToUpper() [Globalization.CultureInfo]$uiculture = Get-UICulture -[string]$currentUILanguage = $uiculture.TwoLetterISOLanguageName.ToUpper() +[String]$currentUILanguage = $uiculture.TwoLetterISOLanguageName.ToUpper() ## Variables: Environment Variables -[psobject]$envHost = $Host -[psobject]$envShellFolders = Get-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -ErrorAction 'SilentlyContinue' -[string]$envAllUsersProfile = $env:ALLUSERSPROFILE -[string]$envAppData = [Environment]::GetFolderPath('ApplicationData') -[string]$envArchitecture = $env:PROCESSOR_ARCHITECTURE -[string]$envCommonProgramFiles = [Environment]::GetFolderPath('CommonProgramFiles') -[string]$envCommonProgramFilesX86 = ${env:CommonProgramFiles(x86)} -[string]$envCommonDesktop = $envShellFolders | Select-Object -ExpandProperty 'Common Desktop' -ErrorAction 'SilentlyContinue' -[string]$envCommonDocuments = $envShellFolders | Select-Object -ExpandProperty 'Common Documents' -ErrorAction 'SilentlyContinue' -[string]$envCommonStartMenuPrograms = $envShellFolders | Select-Object -ExpandProperty 'Common Programs' -ErrorAction 'SilentlyContinue' -[string]$envCommonStartMenu = $envShellFolders | Select-Object -ExpandProperty 'Common Start Menu' -ErrorAction 'SilentlyContinue' -[string]$envCommonStartUp = $envShellFolders | Select-Object -ExpandProperty 'Common Startup' -ErrorAction 'SilentlyContinue' -[string]$envCommonTemplates = $envShellFolders | Select-Object -ExpandProperty 'Common Templates' -ErrorAction 'SilentlyContinue' -[string]$envComputerName = [Environment]::MachineName.ToUpper() -[string]$envComputerNameFQDN = ([Net.Dns]::GetHostEntry('localhost')).HostName -[string]$envHomeDrive = $env:HOMEDRIVE -[string]$envHomePath = $env:HOMEPATH -[string]$envHomeShare = $env:HOMESHARE -[string]$envLocalAppData = [Environment]::GetFolderPath('LocalApplicationData') -[string[]]$envLogicalDrives = [Environment]::GetLogicalDrives() -[string]$envProgramFiles = [Environment]::GetFolderPath('ProgramFiles') -[string]$envProgramFilesX86 = ${env:ProgramFiles(x86)} -[string]$envProgramData = [Environment]::GetFolderPath('CommonApplicationData') -[string]$envPublic = $env:PUBLIC -[string]$envSystemDrive = $env:SYSTEMDRIVE -[string]$envSystemRoot = $env:SYSTEMROOT -[string]$envTemp = [IO.Path]::GetTempPath() -[string]$envUserCookies = [Environment]::GetFolderPath('Cookies') -[string]$envUserDesktop = [Environment]::GetFolderPath('DesktopDirectory') -[string]$envUserFavorites = [Environment]::GetFolderPath('Favorites') -[string]$envUserInternetCache = [Environment]::GetFolderPath('InternetCache') -[string]$envUserInternetHistory = [Environment]::GetFolderPath('History') -[string]$envUserMyDocuments = [Environment]::GetFolderPath('MyDocuments') -[string]$envUserName = [Environment]::UserName -[string]$envUserPictures = [Environment]::GetFolderPath('MyPictures') -[string]$envUserProfile = $env:USERPROFILE -[string]$envUserSendTo = [Environment]::GetFolderPath('SendTo') -[string]$envUserStartMenu = [Environment]::GetFolderPath('StartMenu') -[string]$envUserStartMenuPrograms = [Environment]::GetFolderPath('Programs') -[string]$envUserStartUp = [Environment]::GetFolderPath('StartUp') -[string]$envUserTemplates = [Environment]::GetFolderPath('Templates') -[string]$envSystem32Directory = [Environment]::SystemDirectory -[string]$envWinDir = $env:WINDIR -# Handle X86 environment variables so they are never empty -If (-not $envCommonProgramFilesX86) { [string]$envCommonProgramFilesX86 = $envCommonProgramFiles } -If (-not $envProgramFilesX86) { [string]$envProgramFilesX86 = $envProgramFiles } +[PSObject]$envHost = $Host +[PSObject]$envShellFolders = Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -ErrorAction 'SilentlyContinue' +[String]$envAllUsersProfile = $env:ALLUSERSPROFILE +[String]$envAppData = [Environment]::GetFolderPath('ApplicationData') +[String]$envArchitecture = $env:PROCESSOR_ARCHITECTURE +[String]$envCommonDesktop = $envShellFolders | Select-Object -ExpandProperty 'Common Desktop' -ErrorAction 'SilentlyContinue' +[String]$envCommonDocuments = $envShellFolders | Select-Object -ExpandProperty 'Common Documents' -ErrorAction 'SilentlyContinue' +[String]$envCommonStartMenuPrograms = $envShellFolders | Select-Object -ExpandProperty 'Common Programs' -ErrorAction 'SilentlyContinue' +[String]$envCommonStartMenu = $envShellFolders | Select-Object -ExpandProperty 'Common Start Menu' -ErrorAction 'SilentlyContinue' +[String]$envCommonStartUp = $envShellFolders | Select-Object -ExpandProperty 'Common Startup' -ErrorAction 'SilentlyContinue' +[String]$envCommonTemplates = $envShellFolders | Select-Object -ExpandProperty 'Common Templates' -ErrorAction 'SilentlyContinue' +[String]$envComputerName = [Environment]::MachineName.ToUpper() +[String]$envHomeDrive = $env:HOMEDRIVE +[String]$envHomePath = $env:HOMEPATH +[String]$envHomeShare = $env:HOMESHARE +[String]$envLocalAppData = [Environment]::GetFolderPath('LocalApplicationData') +[String[]]$envLogicalDrives = [Environment]::GetLogicalDrives() +[String]$envProgramData = [Environment]::GetFolderPath('CommonApplicationData') +[String]$envPublic = $env:PUBLIC +[String]$envSystemDrive = $env:SYSTEMDRIVE +[String]$envSystemRoot = $env:SYSTEMROOT +[String]$envTemp = [IO.Path]::GetTempPath() +[String]$envUserCookies = [Environment]::GetFolderPath('Cookies') +[String]$envUserDesktop = [Environment]::GetFolderPath('DesktopDirectory') +[String]$envUserFavorites = [Environment]::GetFolderPath('Favorites') +[String]$envUserInternetCache = [Environment]::GetFolderPath('InternetCache') +[String]$envUserInternetHistory = [Environment]::GetFolderPath('History') +[String]$envUserMyDocuments = [Environment]::GetFolderPath('MyDocuments') +[String]$envUserName = [Environment]::UserName +[String]$envUserPictures = [Environment]::GetFolderPath('MyPictures') +[String]$envUserProfile = $env:USERPROFILE +[String]$envUserSendTo = [Environment]::GetFolderPath('SendTo') +[String]$envUserStartMenu = [Environment]::GetFolderPath('StartMenu') +[String]$envUserStartMenuPrograms = [Environment]::GetFolderPath('Programs') +[String]$envUserStartUp = [Environment]::GetFolderPath('StartUp') +[String]$envUserTemplates = [Environment]::GetFolderPath('Templates') +[String]$envSystem32Directory = [Environment]::SystemDirectory +[String]$envWinDir = $env:WINDIR ## Variables: Domain Membership -[boolean]$IsMachinePartOfDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').PartOfDomain -[string]$envMachineWorkgroup = '' -[string]$envMachineADDomain = '' -[string]$envLogonServer = '' -[string]$MachineDomainController = '' +[Boolean]$IsMachinePartOfDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').PartOfDomain +[String]$envMachineWorkgroup = '' +[String]$envMachineADDomain = '' +[String]$envLogonServer = '' +[String]$MachineDomainController = '' +[String]$envComputerNameFQDN = $envComputerName If ($IsMachinePartOfDomain) { - [string]$envMachineADDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').Domain | Where-Object { $_ } | ForEach-Object { $_.ToLower() } - Try { - [string]$envLogonServer = $env:LOGONSERVER | Where-Object { (($_) -and (-not $_.Contains('\\MicrosoftAccount'))) } | ForEach-Object { $_.TrimStart('\') } | ForEach-Object { ([Net.Dns]::GetHostEntry($_)).HostName } - # If running in system context, fall back on the logonserver value stored in the registry - If (-not $envLogonServer) { [string]$envLogonServer = Get-ItemProperty -LiteralPath 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\History' -ErrorAction 'SilentlyContinue' | Select-Object -ExpandProperty 'DCName' -ErrorAction 'SilentlyContinue' } - [string]$MachineDomainController = [DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().FindDomainController().Name - } - Catch { } + [String]$envMachineADDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').Domain | Where-Object { $_ } | ForEach-Object { $_.ToLower() } + Try { + $envComputerNameFQDN = ([Net.Dns]::GetHostEntry('localhost')).HostName + } + Catch { + # Function GetHostEntry failed, but we can construct the FQDN in another way + $envComputerNameFQDN = $envComputerNameFQDN + '.' + $envMachineADDomain + } + + Try { + [String]$envLogonServer = $env:LOGONSERVER | Where-Object { (($_) -and (-not $_.Contains('\\MicrosoftAccount'))) } | ForEach-Object { $_.TrimStart('\') } | ForEach-Object { ([Net.Dns]::GetHostEntry($_)).HostName } + } + Catch { + } + # If running in system context or if GetHostEntry fails, fall back on the logonserver value stored in the registry + If (-not $envLogonServer) { + [String]$envLogonServer = Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\History' -ErrorAction 'SilentlyContinue' | Select-Object -ExpandProperty 'DCName' -ErrorAction 'SilentlyContinue' + } + ## Remove backslashes at the beginning + While ($envLogonServer.StartsWith('\')) { + $envLogonServer = $envLogonServer.Substring(1) + } + + Try { + [String]$MachineDomainController = [DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().FindDomainController().Name + } + Catch { + } } Else { - [string]$envMachineWorkgroup = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').Domain | Where-Object { $_ } | ForEach-Object { $_.ToUpper() } + [String]$envMachineWorkgroup = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').Domain | Where-Object { $_ } | ForEach-Object { $_.ToUpper() } } -[string]$envMachineDNSDomain = [Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().DomainName | Where-Object { $_ } | ForEach-Object { $_.ToLower() } -[string]$envUserDNSDomain = $env:USERDNSDOMAIN | Where-Object { $_ } | ForEach-Object { $_.ToLower() } +[String]$envMachineDNSDomain = [Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().DomainName | Where-Object { $_ } | ForEach-Object { $_.ToLower() } +[String]$envUserDNSDomain = $env:USERDNSDOMAIN | Where-Object { $_ } | ForEach-Object { $_.ToLower() } Try { - [string]$envUserDomain = [Environment]::UserDomainName.ToUpper() + [String]$envUserDomain = [Environment]::UserDomainName.ToUpper() +} +Catch { } -Catch { } ## Variables: Operating System -[psobject]$envOS = Get-WmiObject -Class 'Win32_OperatingSystem' -ErrorAction 'SilentlyContinue' -[string]$envOSName = $envOS.Caption.Trim() -[string]$envOSServicePack = $envOS.CSDVersion -[version]$envOSVersion = $envOS.Version -[string]$envOSVersionMajor = $envOSVersion.Major -[string]$envOSVersionMinor = $envOSVersion.Minor -[string]$envOSVersionBuild = $envOSVersion.Build -If ($envOSVersionMajor -eq 10) {$envOSVersionRevision = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'UBR' -ErrorAction SilentlyContinue).UBR} -Else { [string]$envOSVersionRevision = ,((Get-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'BuildLabEx' -ErrorAction 'SilentlyContinue').BuildLabEx -split '\.') | ForEach-Object { $_[1] } } +[PSObject]$envOS = Get-WmiObject -Class 'Win32_OperatingSystem' -ErrorAction 'SilentlyContinue' +[String]$envOSName = $envOS.Caption.Trim() +[String]$envOSServicePack = $envOS.CSDVersion +[Version]$envOSVersion = $envOS.Version +[String]$envOSVersionMajor = $envOSVersion.Major +[String]$envOSVersionMinor = $envOSVersion.Minor +[String]$envOSVersionBuild = $envOSVersion.Build +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'UBR') { + [String]$envOSVersionRevision = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'UBR' -ErrorAction 'SilentlyContinue').UBR +} +ElseIf ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'BuildLabEx') { + [String]$envOSVersionRevision = , ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'BuildLabEx' -ErrorAction 'SilentlyContinue').BuildLabEx -split '\.') | ForEach-Object { $_[1] } +} If ($envOSVersionRevision -notmatch '^[\d\.]+$') { $envOSVersionRevision = '' } -If ($envOSVersionRevision) { [string]$envOSVersion = "$($envOSVersion.ToString()).$envOSVersionRevision" } Else { "$($envOSVersion.ToString())" } +If ($envOSVersionRevision) { [string]$envOSVersion = "$($envOSVersion.ToString()).$envOSVersionRevision" } Else { [string]$envOSVersion = "$($envOSVersion.ToString())" } # Get the operating system type [int32]$envOSProductType = $envOS.ProductType [boolean]$IsServerOS = [boolean]($envOSProductType -eq 3) [boolean]$IsDomainControllerOS = [boolean]($envOSProductType -eq 2) [boolean]$IsWorkStationOS = [boolean]($envOSProductType -eq 1) +[boolean]$IsMultiSessionOS = [boolean]($envOSName -match '^Microsoft Windows \d+ Enterprise for Virtual Desktops$') Switch ($envOSProductType) { - 3 { [string]$envOSProductTypeName = 'Server' } - 2 { [string]$envOSProductTypeName = 'Domain Controller' } - 1 { [string]$envOSProductTypeName = 'Workstation' } - Default { [string]$envOSProductTypeName = 'Unknown' } + 3 { [string]$envOSProductTypeName = 'Server' } + 2 { [string]$envOSProductTypeName = 'Domain Controller' } + 1 { [string]$envOSProductTypeName = 'Workstation' } + Default { [string]$envOSProductTypeName = 'Unknown' } } # Get the OS Architecture -[boolean]$Is64Bit = [boolean]((Get-WmiObject -Class 'Win32_Processor' -ErrorAction 'SilentlyContinue' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) -If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } +[Boolean]$Is64Bit = [Boolean]((Get-WmiObject -Class 'Win32_Processor' -ErrorAction 'SilentlyContinue' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) +If ($Is64Bit) { + [String]$envOSArchitecture = '64-bit' +} +Else { + [String]$envOSArchitecture = '32-bit' +} ## Variables: Current Process Architecture -[boolean]$Is64BitProcess = [boolean]([IntPtr]::Size -eq 8) -If ($Is64BitProcess) { [string]$psArchitecture = 'x64' } Else { [string]$psArchitecture = 'x86' } +[Boolean]$Is64BitProcess = [Boolean]([IntPtr]::Size -eq 8) +If ($Is64BitProcess) { + [String]$psArchitecture = 'x64' +} +Else { + [String]$psArchitecture = 'x86' +} + +## Variables: Get Normalized ProgramFiles and CommonProgramFiles Paths +[String]$envProgramFiles = '' +[String]$envProgramFilesX86 = '' +[String]$envCommonProgramFiles = '' +[String]$envCommonProgramFilesX86 = '' +If ($Is64Bit) { + If ($Is64BitProcess) { + [String]$envProgramFiles = [Environment]::GetFolderPath('ProgramFiles') + [String]$envCommonProgramFiles = [Environment]::GetFolderPath('CommonProgramFiles') + } + Else { + [String]$envProgramFiles = [Environment]::GetEnvironmentVariable('ProgramW6432') + [String]$envCommonProgramFiles = [Environment]::GetEnvironmentVariable('CommonProgramW6432') + } + ## Powershell 2 doesn't support X86 folders so need to use variables instead + Try { + [String]$envProgramFilesX86 = [Environment]::GetFolderPath('ProgramFilesX86') + [String]$envCommonProgramFilesX86 = [Environment]::GetFolderPath('CommonProgramFilesX86') + } + Catch { + [String]$envProgramFilesX86 = [Environment]::GetEnvironmentVariable('ProgramFiles(x86)') + [String]$envCommonProgramFilesX86 = [Environment]::GetEnvironmentVariable('CommonProgramFiles(x86)') + } +} +Else { + [String]$envProgramFiles = [Environment]::GetFolderPath('ProgramFiles') + [String]$envProgramFilesX86 = $envProgramFiles + [String]$envCommonProgramFiles = [Environment]::GetFolderPath('CommonProgramFiles') + [String]$envCommonProgramFilesX86 = $envCommonProgramFiles +} + +## Variables: Office C2R version, bitness and channel +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'VersionToReport') { + [String]$envOfficeVersion = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'VersionToReport' -ErrorAction 'SilentlyContinue').VersionToReport +} +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'Platform') { + [String]$envOfficeBitness = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'Platform' -ErrorAction 'SilentlyContinue').Platform +} +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'CDNBaseURL') { + [String]$envOfficeCDNBaseURL = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'CDNBaseURL' -ErrorAction 'SilentlyContinue').CDNBaseURL + Switch -regex ([String]$envofficeCDNBaseURL) { + "492350f6-3a01-4f97-b9c0-c7c6ddf67d60" {$envOfficeChannel = "monthly"} + "7ffbc6bf-bc32-4f92-8982-f9dd17fd3114" {$envOfficeChannel = "semi-annual"} + "64256afe-f5d9-4f86-8936-8840a6a4f5be" {$envOfficeChannel = "monthly targeted"} + "b8f9b850-328d-4355-9145-c59439a0c4cf" {$envOfficeChannel = "semi-annual targeted"} + } +} ## Variables: Hardware -[int32]$envSystemRAM = Get-WMIObject -Class Win32_PhysicalMemory -ComputerName $env:COMPUTERNAME -ErrorAction 'SilentlyContinue' | Measure-Object -Property Capacity -Sum -ErrorAction SilentlyContinue | % {[Math]::Round(($_.sum / 1GB),2)} +[Int32]$envSystemRAM = Get-WmiObject -Class 'Win32_PhysicalMemory' -ErrorAction 'SilentlyContinue' | Measure-Object -Property 'Capacity' -Sum -ErrorAction 'SilentlyContinue' | ForEach-Object { [Math]::Round(($_.Sum / 1GB), 2) } ## Variables: PowerShell And CLR (.NET) Versions -[hashtable]$envPSVersionTable = $PSVersionTable +[Hashtable]$envPSVersionTable = $PSVersionTable # PowerShell Version -[version]$envPSVersion = $envPSVersionTable.PSVersion -[string]$envPSVersionMajor = $envPSVersion.Major -[string]$envPSVersionMinor = $envPSVersion.Minor -[string]$envPSVersionBuild = $envPSVersion.Build -[string]$envPSVersionRevision = $envPSVersion.Revision -[string]$envPSVersion = $envPSVersion.ToString() +[Version]$envPSVersion = $envPSVersionTable.PSVersion +[String]$envPSVersionMajor = $envPSVersion.Major +[String]$envPSVersionMinor = $envPSVersion.Minor +[String]$envPSVersionBuild = $envPSVersion.Build +[String]$envPSVersionRevision = $envPSVersion.Revision +[String]$envPSVersion = $envPSVersion.ToString() # CLR (.NET) Version used by PowerShell -[version]$envCLRVersion = $envPSVersionTable.CLRVersion -[string]$envCLRVersionMajor = $envCLRVersion.Major -[string]$envCLRVersionMinor = $envCLRVersion.Minor -[string]$envCLRVersionBuild = $envCLRVersion.Build -[string]$envCLRVersionRevision = $envCLRVersion.Revision -[string]$envCLRVersion = $envCLRVersion.ToString() +[Version]$envCLRVersion = $envPSVersionTable.CLRVersion +[String]$envCLRVersionMajor = $envCLRVersion.Major +[String]$envCLRVersionMinor = $envCLRVersion.Minor +[String]$envCLRVersionBuild = $envCLRVersion.Build +[String]$envCLRVersionRevision = $envCLRVersion.Revision +[String]$envCLRVersion = $envCLRVersion.ToString() ## Variables: Permissions/Accounts [Security.Principal.WindowsIdentity]$CurrentProcessToken = [Security.Principal.WindowsIdentity]::GetCurrent() [Security.Principal.SecurityIdentifier]$CurrentProcessSID = $CurrentProcessToken.User -[string]$ProcessNTAccount = $CurrentProcessToken.Name -[string]$ProcessNTAccountSID = $CurrentProcessSID.Value -[boolean]$IsAdmin = [boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-32-544') -[boolean]$IsLocalSystemAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'LocalSystemSid') -[boolean]$IsLocalServiceAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'LocalServiceSid') -[boolean]$IsNetworkServiceAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'NetworkServiceSid') -[boolean]$IsServiceAccount = [boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-6') -[boolean]$IsProcessUserInteractive = [Environment]::UserInteractive -[string]$LocalSystemNTAccount = (New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ([Security.Principal.WellKnownSidType]::'LocalSystemSid', $null)).Translate([Security.Principal.NTAccount]).Value +[String]$ProcessNTAccount = $CurrentProcessToken.Name +[String]$ProcessNTAccountSID = $CurrentProcessSID.Value +[Boolean]$IsAdmin = [Boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-32-544') +[Boolean]$IsLocalSystemAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'LocalSystemSid') +[Boolean]$IsLocalServiceAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'LocalServiceSid') +[Boolean]$IsNetworkServiceAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'NetworkServiceSid') +[Boolean]$IsServiceAccount = [Boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-6') +[Boolean]$IsProcessUserInteractive = [Environment]::UserInteractive +$GetAccountNameUsingSid = [ScriptBlock] { + Param ( + [String]$SecurityIdentifier = $null + ) + + Try { + Return (New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ([Security.Principal.WellKnownSidType]::"$SecurityIdentifier", $null)).Translate([System.Security.Principal.NTAccount]).Value + } + Catch { + Return ($null) + } +} +[String]$LocalSystemNTAccount = & $GetAccountNameUsingSid 'LocalSystemSid' +[String]$LocalUsersGroup = & $GetAccountNameUsingSid 'BuiltinUsersSid' +# Test if the current Windows is a Home edition +Try { + If (!((Get-WmiObject -Class Win32_OperatingSystem | Select -Expand Caption) -like "*Home*")){ + [string]$LocalPowerUsersGroup = & $GetAccountNameUsingSid 'BuiltinPowerUsersSid' + } +} +Catch{} +[String]$LocalAdministratorsGroup = & $GetAccountNameUsingSid 'BuiltinAdministratorsSid' # Check if script is running in session zero -If ($IsLocalSystemAccount -or $IsLocalServiceAccount -or $IsNetworkServiceAccount -or $IsServiceAccount) { $SessionZero = $true } Else { $SessionZero = $false } +If ($IsLocalSystemAccount -or $IsLocalServiceAccount -or $IsNetworkServiceAccount -or $IsServiceAccount) { + $SessionZero = $true +} +Else { + $SessionZero = $false +} ## Variables: Script Name and Script Paths -[string]$scriptPath = $MyInvocation.MyCommand.Definition -[string]$scriptName = [IO.Path]::GetFileNameWithoutExtension($scriptPath) -[string]$scriptFileName = Split-Path -Path $scriptPath -Leaf -[string]$scriptRoot = Split-Path -Path $scriptPath -Parent -[string]$invokingScript = (Get-Variable -Name 'MyInvocation').Value.ScriptName +[String]$scriptPath = $MyInvocation.MyCommand.Definition +[String]$scriptName = [IO.Path]::GetFileNameWithoutExtension($scriptPath) +[String]$scriptFileName = Split-Path -Path $scriptPath -Leaf +[String]$scriptRoot = Split-Path -Path $scriptPath -Parent +[String]$invokingScript = (Get-Variable -Name 'MyInvocation').Value.ScriptName # Get the invoking script directory If ($invokingScript) { - # If this script was invoked by another script - [string]$scriptParentPath = Split-Path -Path $invokingScript -Parent + # If this script was invoked by another script + [String]$scriptParentPath = Split-Path -Path $invokingScript -Parent } Else { - # If this script was not invoked by another script, fall back to the directory one level above this script - [string]$scriptParentPath = (Get-Item -LiteralPath $scriptRoot).Parent.FullName + # If this script was not invoked by another script, fall back to the directory one level above this script + [String]$scriptParentPath = (Get-Item -LiteralPath $scriptRoot).Parent.FullName } ## Variables: App Deploy Script Dependency Files -[string]$appDeployLogoIcon = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitLogo.ico' -[string]$appDeployLogoBanner = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitBanner.png' -[string]$appDeployConfigFile = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitConfig.xml' -[string]$appDeployCustomTypesSourceCode = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitMain.cs' +[String]$appDeployConfigFile = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitConfig.xml' +[String]$appDeployCustomTypesSourceCode = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitMain.cs' +If (-not (Test-Path -LiteralPath $appDeployConfigFile -PathType 'Leaf')) { + Throw 'App Deploy XML configuration file not found.' +} +If (-not (Test-Path -LiteralPath $appDeployCustomTypesSourceCode -PathType 'Leaf')) { + Throw 'App Deploy custom types source code file not found.' +} + # App Deploy Optional Extensions File -[string]$appDeployToolkitDotSourceExtensions = 'AppDeployToolkitExtensions.ps1' -# Check that dependency files are present -If (-not (Test-Path -LiteralPath $appDeployLogoIcon -PathType 'Leaf')) { Throw 'App Deploy logo icon file not found.' } -If (-not (Test-Path -LiteralPath $appDeployLogoBanner -PathType 'Leaf')) { Throw 'App Deploy logo banner file not found.' } -If (-not (Test-Path -LiteralPath $appDeployConfigFile -PathType 'Leaf')) { Throw 'App Deploy XML configuration file not found.' } -If (-not (Test-Path -LiteralPath $appDeployCustomTypesSourceCode -PathType 'Leaf')) { Throw 'App Deploy custom types source code file not found.' } +[String]$appDeployToolkitDotSourceExtensions = 'AppDeployToolkitExtensions.ps1' ## Import variables from XML configuration file -[Xml.XmlDocument]$xmlConfigFile = Get-Content -LiteralPath $AppDeployConfigFile +[Xml.XmlDocument]$xmlConfigFile = Get-Content -LiteralPath $AppDeployConfigFile -Encoding 'UTF8' [Xml.XmlElement]$xmlConfig = $xmlConfigFile.AppDeployToolkit_Config # Get Config File Details [Xml.XmlElement]$configConfigDetails = $xmlConfig.Config_File -[string]$configConfigVersion = [version]$configConfigDetails.Config_Version -[string]$configConfigDate = $configConfigDetails.Config_Date +[String]$configConfigVersion = [Version]$configConfigDetails.Config_Version +[String]$configConfigDate = $configConfigDetails.Config_Date + +# Get Banner and Icon details +[Xml.XmlElement]$xmlBannerIconOptions = $xmlConfig.BannerIcon_Options +[String]$configBannerIconFileName = $xmlBannerIconOptions.Icon_Filename +[String]$configBannerLogoImageFileName = $xmlBannerIconOptions.LogoImage_Filename +[String]$configBannerIconBannerName = $xmlBannerIconOptions.Banner_Filename +[Int32]$appDeployLogoBannerMaxHeight = $xmlBannerIconOptions.Banner_MaxHeight + +# Get Toast Notification Options +[Xml.XmlElement]$xmlToastOptions = $xmlConfig.Toast_Options +[String]$configToastDisable = $xmlToastOptions.Toast_Disable +[String]$configToastAppName = $xmlToastOptions.Toast_AppName + +[String]$appDeployLogoIcon = Join-Path -Path $scriptRoot -ChildPath $configBannerIconFileName +[String]$appDeployLogoImage = Join-Path -Path $scriptRoot -ChildPath $configBannerLogoImageFileName +[String]$appDeployLogoBanner = Join-Path -Path $scriptRoot -ChildPath $configBannerIconBannerName +# Check that dependency files are present +If (-not (Test-Path -LiteralPath $appDeployLogoIcon -PathType 'Leaf')) { + Throw 'App Deploy logo icon file not found.' +} +If (-not (Test-Path -LiteralPath $appDeployLogoBanner -PathType 'Leaf')) { + Throw 'App Deploy logo banner file not found.' +} + # Get Toolkit Options [Xml.XmlElement]$xmlToolkitOptions = $xmlConfig.Toolkit_Options -[boolean]$configToolkitRequireAdmin = [boolean]::Parse($xmlToolkitOptions.Toolkit_RequireAdmin) -[string]$configToolkitTempPath = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_TempPath) -[string]$configToolkitRegPath = $xmlToolkitOptions.Toolkit_RegPath -[string]$configToolkitLogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_LogPath) -[boolean]$configToolkitCompressLogs = [boolean]::Parse($xmlToolkitOptions.Toolkit_CompressLogs) -[string]$configToolkitLogStyle = $xmlToolkitOptions.Toolkit_LogStyle -[double]$configToolkitLogMaxSize = $xmlToolkitOptions.Toolkit_LogMaxSize -[boolean]$configToolkitLogWriteToHost = [boolean]::Parse($xmlToolkitOptions.Toolkit_LogWriteToHost) -[boolean]$configToolkitLogDebugMessage = [boolean]::Parse($xmlToolkitOptions.Toolkit_LogDebugMessage) +[Boolean]$configToolkitRequireAdmin = [Boolean]::Parse($xmlToolkitOptions.Toolkit_RequireAdmin) +[String]$configToolkitTempPath = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_TempPath) +[String]$configToolkitRegPath = $xmlToolkitOptions.Toolkit_RegPath +[String]$configToolkitLogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_LogPath) +[Boolean]$configToolkitCompressLogs = [Boolean]::Parse($xmlToolkitOptions.Toolkit_CompressLogs) +[String]$configToolkitLogStyle = $xmlToolkitOptions.Toolkit_LogStyle +[Double]$configToolkitLogMaxSize = $xmlToolkitOptions.Toolkit_LogMaxSize +[Boolean]$configToolkitLogWriteToHost = [Boolean]::Parse($xmlToolkitOptions.Toolkit_LogWriteToHost) +[Boolean]$configToolkitLogDebugMessage = [Boolean]::Parse($xmlToolkitOptions.Toolkit_LogDebugMessage) # Get MSI Options [Xml.XmlElement]$xmlConfigMSIOptions = $xmlConfig.MSI_Options -[string]$configMSILoggingOptions = $xmlConfigMSIOptions.MSI_LoggingOptions -[string]$configMSIInstallParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_InstallParams) -[string]$configMSISilentParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_SilentParams) -[string]$configMSIUninstallParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_UninstallParams) -[string]$configMSILogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_LogPath) -[int32]$configMSIMutexWaitTime = $xmlConfigMSIOptions.MSI_MutexWaitTime +[String]$configMSILoggingOptions = $xmlConfigMSIOptions.MSI_LoggingOptions +[String]$configMSIInstallParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_InstallParams) +[String]$configMSISilentParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_SilentParams) +[String]$configMSIUninstallParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_UninstallParams) +[String]$configMSILogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_LogPath) +[Int32]$configMSIMutexWaitTime = $xmlConfigMSIOptions.MSI_MutexWaitTime +# Change paths to user accessible ones if RequireAdmin is false +If ($configToolkitRequireAdmin -eq $false) { + If ($xmlToolkitOptions.Toolkit_TempPathNoAdminRights) { + [String]$configToolkitTempPath = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_TempPathNoAdminRights) + } + If ($xmlToolkitOptions.Toolkit_RegPathNoAdminRights) { + [String]$configToolkitRegPath = $xmlToolkitOptions.Toolkit_RegPathNoAdminRights + } + If ($xmlToolkitOptions.Toolkit_LogPathNoAdminRights) { + [String]$configToolkitLogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_LogPathNoAdminRights) + } + If ($xmlConfigMSIOptions.MSI_LogPathNoAdminRights) { + [String]$configMSILogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_LogPathNoAdminRights) + } +} # Get UI Options [Xml.XmlElement]$xmlConfigUIOptions = $xmlConfig.UI_Options -[string]$configInstallationUILanguageOverride = $xmlConfigUIOptions.InstallationUI_LanguageOverride -[boolean]$configShowBalloonNotifications = [boolean]::Parse($xmlConfigUIOptions.ShowBalloonNotifications) -[int32]$configInstallationUITimeout = $xmlConfigUIOptions.InstallationUI_Timeout -[int32]$configInstallationUIExitCode = $xmlConfigUIOptions.InstallationUI_ExitCode -[int32]$configInstallationDeferExitCode = $xmlConfigUIOptions.InstallationDefer_ExitCode -[int32]$configInstallationPersistInterval = $xmlConfigUIOptions.InstallationPrompt_PersistInterval -[int32]$configInstallationRestartPersistInterval = $xmlConfigUIOptions.InstallationRestartPrompt_PersistInterval -[int32]$configInstallationPromptToSave = $xmlConfigUIOptions.InstallationPromptToSave_Timeout -[boolean]$configInstallationWelcomePromptDynamicRunningProcessEvaluation = [boolean]::Parse($xmlConfigUIOptions.InstallationWelcomePrompt_DynamicRunningProcessEvaluation) -[int32]$configInstallationWelcomePromptDynamicRunningProcessEvaluationInterval = $xmlConfigUIOptions.InstallationWelcomePrompt_DynamicRunningProcessEvaluationInterval +[String]$configInstallationUILanguageOverride = $xmlConfigUIOptions.InstallationUI_LanguageOverride +[Boolean]$configShowBalloonNotifications = [Boolean]::Parse($xmlConfigUIOptions.ShowBalloonNotifications) +[Int32]$configInstallationUITimeout = $xmlConfigUIOptions.InstallationUI_Timeout +[Int32]$configInstallationUIExitCode = $xmlConfigUIOptions.InstallationUI_ExitCode +[Int32]$configInstallationDeferExitCode = $xmlConfigUIOptions.InstallationDefer_ExitCode +[Int32]$configInstallationPersistInterval = $xmlConfigUIOptions.InstallationPrompt_PersistInterval +[Int32]$configInstallationRestartPersistInterval = $xmlConfigUIOptions.InstallationRestartPrompt_PersistInterval +[Int32]$configInstallationPromptToSave = $xmlConfigUIOptions.InstallationPromptToSave_Timeout +[Boolean]$configInstallationWelcomePromptDynamicRunningProcessEvaluation = [Boolean]::Parse($xmlConfigUIOptions.InstallationWelcomePrompt_DynamicRunningProcessEvaluation) +[Int32]$configInstallationWelcomePromptDynamicRunningProcessEvaluationInterval = $xmlConfigUIOptions.InstallationWelcomePrompt_DynamicRunningProcessEvaluationInterval # Define ScriptBlock for Loading Message UI Language Options (default for English if no localization found) -[scriptblock]$xmlLoadLocalizedUIMessages = { - # If a user is logged on, then get primary UI language for logged on user (even if running in session 0) - If ($RunAsActiveUser) { - # Read language defined by Group Policy - If (-not $HKULanguages) { - [string[]]$HKULanguages = Get-RegistryKey -Key 'HKLM:SOFTWARE\Policies\Microsoft\MUI\Settings' -Value 'PreferredUILanguages' - } - If (-not $HKULanguages) { - [string[]]$HKULanguages = Get-RegistryKey -Key 'HKCU\Software\Policies\Microsoft\Windows\Control Panel\Desktop' -Value 'PreferredUILanguages' -SID $RunAsActiveUser.SID - } - # Read language for Win Vista & higher machines - If (-not $HKULanguages) { - [string[]]$HKULanguages = Get-RegistryKey -Key 'HKCU\Control Panel\Desktop' -Value 'PreferredUILanguages' -SID $RunAsActiveUser.SID - } - If (-not $HKULanguages) { - [string[]]$HKULanguages = Get-RegistryKey -Key 'HKCU\Control Panel\Desktop\MuiCached' -Value 'MachinePreferredUILanguages' -SID $RunAsActiveUser.SID - } - If (-not $HKULanguages) { - [string[]]$HKULanguages = Get-RegistryKey -Key 'HKCU\Control Panel\International' -Value 'LocaleName' -SID $RunAsActiveUser.SID - } - # Read language for Win XP machines - If (-not $HKULanguages) { - [string]$HKULocale = Get-RegistryKey -Key 'HKCU\Control Panel\International' -Value 'Locale' -SID $RunAsActiveUser.SID - If ($HKULocale) { - [int32]$HKULocale = [Convert]::ToInt32('0x' + $HKULocale, 16) - [string[]]$HKULanguages = ([Globalization.CultureInfo]($HKULocale)).Name - } - } - If ($HKULanguages) { - [Globalization.CultureInfo]$PrimaryWindowsUILanguage = [Globalization.CultureInfo]($HKULanguages[0]) - [string]$HKUPrimaryLanguageShort = $PrimaryWindowsUILanguage.TwoLetterISOLanguageName.ToUpper() - - # If the detected language is Chinese, determine if it is simplified or traditional Chinese - If ($HKUPrimaryLanguageShort -eq 'ZH') { - If ($PrimaryWindowsUILanguage.EnglishName -match 'Simplified') { - [string]$HKUPrimaryLanguageShort = 'ZH-Hans' - } - If ($PrimaryWindowsUILanguage.EnglishName -match 'Traditional') { - [string]$HKUPrimaryLanguageShort = 'ZH-Hant' - } - } - - # If the detected language is Portuguese, determine if it is Brazilian Portuguese - If ($HKUPrimaryLanguageShort -eq 'PT') { - If ($PrimaryWindowsUILanguage.ThreeLetterWindowsLanguageName -eq 'PTB') { - [string]$HKUPrimaryLanguageShort = 'PT-BR' - } - } - } - } - - If ($HKUPrimaryLanguageShort) { - # Use the primary UI language of the logged in user - [string]$xmlUIMessageLanguage = "UI_Messages_$HKUPrimaryLanguageShort" - } - Else { - # Default to UI language of the account executing current process (even if it is the SYSTEM account) - [string]$xmlUIMessageLanguage = "UI_Messages_$currentLanguage" - } - # Default to English if the detected UI language is not available in the XMl config file - If (-not ($xmlConfig.$xmlUIMessageLanguage)) { [string]$xmlUIMessageLanguage = 'UI_Messages_EN' } - # Override the detected language if the override option was specified in the XML config file - If ($configInstallationUILanguageOverride) { [string]$xmlUIMessageLanguage = "UI_Messages_$configInstallationUILanguageOverride" } - - [Xml.XmlElement]$xmlUIMessages = $xmlConfig.$xmlUIMessageLanguage - [string]$configDiskSpaceMessage = $xmlUIMessages.DiskSpace_Message - [string]$configBalloonTextStart = $xmlUIMessages.BalloonText_Start - [string]$configBalloonTextComplete = $xmlUIMessages.BalloonText_Complete - [string]$configBalloonTextRestartRequired = $xmlUIMessages.BalloonText_RestartRequired - [string]$configBalloonTextFastRetry = $xmlUIMessages.BalloonText_FastRetry - [string]$configBalloonTextError = $xmlUIMessages.BalloonText_Error - [string]$configProgressMessageInstall = $xmlUIMessages.Progress_MessageInstall - [string]$configProgressMessageUninstall = $xmlUIMessages.Progress_MessageUninstall - [string]$configClosePromptMessage = $xmlUIMessages.ClosePrompt_Message - [string]$configClosePromptButtonClose = $xmlUIMessages.ClosePrompt_ButtonClose - [string]$configClosePromptButtonDefer = $xmlUIMessages.ClosePrompt_ButtonDefer - [string]$configClosePromptButtonContinue = $xmlUIMessages.ClosePrompt_ButtonContinue - [string]$configClosePromptButtonContinueTooltip = $xmlUIMessages.ClosePrompt_ButtonContinueTooltip - [string]$configClosePromptCountdownMessage = $xmlUIMessages.ClosePrompt_CountdownMessage - [string]$configDeferPromptWelcomeMessage = $xmlUIMessages.DeferPrompt_WelcomeMessage - [string]$configDeferPromptExpiryMessage = $xmlUIMessages.DeferPrompt_ExpiryMessage - [string]$configDeferPromptWarningMessage = $xmlUIMessages.DeferPrompt_WarningMessage - [string]$configDeferPromptRemainingDeferrals = $xmlUIMessages.DeferPrompt_RemainingDeferrals - [string]$configDeferPromptDeadline = $xmlUIMessages.DeferPrompt_Deadline - [string]$configBlockExecutionMessage = $xmlUIMessages.BlockExecution_Message - [string]$configDeploymentTypeInstall = $xmlUIMessages.DeploymentType_Install - [string]$configDeploymentTypeUnInstall = $xmlUIMessages.DeploymentType_UnInstall - [string]$configRestartPromptTitle = $xmlUIMessages.RestartPrompt_Title - [string]$configRestartPromptMessage = $xmlUIMessages.RestartPrompt_Message - [string]$configRestartPromptMessageTime = $xmlUIMessages.RestartPrompt_MessageTime - [string]$configRestartPromptMessageRestart = $xmlUIMessages.RestartPrompt_MessageRestart - [string]$configRestartPromptTimeRemaining = $xmlUIMessages.RestartPrompt_TimeRemaining - [string]$configRestartPromptButtonRestartLater = $xmlUIMessages.RestartPrompt_ButtonRestartLater - [string]$configRestartPromptButtonRestartNow = $xmlUIMessages.RestartPrompt_ButtonRestartNow - [string]$configWelcomePromptCountdownMessage = $xmlUIMessages.WelcomePrompt_CountdownMessage - [string]$configWelcomePromptCustomMessage = $xmlUIMessages.WelcomePrompt_CustomMessage +[ScriptBlock]$xmlLoadLocalizedUIMessages = { + # If a user is logged on, then get primary UI language for logged on user (even if running in session 0) + If ($RunAsActiveUser) { + # Read language defined by Group Policy + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\MUI\Settings' -Value 'PreferredUILanguages' + } + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Control Panel\Desktop' -Value 'PreferredUILanguages' -SID $RunAsActiveUser.SID + } + # Read language for Win Vista & higher machines + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop' -Value 'PreferredUILanguages' -SID $RunAsActiveUser.SID + } + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop\MuiCached' -Value 'MachinePreferredUILanguages' -SID $RunAsActiveUser.SID + } + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\International' -Value 'LocaleName' -SID $RunAsActiveUser.SID + } + # Read language for Win XP machines + If (-not $HKULanguages) { + [String]$HKULocale = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\International' -Value 'Locale' -SID $RunAsActiveUser.SID + If ($HKULocale) { + [Int32]$HKULocale = [Convert]::ToInt32('0x' + $HKULocale, 16) + [String[]]$HKULanguages = ([Globalization.CultureInfo]($HKULocale)).Name + } + } + If ($HKULanguages) { + [Globalization.CultureInfo]$PrimaryWindowsUILanguage = [Globalization.CultureInfo]($HKULanguages[0]) + [String]$HKUPrimaryLanguageShort = $PrimaryWindowsUILanguage.TwoLetterISOLanguageName.ToUpper() + + # If the detected language is Chinese, determine if it is simplified or traditional Chinese + If ($HKUPrimaryLanguageShort -eq 'ZH') { + If ($PrimaryWindowsUILanguage.EnglishName -match 'Simplified') { + [String]$HKUPrimaryLanguageShort = 'ZH-Hans' + } + If ($PrimaryWindowsUILanguage.EnglishName -match 'Traditional') { + [String]$HKUPrimaryLanguageShort = 'ZH-Hant' + } + } + + # If the detected language is Portuguese, determine if it is Brazilian Portuguese + If ($HKUPrimaryLanguageShort -eq 'PT') { + If ($PrimaryWindowsUILanguage.ThreeLetterWindowsLanguageName -eq 'PTB') { + [String]$HKUPrimaryLanguageShort = 'PT-BR' + } + } + } + } + + If ($HKUPrimaryLanguageShort) { + # Use the primary UI language of the logged in user + [String]$xmlUIMessageLanguage = "UI_Messages_$HKUPrimaryLanguageShort" + } + Else { + # Default to UI language of the account executing current process (even if it is the SYSTEM account) + [String]$xmlUIMessageLanguage = "UI_Messages_$currentLanguage" + } + # Default to English if the detected UI language is not available in the XMl config file + If (-not ($xmlConfig.$xmlUIMessageLanguage)) { + [String]$xmlUIMessageLanguage = 'UI_Messages_EN' + } + # Override the detected language if the override option was specified in the XML config file + If ($configInstallationUILanguageOverride) { + [String]$xmlUIMessageLanguage = "UI_Messages_$configInstallationUILanguageOverride" + } + + [Xml.XmlElement]$xmlUIMessages = $xmlConfig.$xmlUIMessageLanguage + [String]$configDiskSpaceMessage = $xmlUIMessages.DiskSpace_Message + [String]$configBalloonTextStart = $xmlUIMessages.BalloonText_Start + [String]$configBalloonTextComplete = $xmlUIMessages.BalloonText_Complete + [String]$configBalloonTextRestartRequired = $xmlUIMessages.BalloonText_RestartRequired + [String]$configBalloonTextFastRetry = $xmlUIMessages.BalloonText_FastRetry + [String]$configBalloonTextError = $xmlUIMessages.BalloonText_Error + [String]$configProgressMessageInstall = $xmlUIMessages.Progress_MessageInstall + [String]$configProgressMessageUninstall = $xmlUIMessages.Progress_MessageUninstall + [String]$configProgressMessageRepair = $xmlUIMessages.Progress_MessageRepair + [String]$configClosePromptMessage = $xmlUIMessages.ClosePrompt_Message + [String]$configClosePromptButtonClose = $xmlUIMessages.ClosePrompt_ButtonClose + [String]$configClosePromptButtonDefer = $xmlUIMessages.ClosePrompt_ButtonDefer + [String]$configClosePromptButtonContinue = $xmlUIMessages.ClosePrompt_ButtonContinue + [String]$configClosePromptButtonContinueTooltip = $xmlUIMessages.ClosePrompt_ButtonContinueTooltip + [String]$configClosePromptCountdownMessage = $xmlUIMessages.ClosePrompt_CountdownMessage + [String]$configDeferPromptWelcomeMessage = $xmlUIMessages.DeferPrompt_WelcomeMessage + [String]$configDeferPromptExpiryMessage = $xmlUIMessages.DeferPrompt_ExpiryMessage + [String]$configDeferPromptWarningMessage = $xmlUIMessages.DeferPrompt_WarningMessage + [String]$configDeferPromptRemainingDeferrals = $xmlUIMessages.DeferPrompt_RemainingDeferrals + [String]$configDeferPromptDeadline = $xmlUIMessages.DeferPrompt_Deadline + [String]$configBlockExecutionMessage = $xmlUIMessages.BlockExecution_Message + [String]$configDeploymentTypeInstall = $xmlUIMessages.DeploymentType_Install + [String]$configDeploymentTypeUnInstall = $xmlUIMessages.DeploymentType_UnInstall + [String]$configDeploymentTypeRepair = $xmlUIMessages.DeploymentType_Repair + [String]$configRestartPromptTitle = $xmlUIMessages.RestartPrompt_Title + [String]$configRestartPromptMessage = $xmlUIMessages.RestartPrompt_Message + [String]$configRestartPromptMessageTime = $xmlUIMessages.RestartPrompt_MessageTime + [String]$configRestartPromptMessageRestart = $xmlUIMessages.RestartPrompt_MessageRestart + [String]$configRestartPromptTimeRemaining = $xmlUIMessages.RestartPrompt_TimeRemaining + [String]$configRestartPromptButtonRestartLater = $xmlUIMessages.RestartPrompt_ButtonRestartLater + [String]$configRestartPromptButtonRestartNow = $xmlUIMessages.RestartPrompt_ButtonRestartNow + [String]$configWelcomePromptCountdownMessage = $xmlUIMessages.WelcomePrompt_CountdownMessage + [String]$configWelcomePromptCustomMessage = $xmlUIMessages.WelcomePrompt_CustomMessage } ## Variables: Script Directories -[string]$dirFiles = Join-Path -Path $scriptParentPath -ChildPath 'Files' -[string]$dirSupportFiles = Join-Path -Path $scriptParentPath -ChildPath 'SupportFiles' -[string]$dirAppDeployTemp = Join-Path -Path $configToolkitTempPath -ChildPath $appDeployToolkitName +[String]$dirFiles = Join-Path -Path $scriptParentPath -ChildPath 'Files' +[String]$dirSupportFiles = Join-Path -Path $scriptParentPath -ChildPath 'SupportFiles' +[String]$dirAppDeployTemp = Join-Path -Path $configToolkitTempPath -ChildPath $appDeployToolkitName + +If (-not (Test-Path -LiteralPath $dirAppDeployTemp -PathType 'Container' -ErrorAction 'SilentlyContinue')) { + $null = New-Item -Path $dirAppDeployTemp -ItemType 'Directory' -Force -ErrorAction 'SilentlyContinue' +} ## Set the deployment type to "Install" if it has not been specified -If (-not $deploymentType) { [string]$deploymentType = 'Install' } +If (-not $deploymentType) { + [String]$deploymentType = 'Install' +} ## Variables: Executables -[string]$exeWusa = 'wusa.exe' # Installs Standalone Windows Updates -[string]$exeMsiexec = 'msiexec.exe' # Installs MSI Installers -[string]$exeSchTasks = "$envWinDir\System32\schtasks.exe" # Manages Scheduled Tasks +[String]$exeWusa = "$envWinDir\System32\wusa.exe" # Installs Standalone Windows Updates +[String]$exeMsiexec = "$envWinDir\System32\msiexec.exe" # Installs MSI Installers +[String]$exeSchTasks = "$envWinDir\System32\schtasks.exe" # Manages Scheduled Tasks ## Variables: RegEx Patterns -[string]$MSIProductCodeRegExPattern = '^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$' +[String]$MSIProductCodeRegExPattern = '^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$' + +## Variables: Invalid FileName Characters +[Char[]]$invalidFileNameChars = [IO.Path]::GetinvalidFileNameChars() ## Variables: Registry Keys # Registry keys for native and WOW64 applications -[string[]]$regKeyApplications = 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' +[String[]]$regKeyApplications = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' If ($is64Bit) { - [string]$regKeyLotusNotes = 'HKLM:SOFTWARE\Wow6432Node\Lotus\Notes' + [String]$regKeyLotusNotes = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lotus\Notes' } Else { - [string]$regKeyLotusNotes = 'HKLM:SOFTWARE\Lotus\Notes' + [String]$regKeyLotusNotes = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Lotus\Notes' } -[string]$regKeyAppExecution = 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options' +[String]$regKeyAppExecution = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options' ## COM Objects: Initialize -[__comobject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'SilentlyContinue' -[__comobject]$ShellApp = New-Object -ComObject 'Shell.Application' -ErrorAction 'SilentlyContinue' +[__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'SilentlyContinue' +[__ComObject]$ShellApp = New-Object -ComObject 'Shell.Application' -ErrorAction 'SilentlyContinue' ## Variables: Reset/Remove Variables -[boolean]$msiRebootDetected = $false -[boolean]$BlockExecution = $false -[boolean]$installationStarted = $false -[boolean]$runningTaskSequence = $false -If (Test-Path -LiteralPath 'variable:welcomeTimer') { Remove-Variable -Name 'welcomeTimer' -Scope 'Script'} +[Boolean]$msiRebootDetected = $false +[Boolean]$BlockExecution = $false +[Boolean]$installationStarted = $false +[Boolean]$runningTaskSequence = $false +If (Test-Path -LiteralPath 'variable:welcomeTimer') { + Remove-Variable -Name 'welcomeTimer' -Scope 'Script' +} # Reset the deferral history -If (Test-Path -LiteralPath 'variable:deferHistory') { Remove-Variable -Name 'deferHistory' } -If (Test-Path -LiteralPath 'variable:deferTimes') { Remove-Variable -Name 'deferTimes' } -If (Test-Path -LiteralPath 'variable:deferDays') { Remove-Variable -Name 'deferDays' } - -## Variables: System DPI Scale Factor -[scriptblock]$GetDisplayScaleFactor = { - # If a user is logged on, then get display scale factor for logged on user (even if running in session 0) - [boolean]$UserDisplayScaleFactor = $false - If ($RunAsActiveUser) { - [int32]$dpiPixels = Get-RegistryKey -Key 'HKCU\Control Panel\Desktop\WindowMetrics' -Value 'AppliedDPI' -SID $RunAsActiveUser.SID - If (-not ([string]$dpiPixels)) { - [int32]$dpiPixels = Get-RegistryKey -Key 'HKCU\Control Panel\Desktop' -Value 'LogPixels' -SID $RunAsActiveUser.SID - } - [boolean]$UserDisplayScaleFactor = $true - } - If (-not ([string]$dpiPixels)) { - # This registry setting only exists if system scale factor has been changed at least once - [int32]$dpiPixels = Get-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI' -Value 'LogPixels' - [boolean]$UserDisplayScaleFactor = $false - } - Switch ($dpiPixels) { - 96 { [int32]$dpiScale = 100 } - 120 { [int32]$dpiScale = 125 } - 144 { [int32]$dpiScale = 150 } - 192 { [int32]$dpiScale = 200 } - Default { [int32]$dpiScale = 100 } - } +If (Test-Path -LiteralPath 'variable:deferHistory') { + Remove-Variable -Name 'deferHistory' +} +If (Test-Path -LiteralPath 'variable:deferTimes') { + Remove-Variable -Name 'deferTimes' +} +If (Test-Path -LiteralPath 'variable:deferDays') { + Remove-Variable -Name 'deferDays' +} + +## Variables: System DPI Scale Factor (Requires PSADT.UiAutomation loaded) +[ScriptBlock]$GetDisplayScaleFactor = { + # If a user is logged on, then get display scale factor for logged on user (even if running in session 0) + [Boolean]$UserDisplayScaleFactor = $false + [System.Drawing.Graphics]$GraphicsObject = $null + [IntPtr]$DeviceContextHandle = [IntPtr]::Zero + [Int32]$dpiScale = 0 + [Int32]$dpiPixels = 0 + + Try { + # Get Graphics Object from the current Window Handle + [System.Drawing.Graphics]$GraphicsObject = [System.Drawing.Graphics]::FromHwnd([IntPtr]::Zero) + # Get Device Context Handle + [IntPtr]$DeviceContextHandle = $GraphicsObject.GetHdc() + # Get Logical and Physical screen height + [Int32]$LogicalScreenHeight = [PSADT.UiAutomation]::GetDeviceCaps($DeviceContextHandle, [Int32][PSADT.UiAutomation+DeviceCap]::VERTRES) + [Int32]$PhysicalScreenHeight = [PSADT.UiAutomation]::GetDeviceCaps($DeviceContextHandle, [Int32][PSADT.UiAutomation+DeviceCap]::DESKTOPVERTRES) + # Calculate dpi scale and pixels + [Int32]$dpiScale = [Math]::Round([Double]$PhysicalScreenHeight / [Double]$LogicalScreenHeight, 2) * 100 + [Int32]$dpiPixels = [Math]::Round(($dpiScale / 100) * 96, 0) + } + Catch { + [Int32]$dpiScale = 0 + [Int32]$dpiPixels = 0 + } + Finally { + # Release the device context handle and dispose of the graphics object + If ($null -ne $GraphicsObject) { + If ($DeviceContextHandle -ne [IntPtr]::Zero) { + $GraphicsObject.ReleaseHdc($DeviceContextHandle) + } + $GraphicsObject.Dispose() + } + } + # Failed to get dpi, try to read them from registry - Might not be accurate + If ($RunAsActiveUser) { + If ($dpiPixels -lt 1) { + [Int32]$dpiPixels = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics' -Value 'AppliedDPI' -SID $RunAsActiveUser.SID + } + If ($dpiPixels -lt 1) { + [Int32]$dpiPixels = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop' -Value 'LogPixels' -SID $RunAsActiveUser.SID + } + [Boolean]$UserDisplayScaleFactor = $true + } + # Failed to get dpi from first two registry entries, try to read FontDPI - Usually inaccurate + If ($dpiPixels -lt 1) { + # This registry setting only exists if system scale factor has been changed at least once + [Int32]$dpiPixels = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI' -Value 'LogPixels' + [Boolean]$UserDisplayScaleFactor = $false + } + # Calculate dpi scale if its empty and we have dpi pixels + If (($dpiScale -lt 1) -and ($dpiPixels -gt 0)) { + [Int32]$dpiScale = [Math]::Round(($dpiPixels * 100) / 96) + } +} +## Variables: Resolve Parameters. For use in a pipeline +[ScriptBlock]$ResolveParameters = { + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()]$Parameter + ) + + Switch ($Parameter.Value.GetType().Name) { + 'SwitchParameter' { + "-$($Parameter.Key):`$$($Parameter.Value.ToString().ToLower())" + } + 'Boolean' { + "-$($Parameter.Key):`$$($Parameter.Value.ToString().ToLower())" + } + 'Int16' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Int32' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Int64' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'UInt16' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'UInt32' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'UInt64' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Single' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Double' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Decimal' { + "-$($Parameter.Key):$($Parameter.Value)" + } + default { + "-$($Parameter.Key):`'$($Parameter.Value)`'" + } + } } #endregion ##*============================================= @@ -468,4508 +748,7049 @@ If (Test-Path -LiteralPath 'variable:deferDays') { Remove-Variable -Name 'deferD #region Function Write-FunctionHeaderOrFooter Function Write-FunctionHeaderOrFooter { -<# + <# .SYNOPSIS - Write the function header or footer to the log upon first entering or exiting a function. + +Write the function header or footer to the log upon first entering or exiting a function. + .DESCRIPTION - Write the "Function Start" message, the bound parameters the function was invoked with, or the "Function End" message when entering or exiting a function. - Messages are debug messages so will only be logged if LogDebugMessage option is enabled in XML config file. + +Write the "Function Start" message, the bound parameters the function was invoked with, or the "Function End" message when entering or exiting a function. + +Messages are debug messages so will only be logged if LogDebugMessage option is enabled in XML config file. + .PARAMETER CmdletName - The name of the function this function is invoked from. + +The name of the function this function is invoked from. + .PARAMETER CmdletBoundParameters - The bound parameters of the function this function is invoked from. + +The bound parameters of the function this function is invoked from. + .PARAMETER Header - Write the function header. + +Write the function header. + .PARAMETER Footer - Write the function footer. + +Write the function footer. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + +Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + .EXAMPLE - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + +Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$CmdletName, - [Parameter(Mandatory=$true,ParameterSetName='Header')] - [AllowEmptyCollection()] - [hashtable]$CmdletBoundParameters, - [Parameter(Mandatory=$true,ParameterSetName='Header')] - [switch]$Header, - [Parameter(Mandatory=$true,ParameterSetName='Footer')] - [switch]$Footer - ) - - If ($Header) { - Write-Log -Message 'Function Start' -Source ${CmdletName} -DebugMessage - - ## Get the parameters that the calling function was invoked with - [string]$CmdletBoundParameters = $CmdletBoundParameters | Format-Table -Property @{ Label = 'Parameter'; Expression = { "[-$($_.Key)]" } }, @{ Label = 'Value'; Expression = { $_.Value }; Alignment = 'Left' }, @{ Label = 'Type'; Expression = { $_.Value.GetType().Name }; Alignment = 'Left' } -AutoSize -Wrap | Out-String - If ($CmdletBoundParameters) { - Write-Log -Message "Function invoked with bound parameter(s): `n$CmdletBoundParameters" -Source ${CmdletName} -DebugMessage - } - Else { - Write-Log -Message 'Function invoked without any bound parameters.' -Source ${CmdletName} -DebugMessage - } - } - ElseIf ($Footer) { - Write-Log -Message 'Function End' -Source ${CmdletName} -DebugMessage - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$CmdletName, + [Parameter(Mandatory = $true, ParameterSetName = 'Header')] + [AllowEmptyCollection()] + [Hashtable]$CmdletBoundParameters, + [Parameter(Mandatory = $true, ParameterSetName = 'Header')] + [Switch]$Header, + [Parameter(Mandatory = $true, ParameterSetName = 'Footer')] + [Switch]$Footer + ) + + If ($Header) { + Write-Log -Message 'Function Start' -Source ${CmdletName} -DebugMessage + + ## Get the parameters that the calling function was invoked with + [String]$CmdletBoundParameters = $CmdletBoundParameters | Format-Table -Property @{ Label = 'Parameter'; Expression = { "[-$($_.Key)]" } }, @{ Label = 'Value'; Expression = { $_.Value }; Alignment = 'Left' }, @{ Label = 'Type'; Expression = { $_.Value.GetType().Name }; Alignment = 'Left' } -AutoSize -Wrap | Out-String + If ($CmdletBoundParameters) { + Write-Log -Message "Function invoked with bound parameter(s): `r`n$CmdletBoundParameters" -Source ${CmdletName} -DebugMessage + } + Else { + Write-Log -Message 'Function invoked without any bound parameters.' -Source ${CmdletName} -DebugMessage + } + } + ElseIf ($Footer) { + Write-Log -Message 'Function End' -Source ${CmdletName} -DebugMessage + } } #endregion + + #region Function Execute-MSP Function Execute-MSP { -<# + <# .SYNOPSIS - Reads SummaryInfo targeted product codes in MSP file and determines if the MSP file applies to any installed products - If a valid installed product is found, triggers the Execute-MSI function to patch the installation. + +Reads SummaryInfo targeted product codes in MSP file and determines if the MSP file applies to any installed products +If a valid installed product is found, triggers the Execute-MSI function to patch the installation. +Uses default config MSI parameters. You can use -AddParameters to add additional parameters. + .PARAMETER Path + +Path to the msp file + +.PARAMETER AddParameters + +Additional parameters + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Execute-MSP -Path 'Adobe_Reader_11.0.3_EN.msp' + .EXAMPLE - Execute-MSP -Path 'Adobe_Reader_11.0.3_EN.msp' + +Execute-MSP -Path 'AcroRdr2017Upd1701130143_MUI.msp' -AddParameters 'ALLUSERS=1' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,HelpMessage='Please enter the path to the MSP file')] - [ValidateScript({('.msp' -contains [IO.Path]::GetExtension($_))})] - [Alias('FilePath')] - [string]$Path - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## If the MSP is in the Files directory, set the full path to the MSP - If (Test-Path -LiteralPath (Join-Path -Path $dirFiles -ChildPath $path -ErrorAction 'SilentlyContinue') -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { - [string]$mspFile = Join-Path -Path $dirFiles -ChildPath $path - } - ElseIf (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') { - [string]$mspFile = (Get-Item -LiteralPath $Path).FullName - } - Else { - Write-Log -Message "Failed to find MSP file [$path]." -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to find MSP file [$path]." - } - Continue - } - Write-Log -Message 'Checking MSP file for valid product codes' -Source ${CmdletName} - - [boolean]$IsMSPNeeded = $false - - $Installer = New-Object -com WindowsInstaller.Installer - $Database = $Installer.GetType().InvokeMember(“OpenDatabase”, “InvokeMethod”, $Null, $Installer, $($mspFile,([int32]32))) - [__comobject]$SummaryInformation = Get-ObjectProperty -InputObject $Database -PropertyName 'SummaryInformation' - [hashtable]$SummaryInfoProperty = @{} - $all = (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(7)).Split(";") - Foreach($FormattedProductCode in $all) { - [psobject]$MSIInstalled = Get-InstalledApplication -ProductCode $FormattedProductCode - If ($MSIInstalled) {[boolean]$IsMSPNeeded = $true } - } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation) } Catch { } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($DataBase) } Catch { } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) } Catch { } - If ($IsMSPNeeded) { Execute-MSI -Action Patch -Path $Path } - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, HelpMessage = 'Please enter the path to the MSP file')] + [ValidateScript({ ('.msp' -contains [IO.Path]::GetExtension($_)) })] + [Alias('FilePath')] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$AddParameters + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If the MSP is in the Files directory, set the full path to the MSP + If (Test-Path -LiteralPath (Join-Path -Path $dirFiles -ChildPath $path -ErrorAction 'SilentlyContinue') -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { + [String]$mspFile = Join-Path -Path $dirFiles -ChildPath $path + } + ElseIf (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') { + [String]$mspFile = (Get-Item -LiteralPath $Path).FullName + } + Else { + Write-Log -Message "Failed to find MSP file [$path]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to find MSP file [$path]." + } + Continue + } + Write-Log -Message 'Checking MSP file for valid product codes.' -Source ${CmdletName} + + [Boolean]$IsMSPNeeded = $false + + ## Create a Windows Installer object + [__ComObject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' + + ## Define properties for how the MSI database is opened + [Int32]$msiOpenDatabaseModePatchFile = 32 + [Int32]$msiOpenDatabaseMode = $msiOpenDatabaseModePatchFile + ## Open database in read only mode + [__ComObject]$Database = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($mspFile, $msiOpenDatabaseMode) + ## Get the SummaryInformation from the windows installer database + [__ComObject]$SummaryInformation = Get-ObjectProperty -InputObject $Database -PropertyName 'SummaryInformation' + [Hashtable]$SummaryInfoProperty = @{} + $AllTargetedProductCodes = (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(7)).Split(';') + ForEach ($FormattedProductCode in $AllTargetedProductCodes) { + [PSObject]$MSIInstalled = Get-InstalledApplication -ProductCode $FormattedProductCode + If ($MSIInstalled) { + [Boolean]$IsMSPNeeded = $true + } + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Database) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) + } + Catch { + } + If ($IsMSPNeeded) { + If ($AddParameters) { + Execute-MSI -Action 'Patch' -Path $Path -AddParameters $AddParameters + } + Else { + Execute-MSI -Action 'Patch' -Path $Path + } + } + } } #endregion + #region Function Write-Log Function Write-Log { -<# + <# .SYNOPSIS - Write messages to a log file in CMTrace.exe compatible format or Legacy text file format. + +Write messages to a log file in CMTrace.exe compatible format or Legacy text file format. + .DESCRIPTION - Write messages to a log file in CMTrace.exe compatible format or Legacy text file format and optionally display in the console. + +Write messages to a log file in CMTrace.exe compatible format or Legacy text file format and optionally display in the console. + .PARAMETER Message - The message to write to the log file or output to the console. + +The message to write to the log file or output to the console. + .PARAMETER Severity - Defines message type. When writing to console or CMTrace.exe log format, it allows highlighting of message type. - Options: 1 = Information (default), 2 = Warning (highlighted in yellow), 3 = Error (highlighted in red) + +Defines message type. When writing to console or CMTrace.exe log format, it allows highlighting of message type. +Options: 1 = Information (default), 2 = Warning (highlighted in yellow), 3 = Error (highlighted in red) + .PARAMETER Source - The source of the message being logged. + +The source of the message being logged. + .PARAMETER ScriptSection - The heading for the portion of the script that is being executed. Default is: $script:installPhase. + +The heading for the portion of the script that is being executed. Default is: $script:installPhase. + .PARAMETER LogType - Choose whether to write a CMTrace.exe compatible log file or a Legacy text log file. + +Choose whether to write a CMTrace.exe compatible log file or a Legacy text log file. + .PARAMETER LogFileDirectory - Set the directory where the log file will be saved. + +Set the directory where the log file will be saved. + .PARAMETER LogFileName - Set the name of the log file. + +Set the name of the log file. + .PARAMETER MaxLogFileSizeMB - Maximum file size limit for log file in megabytes (MB). Default is 10 MB. + +Maximum file size limit for log file in megabytes (MB). Default is 10 MB. + .PARAMETER WriteHost - Write the log message to the console. + +Write the log message to the console. + .PARAMETER ContinueOnError - Suppress writing log message to console on failure to write message to log file. Default is: $true. + +Suppress writing log message to console on failure to write message to log file. Default is: $true. + .PARAMETER PassThru - Return the message that was passed to the function + +Return the message that was passed to the function + .PARAMETER DebugMessage - Specifies that the message is a debug message. Debug messages only get logged if -LogDebugMessage is set to $true. + +Specifies that the message is a debug message. Debug messages only get logged if -LogDebugMessage is set to $true. + .PARAMETER LogDebugMessage - Debug messages only get logged if this parameter is set to $true in the config XML file. + +Debug messages only get logged if this parameter is set to $true in the config XML file. + +.INPUTS + +System.String + +The message to write to the log file or output to the console. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Write-Log -Message "Installing patch MS15-031" -Source 'Add-Patch' -LogType 'CMTrace' + +.EXAMPLE + +Write-Log -Message "Script is running on Windows 8" -Source 'Test-ValidOS' -LogType 'Legacy' + .EXAMPLE - Write-Log -Message "Installing patch MS15-031" -Source 'Add-Patch' -LogType 'CMTrace' + +Write-Log -Message "Log only message" -WriteHost $false + +.NOTES + +.LINK +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyCollection()] + [Alias('Text')] + [String[]]$Message, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateRange(1, 3)] + [Int16]$Severity = 1, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNull()] + [String]$Source = $([String]$parentFunctionName = [IO.Path]::GetFileNameWithoutExtension((Get-Variable -Name 'MyInvocation' -Scope 1 -ErrorAction 'SilentlyContinue').Value.MyCommand.Name); If ($parentFunctionName) { + $parentFunctionName + } + Else { + 'Unknown' + }), + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [String]$ScriptSection = $script:installPhase, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateSet('CMTrace', 'Legacy')] + [String]$LogType = $configToolkitLogStyle, + [Parameter(Mandatory = $false, Position = 5)] + [ValidateNotNullorEmpty()] + [String]$LogFileDirectory = $(If ($configToolkitCompressLogs) { + $logTempFolder + } + Else { + $configToolkitLogDir + }), + [Parameter(Mandatory = $false, Position = 6)] + [ValidateNotNullorEmpty()] + [String]$LogFileName = $logName, + [Parameter(Mandatory = $false, Position = 7)] + [ValidateNotNullorEmpty()] + [Decimal]$MaxLogFileSizeMB = $configToolkitLogMaxSize, + [Parameter(Mandatory = $false, Position = 8)] + [ValidateNotNullorEmpty()] + [Boolean]$WriteHost = $configToolkitLogWriteToHost, + [Parameter(Mandatory = $false, Position = 9)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true, + [Parameter(Mandatory = $false, Position = 10)] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false, Position = 11)] + [Switch]$DebugMessage = $false, + [Parameter(Mandatory = $false, Position = 12)] + [Boolean]$LogDebugMessage = $configToolkitLogDebugMessage + ) + + Begin { + ## Get the name of this function + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + ## Logging Variables + # Log file date/time + [DateTime]$DateTimeNow = Get-Date + [String]$LogTime = $DateTimeNow.ToString('HH\:mm\:ss.fff') + [String]$LogDate = $DateTimeNow.ToString('MM-dd-yyyy') + If (-not (Test-Path -LiteralPath 'variable:LogTimeZoneBias')) { + [Int32]$script:LogTimeZoneBias = [TimeZone]::CurrentTimeZone.GetUtcOffset($DateTimeNow).TotalMinutes + } + [String]$LogTimePlusBias = $LogTime + $script:LogTimeZoneBias + # Initialize variables + [Boolean]$ExitLoggingFunction = $false + If (-not (Test-Path -LiteralPath 'variable:DisableLogging')) { + $DisableLogging = $false + } + # Check if the script section is defined + [Boolean]$ScriptSectionDefined = [Boolean](-not [String]::IsNullOrEmpty($ScriptSection)) + # Get the file name of the source script + Try { + If ($script:MyInvocation.Value.ScriptName) { + [String]$ScriptSource = Split-Path -Path $script:MyInvocation.Value.ScriptName -Leaf -ErrorAction 'Stop' + } + Else { + [String]$ScriptSource = Split-Path -Path $script:MyInvocation.MyCommand.Definition -Leaf -ErrorAction 'Stop' + } + } + Catch { + $ScriptSource = '' + } + + ## Create script block for generating CMTrace.exe compatible log entry + [ScriptBlock]$CMTraceLogString = { + Param ( + [String]$lMessage, + [String]$lSource, + [Int16]$lSeverity + ) + "" + "" + } + + ## Create script block for writing log entry to the console + [ScriptBlock]$WriteLogLineToHost = { + Param ( + [String]$lTextLogLine, + [Int16]$lSeverity + ) + If ($WriteHost) { + # Only output using color options if running in a host which supports colors. + If ($Host.UI.RawUI.ForegroundColor) { + Switch ($lSeverity) { + 3 { + Write-Host -Object $lTextLogLine -ForegroundColor 'Red' -BackgroundColor 'Black' + } + 2 { + Write-Host -Object $lTextLogLine -ForegroundColor 'Yellow' -BackgroundColor 'Black' + } + 1 { + Write-Host -Object $lTextLogLine + } + } + } + # If executing "powershell.exe -File .ps1 > log.txt", then all the Write-Host calls are converted to Write-Output calls so that they are included in the text log. + Else { + Write-Output -InputObject ($lTextLogLine) + } + } + } + + ## Exit function if it is a debug message and logging debug messages is not enabled in the config XML file + If (($DebugMessage) -and (-not $LogDebugMessage)) { + [Boolean]$ExitLoggingFunction = $true; Return + } + ## Exit function if logging to file is disabled and logging to console host is disabled + If (($DisableLogging) -and (-not $WriteHost)) { + [Boolean]$ExitLoggingFunction = $true; Return + } + ## Exit Begin block if logging is disabled + If ($DisableLogging) { + Return + } + ## Exit function function if it is an [Initialization] message and the toolkit has been relaunched + If (($AsyncToolkitLaunch) -and ($ScriptSection -eq 'Initialization')) { + [Boolean]$ExitLoggingFunction = $true; Return + } + + ## Create the directory where the log file will be saved + If (-not (Test-Path -LiteralPath $LogFileDirectory -PathType 'Container')) { + Try { + $null = New-Item -Path $LogFileDirectory -Type 'Directory' -Force -ErrorAction 'Stop' + } + Catch { + [Boolean]$ExitLoggingFunction = $true + # If error creating directory, write message to console + If (-not $ContinueOnError) { + Write-Host -Object "[$LogDate $LogTime] [${CmdletName}] $ScriptSection :: Failed to create the log directory [$LogFileDirectory]. `r`n$(Resolve-Error)" -ForegroundColor 'Red' + } + Return + } + } + + ## Assemble the fully qualified path to the log file + [String]$LogFilePath = Join-Path -Path $LogFileDirectory -ChildPath $LogFileName + } + Process { + ## Exit function if logging is disabled + If ($ExitLoggingFunction) { + Return + } + + ForEach ($Msg in $Message) { + ## If the message is not $null or empty, create the log entry for the different logging methods + [String]$CMTraceMsg = '' + [String]$ConsoleLogLine = '' + [String]$LegacyTextLogLine = '' + If ($Msg) { + # Create the CMTrace log message + If ($ScriptSectionDefined) { + [String]$CMTraceMsg = "[$ScriptSection] :: $Msg" + } + + # Create a Console and Legacy "text" log entry + [String]$LegacyMsg = "[$LogDate $LogTime]" + If ($ScriptSectionDefined) { + [String]$LegacyMsg += " [$ScriptSection]" + } + If ($Source) { + [String]$ConsoleLogLine = "$LegacyMsg [$Source] :: $Msg" + Switch ($Severity) { + 3 { + [String]$LegacyTextLogLine = "$LegacyMsg [$Source] [Error] :: $Msg" + } + 2 { + [String]$LegacyTextLogLine = "$LegacyMsg [$Source] [Warning] :: $Msg" + } + 1 { + [String]$LegacyTextLogLine = "$LegacyMsg [$Source] [Info] :: $Msg" + } + } + } + Else { + [String]$ConsoleLogLine = "$LegacyMsg :: $Msg" + Switch ($Severity) { + 3 { + [String]$LegacyTextLogLine = "$LegacyMsg [Error] :: $Msg" + } + 2 { + [String]$LegacyTextLogLine = "$LegacyMsg [Warning] :: $Msg" + } + 1 { + [String]$LegacyTextLogLine = "$LegacyMsg [Info] :: $Msg" + } + } + } + } + + ## Execute script block to create the CMTrace.exe compatible log entry + [String]$CMTraceLogLine = & $CMTraceLogString -lMessage $CMTraceMsg -lSource $Source -lSeverity $Severity + + ## Choose which log type to write to file + If ($LogType -ieq 'CMTrace') { + [String]$LogLine = $CMTraceLogLine + } + Else { + [String]$LogLine = $LegacyTextLogLine + } + + ## Write the log entry to the log file if logging is not currently disabled + If (-not $DisableLogging) { + Try { + $LogLine | Out-File -FilePath $LogFilePath -Append -NoClobber -Force -Encoding 'UTF8' -ErrorAction 'Stop' + } + Catch { + If (-not $ContinueOnError) { + Write-Host -Object "[$LogDate $LogTime] [$ScriptSection] [${CmdletName}] :: Failed to write message [$Msg] to the log file [$LogFilePath]. `r`n$(Resolve-Error)" -ForegroundColor 'Red' + } + } + } + + ## Execute script block to write the log entry to the console if $WriteHost is $true + & $WriteLogLineToHost -lTextLogLine $ConsoleLogLine -lSeverity $Severity + } + } + End { + ## Archive log file if size is greater than $MaxLogFileSizeMB and $MaxLogFileSizeMB > 0 + Try { + If ((-not $ExitLoggingFunction) -and (-not $DisableLogging)) { + [IO.FileInfo]$LogFile = Get-ChildItem -LiteralPath $LogFilePath -ErrorAction 'Stop' + [Decimal]$LogFileSizeMB = $LogFile.Length / 1MB + If (($LogFileSizeMB -gt $MaxLogFileSizeMB) -and ($MaxLogFileSizeMB -gt 0)) { + ## Change the file extension to "lo_" + [String]$ArchivedOutLogFile = [IO.Path]::ChangeExtension($LogFilePath, 'lo_') + [Hashtable]$ArchiveLogParams = @{ ScriptSection = $ScriptSection; Source = ${CmdletName}; Severity = 2; LogFileDirectory = $LogFileDirectory; LogFileName = $LogFileName; LogType = $LogType; MaxLogFileSizeMB = 0; WriteHost = $WriteHost; ContinueOnError = $ContinueOnError; PassThru = $false } + + ## Log message about archiving the log file + $ArchiveLogMessage = "Maximum log file size [$MaxLogFileSizeMB MB] reached. Rename log file to [$ArchivedOutLogFile]." + Write-Log -Message $ArchiveLogMessage @ArchiveLogParams + + ## Archive existing log file from .log to .lo_. Overwrites any existing .lo_ file. This is the same method SCCM uses for log files. + Move-Item -LiteralPath $LogFilePath -Destination $ArchivedOutLogFile -Force -ErrorAction 'Stop' + + ## Start new log file and Log message about archiving the old log file + $NewLogMessage = "Previous log file was renamed to [$ArchivedOutLogFile] because maximum log file size of [$MaxLogFileSizeMB MB] was reached." + Write-Log -Message $NewLogMessage @ArchiveLogParams + } + } + } + Catch { + ## If renaming of file fails, script will continue writing to log file even if size goes over the max file size + } + Finally { + If ($PassThru) { + Write-Output -InputObject ($Message) + } + } + } +} +#endregion + + +#region Function Remove-InvalidFileNameChars +Function Remove-InvalidFileNameChars { + <# +.SYNOPSIS + +Remove invalid characters from the supplied string. + +.DESCRIPTION + +Remove invalid characters from the supplied string and returns a valid filename as a string. + +.PARAMETER Name + +Text to remove invalid filename characters from. + +.INPUTS + +System.String + +A string containing invalid filename characters. + +.OUTPUTS + +System.String + +Returns the input string with the invalid characters removed. + .EXAMPLE - Write-Log -Message "Script is running on Windows 8" -Source 'Test-ValidOS' -LogType 'Legacy' + +Remove-InvalidFileNameChars -Name "Filename/\1" + .NOTES + +This functions always returns a string however it can be empty if the name only contains invalid characters. +Do no use this command for an entire path as '\' is not a valid filename character. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] - [AllowEmptyCollection()] - [Alias('Text')] - [string[]]$Message, - [Parameter(Mandatory=$false,Position=1)] - [ValidateRange(1,3)] - [int16]$Severity = 1, - [Parameter(Mandatory=$false,Position=2)] - [ValidateNotNull()] - [string]$Source = '', - [Parameter(Mandatory=$false,Position=3)] - [ValidateNotNullorEmpty()] - [string]$ScriptSection = $script:installPhase, - [Parameter(Mandatory=$false,Position=4)] - [ValidateSet('CMTrace','Legacy')] - [string]$LogType = $configToolkitLogStyle, - [Parameter(Mandatory=$false,Position=5)] - [ValidateNotNullorEmpty()] - [string]$LogFileDirectory = $(If ($configToolkitCompressLogs) { $logTempFolder } Else { $configToolkitLogDir }), - [Parameter(Mandatory=$false,Position=6)] - [ValidateNotNullorEmpty()] - [string]$LogFileName = $logName, - [Parameter(Mandatory=$false,Position=7)] - [ValidateNotNullorEmpty()] - [decimal]$MaxLogFileSizeMB = $configToolkitLogMaxSize, - [Parameter(Mandatory=$false,Position=8)] - [ValidateNotNullorEmpty()] - [boolean]$WriteHost = $configToolkitLogWriteToHost, - [Parameter(Mandatory=$false,Position=9)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true, - [Parameter(Mandatory=$false,Position=10)] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false,Position=11)] - [switch]$DebugMessage = $false, - [Parameter(Mandatory=$false,Position=12)] - [boolean]$LogDebugMessage = $configToolkitLogDebugMessage - ) - - Begin { - ## Get the name of this function - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - ## Logging Variables - # Log file date/time - [string]$LogTime = (Get-Date -Format 'HH:mm:ss.fff').ToString() - [string]$LogDate = (Get-Date -Format 'MM-dd-yyyy').ToString() - If (-not (Test-Path -LiteralPath 'variable:LogTimeZoneBias')) { [int32]$script:LogTimeZoneBias = [timezone]::CurrentTimeZone.GetUtcOffset([datetime]::Now).TotalMinutes } - [string]$LogTimePlusBias = $LogTime + $script:LogTimeZoneBias - # Initialize variables - [boolean]$ExitLoggingFunction = $false - If (-not (Test-Path -LiteralPath 'variable:DisableLogging')) { $DisableLogging = $false } - # Check if the script section is defined - [boolean]$ScriptSectionDefined = [boolean](-not [string]::IsNullOrEmpty($ScriptSection)) - # Get the file name of the source script - Try { - If ($script:MyInvocation.Value.ScriptName) { - [string]$ScriptSource = Split-Path -Path $script:MyInvocation.Value.ScriptName -Leaf -ErrorAction 'Stop' - } - Else { - [string]$ScriptSource = Split-Path -Path $script:MyInvocation.MyCommand.Definition -Leaf -ErrorAction 'Stop' - } - } - Catch { - $ScriptSource = '' - } - - ## Create script block for generating CMTrace.exe compatible log entry - [scriptblock]$CMTraceLogString = { - Param ( - [string]$lMessage, - [string]$lSource, - [int16]$lSeverity - ) - "" + "" - } - - ## Create script block for writing log entry to the console - [scriptblock]$WriteLogLineToHost = { - Param ( - [string]$lTextLogLine, - [int16]$lSeverity - ) - If ($WriteHost) { - # Only output using color options if running in a host which supports colors. - If ($Host.UI.RawUI.ForegroundColor) { - Switch ($lSeverity) { - 3 { Write-Host -Object $lTextLogLine -ForegroundColor 'Red' -BackgroundColor 'Black' } - 2 { Write-Host -Object $lTextLogLine -ForegroundColor 'Yellow' -BackgroundColor 'Black' } - 1 { Write-Host -Object $lTextLogLine } - } - } - # If executing "powershell.exe -File .ps1 > log.txt", then all the Write-Host calls are converted to Write-Output calls so that they are included in the text log. - Else { - Write-Output -InputObject $lTextLogLine - } - } - } - - ## Exit function if it is a debug message and logging debug messages is not enabled in the config XML file - If (($DebugMessage) -and (-not $LogDebugMessage)) { [boolean]$ExitLoggingFunction = $true; Return } - ## Exit function if logging to file is disabled and logging to console host is disabled - If (($DisableLogging) -and (-not $WriteHost)) { [boolean]$ExitLoggingFunction = $true; Return } - ## Exit Begin block if logging is disabled - If ($DisableLogging) { Return } - ## Exit function function if it is an [Initialization] message and the toolkit has been relaunched - If (($AsyncToolkitLaunch) -and ($ScriptSection -eq 'Initialization')) { [boolean]$ExitLoggingFunction = $true; Return } - - ## Create the directory where the log file will be saved - If (-not (Test-Path -LiteralPath $LogFileDirectory -PathType 'Container')) { - Try { - $null = New-Item -Path $LogFileDirectory -Type 'Directory' -Force -ErrorAction 'Stop' - } - Catch { - [boolean]$ExitLoggingFunction = $true - # If error creating directory, write message to console - If (-not $ContinueOnError) { - Write-Host -Object "[$LogDate $LogTime] [${CmdletName}] $ScriptSection :: Failed to create the log directory [$LogFileDirectory]. `n$(Resolve-Error)" -ForegroundColor 'Red' - } - Return - } - } - - ## Assemble the fully qualified path to the log file - [string]$LogFilePath = Join-Path -Path $LogFileDirectory -ChildPath $LogFileName - } - Process { - ## Exit function if logging is disabled - If ($ExitLoggingFunction) { Return } - - ForEach ($Msg in $Message) { - ## If the message is not $null or empty, create the log entry for the different logging methods - [string]$CMTraceMsg = '' - [string]$ConsoleLogLine = '' - [string]$LegacyTextLogLine = '' - If ($Msg) { - # Create the CMTrace log message - If ($ScriptSectionDefined) { [string]$CMTraceMsg = "[$ScriptSection] :: $Msg" } - - # Create a Console and Legacy "text" log entry - [string]$LegacyMsg = "[$LogDate $LogTime]" - If ($ScriptSectionDefined) { [string]$LegacyMsg += " [$ScriptSection]" } - If ($Source) { - [string]$ConsoleLogLine = "$LegacyMsg [$Source] :: $Msg" - Switch ($Severity) { - 3 { [string]$LegacyTextLogLine = "$LegacyMsg [$Source] [Error] :: $Msg" } - 2 { [string]$LegacyTextLogLine = "$LegacyMsg [$Source] [Warning] :: $Msg" } - 1 { [string]$LegacyTextLogLine = "$LegacyMsg [$Source] [Info] :: $Msg" } - } - } - Else { - [string]$ConsoleLogLine = "$LegacyMsg :: $Msg" - Switch ($Severity) { - 3 { [string]$LegacyTextLogLine = "$LegacyMsg [Error] :: $Msg" } - 2 { [string]$LegacyTextLogLine = "$LegacyMsg [Warning] :: $Msg" } - 1 { [string]$LegacyTextLogLine = "$LegacyMsg [Info] :: $Msg" } - } - } - } - - ## Execute script block to create the CMTrace.exe compatible log entry - [string]$CMTraceLogLine = & $CMTraceLogString -lMessage $CMTraceMsg -lSource $Source -lSeverity $Severity - - ## Choose which log type to write to file - If ($LogType -ieq 'CMTrace') { - [string]$LogLine = $CMTraceLogLine - } - Else { - [string]$LogLine = $LegacyTextLogLine - } - - ## Write the log entry to the log file if logging is not currently disabled - If (-not $DisableLogging) { - Try { - $LogLine | Out-File -FilePath $LogFilePath -Append -NoClobber -Force -Encoding 'UTF8' -ErrorAction 'Stop' - } - Catch { - If (-not $ContinueOnError) { - Write-Host -Object "[$LogDate $LogTime] [$ScriptSection] [${CmdletName}] :: Failed to write message [$Msg] to the log file [$LogFilePath]. `n$(Resolve-Error)" -ForegroundColor 'Red' - } - } - } - - ## Execute script block to write the log entry to the console if $WriteHost is $true - & $WriteLogLineToHost -lTextLogLine $ConsoleLogLine -lSeverity $Severity - } - } - End { - ## Archive log file if size is greater than $MaxLogFileSizeMB and $MaxLogFileSizeMB > 0 - Try { - If ((-not $ExitLoggingFunction) -and (-not $DisableLogging)) { - [IO.FileInfo]$LogFile = Get-ChildItem -LiteralPath $LogFilePath -ErrorAction 'Stop' - [decimal]$LogFileSizeMB = $LogFile.Length/1MB - If (($LogFileSizeMB -gt $MaxLogFileSizeMB) -and ($MaxLogFileSizeMB -gt 0)) { - ## Change the file extension to "lo_" - [string]$ArchivedOutLogFile = [IO.Path]::ChangeExtension($LogFilePath, 'lo_') - [hashtable]$ArchiveLogParams = @{ ScriptSection = $ScriptSection; Source = ${CmdletName}; Severity = 2; LogFileDirectory = $LogFileDirectory; LogFileName = $LogFileName; LogType = $LogType; MaxLogFileSizeMB = 0; WriteHost = $WriteHost; ContinueOnError = $ContinueOnError; PassThru = $false } - - ## Log message about archiving the log file - $ArchiveLogMessage = "Maximum log file size [$MaxLogFileSizeMB MB] reached. Rename log file to [$ArchivedOutLogFile]." - Write-Log -Message $ArchiveLogMessage @ArchiveLogParams - - ## Archive existing log file from .log to .lo_. Overwrites any existing .lo_ file. This is the same method SCCM uses for log files. - Move-Item -LiteralPath $LogFilePath -Destination $ArchivedOutLogFile -Force -ErrorAction 'Stop' - - ## Start new log file and Log message about archiving the old log file - $NewLogMessage = "Previous log file was renamed to [$ArchivedOutLogFile] because maximum log file size of [$MaxLogFileSizeMB MB] was reached." - Write-Log -Message $NewLogMessage @ArchiveLogParams - } - } - } - Catch { - ## If renaming of file fails, script will continue writing to log file even if size goes over the max file size - } - Finally { - If ($PassThru) { Write-Output -InputObject $Message } - } - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyString()] + [String]$Name + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Output -InputObject (([Char[]]$Name | Where-Object { $invalidFileNameChars -notcontains $_ }) -join '') + } + Catch { + Write-Log -Message "Failed to remove invalid characters from the supplied filename. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function New-ZipFile Function New-ZipFile { -<# + <# .SYNOPSIS - Create a new zip archive or add content to an existing archive. + +Create a new zip archive or add content to an existing archive. + .DESCRIPTION - Create a new zip archive or add content to an existing archive by using the Shell object .CopyHere method. + +Create a new zip archive or add content to an existing archive by using the Shell object .CopyHere method. + .PARAMETER DestinationArchiveDirectoryPath - The path to the directory path where the zip archive will be saved. + +The path to the directory path where the zip archive will be saved. + .PARAMETER DestinationArchiveFileName - The name of the zip archive. + +The name of the zip archive. + .PARAMETER SourceDirectoryPath - The path to the directory to be archived, specified as absolute paths. + +The path to the directory to be archived, specified as absolute paths. + .PARAMETER SourceFilePath - The path to the file to be archived, specified as absolute paths. + +The path to the file to be archived, specified as absolute paths. + .PARAMETER RemoveSourceAfterArchiving - Remove the source path after successfully archiving the content. Default is: $false. + +Remove the source path after successfully archiving the content. Default is: $false. + .PARAMETER OverWriteArchive - Overwrite the destination archive path if it already exists. Default is: $false. + +Overwrite the destination archive path if it already exists. Default is: $false. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default: $true. + +Continue if an error is encountered. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - New-ZipFile -DestinationArchiveDirectoryPath 'E:\Testing' -DestinationArchiveFileName 'TestingLogs.zip' -SourceDirectory 'E:\Testing\Logs' + +New-ZipFile -DestinationArchiveDirectoryPath 'E:\Testing' -DestinationArchiveFileName 'TestingLogs.zip' -SourceDirectory 'E:\Testing\Logs' + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding(DefaultParameterSetName='CreateFromDirectory')] - Param ( - [Parameter(Mandatory=$true,Position=0)] - [ValidateNotNullorEmpty()] - [string]$DestinationArchiveDirectoryPath, - [Parameter(Mandatory=$true,Position=1)] - [ValidateNotNullorEmpty()] - [string]$DestinationArchiveFileName, - [Parameter(Mandatory=$true,Position=2,ParameterSetName='CreateFromDirectory')] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Container' })] - [string[]]$SourceDirectoryPath, - [Parameter(Mandatory=$true,Position=2,ParameterSetName='CreateFromFile')] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] - [string[]]$SourceFilePath, - [Parameter(Mandatory=$false,Position=3)] - [ValidateNotNullorEmpty()] - [switch]$RemoveSourceAfterArchiving = $false, - [Parameter(Mandatory=$false,Position=4)] - [ValidateNotNullorEmpty()] - [switch]$OverWriteArchive = $false, - [Parameter(Mandatory=$false,Position=5)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## Get the full destination path where the archive will be stored - [string]$DestinationPath = Join-Path -Path $DestinationArchiveDirectoryPath -ChildPath $DestinationArchiveFileName -ErrorAction 'Stop' - Write-Log -Message "Create a zip archive with the requested content at destination path [$DestinationPath]." -Source ${CmdletName} - - ## If the destination archive already exists, delete it if the -OverWriteArchive option was selected - If (($OverWriteArchive) -and (Test-Path -LiteralPath $DestinationPath)) { - Write-Log -Message "An archive at the destination path already exists, deleting file [$DestinationPath]." -Source ${CmdletName} - $null = Remove-Item -LiteralPath $DestinationPath -Force -ErrorAction 'Stop' - } - - ## If archive file does not exist, then create a zero-byte zip archive - If (-not (Test-Path -LiteralPath $DestinationPath)) { - ## Create a zero-byte file - Write-Log -Message "Create a zero-byte file [$DestinationPath]." -Source ${CmdletName} - $null = New-Item -Path $DestinationArchiveDirectoryPath -Name $DestinationArchiveFileName -ItemType 'File' -Force -ErrorAction 'Stop' - - ## Write the file header for a zip file to the zero-byte file - [byte[]]$ZipArchiveByteHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - [IO.FileStream]$FileStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($DestinationPath, ([IO.FileMode]::Create)) - [IO.BinaryWriter]$BinaryWriter = New-Object -TypeName 'System.IO.BinaryWriter' -ArgumentList ($FileStream) - Write-Log -Message "Write the file header for a zip archive to the zero-byte file [$DestinationPath]." -Source ${CmdletName} - $null = $BinaryWriter.Write($ZipArchiveByteHeader) - $BinaryWriter.Close() - $FileStream.Close() - } - - ## Create a Shell object - [__comobject]$ShellApp = New-Object -ComObject 'Shell.Application' -ErrorAction 'Stop' - ## Create an object representing the archive file - [__comobject]$Archive = $ShellApp.NameSpace($DestinationPath) - - ## Create the archive file - If ($PSCmdlet.ParameterSetName -eq 'CreateFromDirectory') { - ## Create the archive file from a source directory - ForEach ($Directory in $SourceDirectoryPath) { - Try { - # Create an object representing the source directory - [__comobject]$CreateFromDirectory = $ShellApp.NameSpace($Directory) - # Copy all of the files and folders from the source directory to the archive - $null = $Archive.CopyHere($CreateFromDirectory.Items()) - # Wait for archive operation to complete. Archive file count property returns 0 if archive operation is in progress. - Write-Log -Message "Compressing [$($CreateFromDirectory.Count)] file(s) in source directory [$Directory] to destination path [$DestinationPath]..." -Source ${CmdletName} - Do { Start-Sleep -Milliseconds 250 } While ($Archive.Items().Count -eq 0) - } - Finally { - # Release the ComObject representing the source directory - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($CreateFromDirectory) - } - - # If option was selected, recursively delete the source directory after successfully archiving the contents - If ($RemoveSourceAfterArchiving) { - Try { - Write-Log -Message "Recursively delete the source directory [$Directory] as contents have been successfully archived." -Source ${CmdletName} - $null = Remove-Item -LiteralPath $Directory -Recurse -Force -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to recursively delete the source directory [$Directory]. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - } - } - Else { - ## Create the archive file from a list of one or more files - [IO.FileInfo[]]$SourceFilePath = [IO.FileInfo[]]$SourceFilePath - ForEach ($File in $SourceFilePath) { - # Copy the files and folders from the source directory to the archive - $null = $Archive.CopyHere($File.FullName) - # Wait for archive operation to complete. Archive file count property returns 0 if archive operation is in progress. - Write-Log -Message "Compressing file [$($File.FullName)] to destination path [$DestinationPath]..." -Source ${CmdletName} - Do { Start-Sleep -Milliseconds 250 } While ($Archive.Items().Count -eq 0) - - # If option was selected, delete the source file after successfully archiving the content - If ($RemoveSourceAfterArchiving) { - Try { - Write-Log -Message "Delete the source file [$($File.FullName)] as it has been successfully archived." -Source ${CmdletName} - $null = Remove-Item -LiteralPath $File.FullName -Force -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to delete the source file [$($File.FullName)]. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - } - } - - ## If the archive was created in session 0 or by an Admin, then it may only be readable by elevated users. - # Apply the parent folder's permissions to the archive file to fix the problem. - Write-Log -Message "If the archive was created in session 0 or by an Admin, then it may only be readable by elevated users. Apply permissions from parent folder [$DestinationArchiveDirectoryPath] to file [$DestinationPath]." -Source ${CmdletName} - Try { - [Security.AccessControl.DirectorySecurity]$DestinationArchiveDirectoryPathAcl = Get-Acl -Path $DestinationArchiveDirectoryPath -ErrorAction 'Stop' - Set-Acl -Path $DestinationPath -AclObject $DestinationArchiveDirectoryPathAcl -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to apply parent folder's [$DestinationArchiveDirectoryPath] permissions to file [$DestinationPath]. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - Catch { - Write-Log -Message "Failed to archive the requested file(s). `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to archive the requested file(s): $($_.Exception.Message)" - } - } - Finally { - ## Release the ComObject representing the archive - If ($Archive) { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Archive) } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding(DefaultParameterSetName = 'CreateFromDirectory')] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullorEmpty()] + [String]$DestinationArchiveDirectoryPath, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$DestinationArchiveFileName, + [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'CreateFromDirectory')] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Container' })] + [String[]]$SourceDirectoryPath, + [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'CreateFromFile')] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String[]]$SourceFilePath, + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [Switch]$RemoveSourceAfterArchiving = $false, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [Switch]$OverWriteArchive = $false, + [Parameter(Mandatory = $false, Position = 5)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## Remove invalid characters from the supplied filename + $DestinationArchiveFileName = Remove-InvalidFileNameChars -Name $DestinationArchiveFileName + If ($DestinationArchiveFileName.length -eq 0) { + Throw 'Invalid filename characters replacement resulted into an empty string.' + } + ## Get the full destination path where the archive will be stored + [String]$DestinationPath = Join-Path -Path $DestinationArchiveDirectoryPath -ChildPath $DestinationArchiveFileName -ErrorAction 'Stop' + Write-Log -Message "Creating a zip archive with the requested content at destination path [$DestinationPath]." -Source ${CmdletName} + + ## If the destination archive already exists, delete it if the -OverWriteArchive option was selected + If (($OverWriteArchive) -and (Test-Path -LiteralPath $DestinationPath)) { + Write-Log -Message "An archive at the destination path already exists, deleting file [$DestinationPath]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $DestinationPath -Force -ErrorAction 'Stop' + } + + ## If archive file does not exist, then create a zero-byte zip archive + If (-not (Test-Path -LiteralPath $DestinationPath)) { + ## Create a zero-byte file + Write-Log -Message "Creating a zero-byte file [$DestinationPath]." -Source ${CmdletName} + $null = New-Item -Path $DestinationArchiveDirectoryPath -Name $DestinationArchiveFileName -ItemType 'File' -Force -ErrorAction 'Stop' + + ## Write the file header for a zip file to the zero-byte file + [Byte[]]$ZipArchiveByteHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + [IO.FileStream]$FileStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($DestinationPath, ([IO.FileMode]::Create)) + [IO.BinaryWriter]$BinaryWriter = New-Object -TypeName 'System.IO.BinaryWriter' -ArgumentList ($FileStream) + Write-Log -Message "Write the file header for a zip archive to the zero-byte file [$DestinationPath]." -Source ${CmdletName} + $null = $BinaryWriter.Write($ZipArchiveByteHeader) + $BinaryWriter.Close() + $FileStream.Close() + } + + ## Create a Shell object + [__ComObject]$ShellApp = New-Object -ComObject 'Shell.Application' -ErrorAction 'Stop' + ## Create an object representing the archive file + [__ComObject]$Archive = $ShellApp.NameSpace($DestinationPath) + + ## Create the archive file + If ($PSCmdlet.ParameterSetName -eq 'CreateFromDirectory') { + ## Create the archive file from a source directory + ForEach ($Directory in $SourceDirectoryPath) { + Try { + # Create an object representing the source directory + [__ComObject]$CreateFromDirectory = $ShellApp.NameSpace($Directory) + # Copy all of the files and folders from the source directory to the archive + $null = $Archive.CopyHere($CreateFromDirectory.Items()) + # Wait for archive operation to complete. Archive file count property returns 0 if archive operation is in progress. + Write-Log -Message "Compressing [$($CreateFromDirectory.Count)] file(s) in source directory [$Directory] to destination path [$DestinationPath]..." -Source ${CmdletName} + Do { + Start-Sleep -Milliseconds 250 + } While ($Archive.Items().Count -eq 0) + } + Finally { + # Release the ComObject representing the source directory + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($CreateFromDirectory) + } + + # If option was selected, recursively delete the source directory after successfully archiving the contents + If ($RemoveSourceAfterArchiving) { + Try { + Write-Log -Message "Recursively deleting the source directory [$Directory] as contents have been successfully archived." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $Directory -Recurse -Force -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to recursively delete the source directory [$Directory]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + } + } + Else { + ## Create the archive file from a list of one or more files + [IO.FileInfo[]]$SourceFilePath = [IO.FileInfo[]]$SourceFilePath + ForEach ($File in $SourceFilePath) { + # Copy the files and folders from the source directory to the archive + $null = $Archive.CopyHere($File.FullName) + # Wait for archive operation to complete. Archive file count property returns 0 if archive operation is in progress. + Write-Log -Message "Compressing file [$($File.FullName)] to destination path [$DestinationPath]..." -Source ${CmdletName} + Do { + Start-Sleep -Milliseconds 250 + } While ($Archive.Items().Count -eq 0) + + # If option was selected, delete the source file after successfully archiving the content + If ($RemoveSourceAfterArchiving) { + Try { + Write-Log -Message "Deleting the source file [$($File.FullName)] as it has been successfully archived." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $File.FullName -Force -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to delete the source file [$($File.FullName)]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + } + } + + ## If the archive was created in session 0 or by an Admin, then it may only be readable by elevated users. + # Apply the parent folder's permissions to the archive file to fix the problem. + Write-Log -Message "If the archive was created in session 0 or by an Admin, then it may only be readable by elevated users. Apply permissions from parent folder [$DestinationArchiveDirectoryPath] to file [$DestinationPath]." -Source ${CmdletName} + Try { + [Security.AccessControl.DirectorySecurity]$DestinationArchiveDirectoryPathAcl = Get-Acl -Path $DestinationArchiveDirectoryPath -ErrorAction 'Stop' + Set-Acl -Path $DestinationPath -AclObject $DestinationArchiveDirectoryPathAcl -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to apply parent folder's [$DestinationArchiveDirectoryPath] permissions to file [$DestinationPath]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to archive the requested file(s). `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to archive the requested file(s): $($_.Exception.Message)" + } + } + Finally { + ## Release the ComObject representing the archive + If ($Archive) { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Archive) + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Exit-Script Function Exit-Script { -<# + <# .SYNOPSIS - Exit the script, perform cleanup actions, and pass an exit code to the parent process. + +Exit the script, perform cleanup actions, and pass an exit code to the parent process. + .DESCRIPTION - Always use when exiting the script to ensure cleanup actions are performed. + +Always use when exiting the script to ensure cleanup actions are performed. + .PARAMETER ExitCode - The exit code to be passed from the script to the parent process, e.g. SCCM + +The exit code to be passed from the script to the parent process, e.g. SCCM + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Exit-Script -ExitCode 0 + +Exit-Script + .EXAMPLE - Exit-Script -ExitCode 1618 + +Exit-Script -ExitCode 1618 + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$ExitCode = 0 - ) - - ## Get the name of this function - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - ## Stop the Close Program Dialog if running - If ($formCloseApps) { $formCloseApps.Close } - - ## Close the Installation Progress Dialog if running - Close-InstallationProgress - - ## If block execution variable is true, call the function to unblock execution - If ($BlockExecution) { Unblock-AppExecution } - - ## If Terminal Server mode was set, turn it off - If ($terminalServerMode) { Disable-TerminalServerInstallMode } - - ## Determine action based on exit code - Switch ($exitCode) { - $configInstallationUIExitCode { $installSuccess = $false } - $configInstallationDeferExitCode { $installSuccess = $false } - 3010 { $installSuccess = $true } - 1641 { $installSuccess = $true } - 0 { $installSuccess = $true } - Default { $installSuccess = $false } - } - - ## Determine if balloon notification should be shown - If ($deployModeSilent) { [boolean]$configShowBalloonNotifications = $false } - - If ($installSuccess) { - If (Test-Path -LiteralPath $regKeyDeferHistory -ErrorAction 'SilentlyContinue') { - Write-Log -Message 'Remove deferral history...' -Source ${CmdletName} - Remove-RegistryKey -Key $regKeyDeferHistory -Recurse - } - - [string]$balloonText = "$deploymentTypeName $configBalloonTextComplete" - ## Handle reboot prompts on successful script completion - If (($AllowRebootPassThru) -and ((($msiRebootDetected) -or ($exitCode -eq 3010)) -or ($exitCode -eq 1641))) { - Write-Log -Message 'A restart has been flagged as required.' -Source ${CmdletName} - [string]$balloonText = "$deploymentTypeName $configBalloonTextRestartRequired" - If (($msiRebootDetected) -and ($exitCode -ne 1641)) { [int32]$exitCode = 3010 } - } - Else { - [int32]$exitCode = 0 - } - - Write-Log -Message "$installName $deploymentTypeName completed with exit code [$exitcode]." -Source ${CmdletName} - If ($configShowBalloonNotifications) { Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText $balloonText } - } - ElseIf (-not $installSuccess) { - Write-Log -Message "$installName $deploymentTypeName completed with exit code [$exitcode]." -Source ${CmdletName} - If (($exitCode -eq $configInstallationUIExitCode) -or ($exitCode -eq $configInstallationDeferExitCode)) { - [string]$balloonText = "$deploymentTypeName $configBalloonTextFastRetry" - If ($configShowBalloonNotifications) { Show-BalloonTip -BalloonTipIcon 'Warning' -BalloonTipText $balloonText } - } - Else { - [string]$balloonText = "$deploymentTypeName $configBalloonTextError" - If ($configShowBalloonNotifications) { Show-BalloonTip -BalloonTipIcon 'Error' -BalloonTipText $balloonText } - } - } - - [string]$LogDash = '-' * 79 - Write-Log -Message $LogDash -Source ${CmdletName} - - ## Archive the log files to zip format and then delete the temporary logs folder - If ($configToolkitCompressLogs) { - ## Disable logging to file so that we can archive the log files - . $DisableScriptLogging - - [string]$DestinationArchiveFileName = $installName + '_' + $deploymentType + '_' + ((Get-Date -Format 'yyyy-MM-dd-hh-mm-ss').ToString()) + '.zip' - New-ZipFile -DestinationArchiveDirectoryPath $configToolkitLogDir -DestinationArchiveFileName $DestinationArchiveFileName -SourceDirectory $logTempFolder -RemoveSourceAfterArchiving - } - - If ($script:notifyIcon) { Try { $script:notifyIcon.Dispose() } Catch {} } - ## Exit the script, returning the exit code to SCCM - If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $exitCode; Exit } Else { Exit $exitCode } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ExitCode = 0 + ) + + ## Get the name of this function + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + ## Stop the Close Program Dialog if running + If ($formCloseApps) { + $formCloseApps.Close + } + + ## Close the Installation Progress Dialog if running + Close-InstallationProgress + + ## If block execution variable is true, call the function to unblock execution + If ($BlockExecution) { + Unblock-AppExecution + } + + ## If Terminal Server mode was set, turn it off + If ($terminalServerMode) { + Disable-TerminalServerInstallMode + } + + ## Determine action based on exit code + Switch ($exitCode) { + $configInstallationUIExitCode { + $installSuccess = $false + } + $configInstallationDeferExitCode { + $installSuccess = $false + } + 3010 { + $installSuccess = $true + } + 1641 { + $installSuccess = $true + } + 0 { + $installSuccess = $true + } + Default { + $installSuccess = $false + } + } + + ## Determine if balloon notification should be shown + If ($deployModeSilent) { + [Boolean]$configShowBalloonNotifications = $false + } + + If ($installSuccess) { + If (Test-Path -LiteralPath $regKeyDeferHistory -ErrorAction 'SilentlyContinue') { + Write-Log -Message 'Removing deferral history...' -Source ${CmdletName} + Remove-RegistryKey -Key $regKeyDeferHistory -Recurse + } + + [String]$balloonText = "$deploymentTypeName $configBalloonTextComplete" + ## Handle reboot prompts on successful script completion + If (($AllowRebootPassThru) -and ((($msiRebootDetected) -or ($exitCode -eq 3010)) -or ($exitCode -eq 1641))) { + Write-Log -Message 'A restart has been flagged as required.' -Source ${CmdletName} + [String]$balloonText = "$deploymentTypeName $configBalloonTextRestartRequired" + If (($msiRebootDetected) -and ($exitCode -ne 1641)) { + [Int32]$exitCode = 3010 + } + } + Else { + [Int32]$exitCode = 0 + } + + Write-Log -Message "$installName $deploymentTypeName completed with exit code [$exitcode]." -Source ${CmdletName} + If ($configShowBalloonNotifications) { + Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText $balloonText -NoWait + } + } + ElseIf (-not $installSuccess) { + Write-Log -Message "$installName $deploymentTypeName completed with exit code [$exitcode]." -Source ${CmdletName} + If (($exitCode -eq $configInstallationUIExitCode) -or ($exitCode -eq $configInstallationDeferExitCode)) { + [String]$balloonText = "$deploymentTypeName $configBalloonTextFastRetry" + If ($configShowBalloonNotifications) { + Show-BalloonTip -BalloonTipIcon 'Warning' -BalloonTipText $balloonText -NoWait + } + } + Else { + [String]$balloonText = "$deploymentTypeName $configBalloonTextError" + If ($configShowBalloonNotifications) { + Show-BalloonTip -BalloonTipIcon 'Error' -BalloonTipText $balloonText -NoWait + } + } + } + + [String]$LogDash = '-' * 79 + Write-Log -Message $LogDash -Source ${CmdletName} + + ## Archive the log files to zip format and then delete the temporary logs folder + If ($configToolkitCompressLogs) { + ## Disable logging to file so that we can archive the log files + . $DisableScriptLogging + + [String]$DestinationArchiveFileName = $installName + '_' + $deploymentType + '_' + ((Get-Date -Format 'yyyy-MM-dd-HH-mm-ss').ToString()) + '.zip' + New-ZipFile -DestinationArchiveDirectoryPath $configToolkitLogDir -DestinationArchiveFileName $DestinationArchiveFileName -SourceDirectory $logTempFolder -RemoveSourceAfterArchiving + } + + If ($script:notifyIcon) { + Try { + $script:notifyIcon.Dispose() + } + Catch { + } + } + ## Reset powershell window title to its previous title + $Host.UI.RawUI.WindowTitle = $oldPSWindowTitle + ## Reset variables in case another toolkit is being run in the same session + $global:logName = $null + $global:installTitle = $null + $global:installName = $null + $global:appName = $null + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $script:ExitCode = $exitCode; Exit + } + Else { + Exit $exitCode + } } #endregion #region Function Resolve-Error Function Resolve-Error { -<# + <# .SYNOPSIS - Enumerate error record details. + +Enumerate error record details. + .DESCRIPTION - Enumerate an error record, or a collection of error record, properties. By default, the details for the last error will be enumerated. + +Enumerate an error record, or a collection of error record, properties. By default, the details for the last error will be enumerated. + .PARAMETER ErrorRecord - The error record to resolve. The default error record is the latest one: $global:Error[0]. This parameter will also accept an array of error records. + +The error record to resolve. The default error record is the latest one: $global:Error[0]. This parameter will also accept an array of error records. + .PARAMETER Property - The list of properties to display from the error record. Use "*" to display all properties. - Default list of error properties is: Message, FullyQualifiedErrorId, ScriptStackTrace, PositionMessage, InnerException + +The list of properties to display from the error record. Use "*" to display all properties. + +Default list of error properties is: Message, FullyQualifiedErrorId, ScriptStackTrace, PositionMessage, InnerException + .PARAMETER GetErrorRecord - Get error record details as represented by $_. + +Get error record details as represented by $_. + .PARAMETER GetErrorInvocation - Get error record invocation information as represented by $_.InvocationInfo. + +Get error record invocation information as represented by $_.InvocationInfo. + .PARAMETER GetErrorException - Get error record exception details as represented by $_.Exception. -.PARAMETER GetErrorInnerException - Get error record inner exception details as represented by $_.Exception.InnerException. Will retrieve all inner exceptions if there is more than one. + +Get error record exception details as represented by $_.Exception. + +.PARAMETER GetErrorInnerException + +Get error record inner exception details as represented by $_.Exception.InnerException. Will retrieve all inner exceptions if there is more than one. + +.INPUTS + +System.Array. + +Accepts an array of error records. + +.OUTPUTS + +System.String + +Displays the error record details. + .EXAMPLE - Resolve-Error + +Resolve-Error + .EXAMPLE - Resolve-Error -Property * + +Resolve-Error -Property * + .EXAMPLE - Resolve-Error -Property InnerException + +Resolve-Error -Property InnerException + .EXAMPLE - Resolve-Error -GetErrorInvocation:$false + +Resolve-Error -GetErrorInvocation:$false + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] - [AllowEmptyCollection()] - [array]$ErrorRecord, - [Parameter(Mandatory=$false,Position=1)] - [ValidateNotNullorEmpty()] - [string[]]$Property = ('Message','InnerException','FullyQualifiedErrorId','ScriptStackTrace','PositionMessage'), - [Parameter(Mandatory=$false,Position=2)] - [switch]$GetErrorRecord = $true, - [Parameter(Mandatory=$false,Position=3)] - [switch]$GetErrorInvocation = $true, - [Parameter(Mandatory=$false,Position=4)] - [switch]$GetErrorException = $true, - [Parameter(Mandatory=$false,Position=5)] - [switch]$GetErrorInnerException = $true - ) - - Begin { - ## If function was called without specifying an error record, then choose the latest error that occurred - If (-not $ErrorRecord) { - If ($global:Error.Count -eq 0) { - #Write-Warning -Message "The `$Error collection is empty" - Return - } - Else { - [array]$ErrorRecord = $global:Error[0] - } - } - - ## Allows selecting and filtering the properties on the error object if they exist - [scriptblock]$SelectProperty = { - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - $InputObject, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string[]]$Property - ) - - [string[]]$ObjectProperty = $InputObject | Get-Member -MemberType '*Property' | Select-Object -ExpandProperty 'Name' - ForEach ($Prop in $Property) { - If ($Prop -eq '*') { - [string[]]$PropertySelection = $ObjectProperty - Break - } - ElseIf ($ObjectProperty -contains $Prop) { - [string[]]$PropertySelection += $Prop - } - } - Write-Output -InputObject $PropertySelection - } - - # Initialize variables to avoid error if 'Set-StrictMode' is set - $LogErrorRecordMsg = $null - $LogErrorInvocationMsg = $null - $LogErrorExceptionMsg = $null - $LogErrorMessageTmp = $null - $LogInnerMessage = $null - } - Process { - If (-not $ErrorRecord) { Return } - ForEach ($ErrRecord in $ErrorRecord) { - ## Capture Error Record - If ($GetErrorRecord) { - [string[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord -Property $Property - $LogErrorRecordMsg = $ErrRecord | Select-Object -Property $SelectedProperties - } - - ## Error Invocation Information - If ($GetErrorInvocation) { - If ($ErrRecord.InvocationInfo) { - [string[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord.InvocationInfo -Property $Property - $LogErrorInvocationMsg = $ErrRecord.InvocationInfo | Select-Object -Property $SelectedProperties - } - } - - ## Capture Error Exception - If ($GetErrorException) { - If ($ErrRecord.Exception) { - [string[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord.Exception -Property $Property - $LogErrorExceptionMsg = $ErrRecord.Exception | Select-Object -Property $SelectedProperties - } - } - - ## Display properties in the correct order - If ($Property -eq '*') { - # If all properties were chosen for display, then arrange them in the order the error object displays them by default. - If ($LogErrorRecordMsg) { [array]$LogErrorMessageTmp += $LogErrorRecordMsg } - If ($LogErrorInvocationMsg) { [array]$LogErrorMessageTmp += $LogErrorInvocationMsg } - If ($LogErrorExceptionMsg) { [array]$LogErrorMessageTmp += $LogErrorExceptionMsg } - } - Else { - # Display selected properties in our custom order - If ($LogErrorExceptionMsg) { [array]$LogErrorMessageTmp += $LogErrorExceptionMsg } - If ($LogErrorRecordMsg) { [array]$LogErrorMessageTmp += $LogErrorRecordMsg } - If ($LogErrorInvocationMsg) { [array]$LogErrorMessageTmp += $LogErrorInvocationMsg } - } - - If ($LogErrorMessageTmp) { - $LogErrorMessage = 'Error Record:' - $LogErrorMessage += "`n-------------" - $LogErrorMsg = $LogErrorMessageTmp | Format-List | Out-String - $LogErrorMessage += $LogErrorMsg - } - - ## Capture Error Inner Exception(s) - If ($GetErrorInnerException) { - If ($ErrRecord.Exception -and $ErrRecord.Exception.InnerException) { - $LogInnerMessage = 'Error Inner Exception(s):' - $LogInnerMessage += "`n-------------------------" - - $ErrorInnerException = $ErrRecord.Exception.InnerException - $Count = 0 - - While ($ErrorInnerException) { - [string]$InnerExceptionSeperator = '~' * 40 - - [string[]]$SelectedProperties = & $SelectProperty -InputObject $ErrorInnerException -Property $Property - $LogErrorInnerExceptionMsg = $ErrorInnerException | Select-Object -Property $SelectedProperties | Format-List | Out-String - - If ($Count -gt 0) { $LogInnerMessage += $InnerExceptionSeperator } - $LogInnerMessage += $LogErrorInnerExceptionMsg - - $Count++ - $ErrorInnerException = $ErrorInnerException.InnerException - } - } - } - - If ($LogErrorMessage) { $Output = $LogErrorMessage } - If ($LogInnerMessage) { $Output += $LogInnerMessage } - - Write-Output -InputObject $Output - - If (Test-Path -LiteralPath 'variable:Output') { Clear-Variable -Name 'Output' } - If (Test-Path -LiteralPath 'variable:LogErrorMessage') { Clear-Variable -Name 'LogErrorMessage' } - If (Test-Path -LiteralPath 'variable:LogInnerMessage') { Clear-Variable -Name 'LogInnerMessage' } - If (Test-Path -LiteralPath 'variable:LogErrorMessageTmp') { Clear-Variable -Name 'LogErrorMessageTmp' } - } - } - End { - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyCollection()] + [Array]$ErrorRecord, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String[]]$Property = ('Message', 'InnerException', 'FullyQualifiedErrorId', 'ScriptStackTrace', 'PositionMessage'), + [Parameter(Mandatory = $false, Position = 2)] + [Switch]$GetErrorRecord = $true, + [Parameter(Mandatory = $false, Position = 3)] + [Switch]$GetErrorInvocation = $true, + [Parameter(Mandatory = $false, Position = 4)] + [Switch]$GetErrorException = $true, + [Parameter(Mandatory = $false, Position = 5)] + [Switch]$GetErrorInnerException = $true + ) + + Begin { + ## If function was called without specifying an error record, then choose the latest error that occurred + If (-not $ErrorRecord) { + If ($global:Error.Count -eq 0) { + #Write-Warning -Message "The `$Error collection is empty" + Return + } + Else { + [Array]$ErrorRecord = $global:Error[0] + } + } + + ## Allows selecting and filtering the properties on the error object if they exist + [ScriptBlock]$SelectProperty = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + $InputObject, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String[]]$Property + ) + + [String[]]$ObjectProperty = $InputObject | Get-Member -MemberType '*Property' | Select-Object -ExpandProperty 'Name' + ForEach ($Prop in $Property) { + If ($Prop -eq '*') { + [String[]]$PropertySelection = $ObjectProperty + Break + } + ElseIf ($ObjectProperty -contains $Prop) { + [String[]]$PropertySelection += $Prop + } + } + Write-Output -InputObject ($PropertySelection) + } + + # Initialize variables to avoid error if 'Set-StrictMode' is set + $LogErrorRecordMsg = $null + $LogErrorInvocationMsg = $null + $LogErrorExceptionMsg = $null + $LogErrorMessageTmp = $null + $LogInnerMessage = $null + } + Process { + If (-not $ErrorRecord) { + Return + } + ForEach ($ErrRecord in $ErrorRecord) { + ## Capture Error Record + If ($GetErrorRecord) { + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord -Property $Property + $LogErrorRecordMsg = $ErrRecord | Select-Object -Property $SelectedProperties + } + + ## Error Invocation Information + If ($GetErrorInvocation) { + If ($ErrRecord.InvocationInfo) { + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord.InvocationInfo -Property $Property + $LogErrorInvocationMsg = $ErrRecord.InvocationInfo | Select-Object -Property $SelectedProperties + } + } + + ## Capture Error Exception + If ($GetErrorException) { + If ($ErrRecord.Exception) { + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord.Exception -Property $Property + $LogErrorExceptionMsg = $ErrRecord.Exception | Select-Object -Property $SelectedProperties + } + } + + ## Display properties in the correct order + If ($Property -eq '*') { + # If all properties were chosen for display, then arrange them in the order the error object displays them by default. + If ($LogErrorRecordMsg) { + [Array]$LogErrorMessageTmp += $LogErrorRecordMsg + } + If ($LogErrorInvocationMsg) { + [Array]$LogErrorMessageTmp += $LogErrorInvocationMsg + } + If ($LogErrorExceptionMsg) { + [Array]$LogErrorMessageTmp += $LogErrorExceptionMsg + } + } + Else { + # Display selected properties in our custom order + If ($LogErrorExceptionMsg) { + [Array]$LogErrorMessageTmp += $LogErrorExceptionMsg + } + If ($LogErrorRecordMsg) { + [Array]$LogErrorMessageTmp += $LogErrorRecordMsg + } + If ($LogErrorInvocationMsg) { + [Array]$LogErrorMessageTmp += $LogErrorInvocationMsg + } + } + + If ($LogErrorMessageTmp) { + $LogErrorMessage = 'Error Record:' + $LogErrorMessage += "`n-------------" + $LogErrorMsg = $LogErrorMessageTmp | Format-List | Out-String + $LogErrorMessage += $LogErrorMsg + } + + ## Capture Error Inner Exception(s) + If ($GetErrorInnerException) { + If ($ErrRecord.Exception -and $ErrRecord.Exception.InnerException) { + $LogInnerMessage = 'Error Inner Exception(s):' + $LogInnerMessage += "`n-------------------------" + + $ErrorInnerException = $ErrRecord.Exception.InnerException + $Count = 0 + + While ($ErrorInnerException) { + [String]$InnerExceptionSeperator = '~' * 40 + + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrorInnerException -Property $Property + $LogErrorInnerExceptionMsg = $ErrorInnerException | Select-Object -Property $SelectedProperties | Format-List | Out-String + + If ($Count -gt 0) { + $LogInnerMessage += $InnerExceptionSeperator + } + $LogInnerMessage += $LogErrorInnerExceptionMsg + + $Count++ + $ErrorInnerException = $ErrorInnerException.InnerException + } + } + } + + If ($LogErrorMessage) { + $Output = $LogErrorMessage + } + If ($LogInnerMessage) { + $Output += $LogInnerMessage + } + + Write-Output -InputObject $Output + + If (Test-Path -LiteralPath 'variable:Output') { + Clear-Variable -Name 'Output' + } + If (Test-Path -LiteralPath 'variable:LogErrorMessage') { + Clear-Variable -Name 'LogErrorMessage' + } + If (Test-Path -LiteralPath 'variable:LogInnerMessage') { + Clear-Variable -Name 'LogInnerMessage' + } + If (Test-Path -LiteralPath 'variable:LogErrorMessageTmp') { + Clear-Variable -Name 'LogErrorMessageTmp' + } + } + } + End { + } } #endregion #region Function Show-InstallationPrompt Function Show-InstallationPrompt { -<# + <# .SYNOPSIS - Displays a custom installation prompt with the toolkit branding and optional buttons. + +Displays a custom installation prompt with the toolkit branding and optional buttons. + .DESCRIPTION - Any combination of Left, Middle or Right buttons can be displayed. The return value of the button clicked by the user is the button text specified. + +Any combination of Left, Middle or Right buttons can be displayed. The return value of the button clicked by the user is the button text specified. + .PARAMETER Title - Title of the prompt. Default: the application installation name. + +Title of the prompt. Default: the application installation name. + .PARAMETER Message - Message text to be included in the prompt + +Message text to be included in the prompt + .PARAMETER MessageAlignment - Alignment of the message text. Options: Left, Center, Right. Default: Center. + +Alignment of the message text. Options: Left, Center, Right. Default: Center. + .PARAMETER ButtonLeftText - Show a button on the left of the prompt with the specified text + +Show a button on the left of the prompt with the specified text + .PARAMETER ButtonRightText - Show a button on the right of the prompt with the specified text + +Show a button on the right of the prompt with the specified text + .PARAMETER ButtonMiddleText - Show a button in the middle of the prompt with the specified text + +Show a button in the middle of the prompt with the specified text + .PARAMETER Icon - Show a system icon in the prompt. Options: Application, Asterisk, Error, Exclamation, Hand, Information, None, Question, Shield, Warning, WinLogo. Default: None. + +Show a system icon in the prompt. Options: Application, Asterisk, Error, Exclamation, Hand, Information, None, Question, Shield, Warning, WinLogo. Default: None + .PARAMETER NoWait - Specifies whether to show the prompt asynchronously (i.e. allow the script to continue without waiting for a response). Default: $false. + +Specifies whether to show the prompt asynchronously (i.e. allow the script to continue without waiting for a response). Default: $false. + .PARAMETER PersistPrompt - Specify whether to make the prompt persist in the center of the screen every 10 seconds. The user will have no option but to respond to the prompt - resistance is futile! + +Specify whether to make the prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. The user will have no option but to respond to the prompt - resistance is futile! + .PARAMETER MinimizeWindows - Specifies whether to minimize other windows when displaying prompt. Default: $false. + +Specifies whether to minimize other windows when displaying prompt. Default: $false. + .PARAMETER Timeout - Specifies the time period in seconds after which the prompt should timeout. Default: UI timeout value set in the config XML file. + +Specifies the time period in seconds after which the prompt should timeout. Default: UI timeout value set in the config XML file. + .PARAMETER ExitOnTimeout - Specifies whether to exit the script if the UI times out. Default: $true. + +Specifies whether to exit the script if the UI times out. Default: $true. + +.PARAMETER TopMost + +Specifies whether the progress window should be topmost. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Show-InstallationPrompt -Message 'Do you want to proceed with the installation?' -ButtonRightText 'Yes' -ButtonLeftText 'No' + +Show-InstallationPrompt -Message 'Do you want to proceed with the installation?' -ButtonRightText 'Yes' -ButtonLeftText 'No' + .EXAMPLE - Show-InstallationPrompt -Title 'Funny Prompt' -Message 'How are you feeling today?' -ButtonRightText 'Good' -ButtonLeftText 'Bad' -ButtonMiddleText 'Indifferent' + +Show-InstallationPrompt -Title 'Funny Prompt' -Message 'How are you feeling today?' -ButtonRightText 'Good' -ButtonLeftText 'Bad' -ButtonMiddleText 'Indifferent' + .EXAMPLE - Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install, or remove it completely for unattended installations.' -Icon Information -NoWait + +Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install, or remove it completely for unattended installations.' -Icon Information -NoWait + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Title = $installTitle, - [Parameter(Mandatory=$false)] - [string]$Message = '', - [Parameter(Mandatory=$false)] - [ValidateSet('Left','Center','Right')] - [string]$MessageAlignment = 'Center', - [Parameter(Mandatory=$false)] - [string]$ButtonRightText = '', - [Parameter(Mandatory=$false)] - [string]$ButtonLeftText = '', - [Parameter(Mandatory=$false)] - [string]$ButtonMiddleText = '', - [Parameter(Mandatory=$false)] - [ValidateSet('Application','Asterisk','Error','Exclamation','Hand','Information','None','Question','Shield','Warning','WinLogo')] - [string]$Icon = 'None', - [Parameter(Mandatory=$false)] - [switch]$NoWait = $false, - [Parameter(Mandatory=$false)] - [switch]$PersistPrompt = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$MinimizeWindows = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$Timeout = $configInstallationUITimeout, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ExitOnTimeout = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Bypass if in non-interactive mode - If ($deployModeSilent) { - Write-Log -Message "Bypassing Installation Prompt [Mode: $deployMode]... $Message" -Source ${CmdletName} - Return - } - - ## Get parameters for calling function asynchronously - [hashtable]$installPromptParameters = $psBoundParameters - - ## Check if the countdown was specified - If ($timeout -gt $configInstallationUITimeout) { - [string]$CountdownTimeoutErr = "The installation UI dialog timeout cannot be longer than the timeout specified in the XML configuration file." - Write-Log -Message $CountdownTimeoutErr -Severity 3 -Source ${CmdletName} - Throw $CountdownTimeoutErr - } - - [Windows.Forms.Application]::EnableVisualStyles() - $formInstallationPrompt = New-Object -TypeName 'System.Windows.Forms.Form' - $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' - $pictureIcon = New-Object -TypeName 'System.Windows.Forms.PictureBox' - $labelText = New-Object -TypeName 'System.Windows.Forms.Label' - $buttonRight = New-Object -TypeName 'System.Windows.Forms.Button' - $buttonMiddle = New-Object -TypeName 'System.Windows.Forms.Button' - $buttonLeft = New-Object -TypeName 'System.Windows.Forms.Button' - $buttonAbort = New-Object -TypeName 'System.Windows.Forms.Button' - $InitialFormInstallationPromptWindowState = New-Object -TypeName 'System.Windows.Forms.FormWindowState' - - [scriptblock]$Form_Cleanup_FormClosed = { - ## Remove all event handlers from the controls - Try { - $labelText.remove_Click($handler_labelText_Click) - $buttonLeft.remove_Click($buttonLeft_OnClick) - $buttonRight.remove_Click($buttonRight_OnClick) - $buttonMiddle.remove_Click($buttonMiddle_OnClick) - $buttonAbort.remove_Click($buttonAbort_OnClick) - $timer.remove_Tick($timer_Tick) - $timer.Dispose() - $timer = $null - $timerPersist.remove_Tick($timerPersist_Tick) - $timerPersist.Dispose() - $timerPersist = $null - $formInstallationPrompt.remove_Load($Form_StateCorrection_Load) - $formInstallationPrompt.remove_FormClosed($Form_Cleanup_FormClosed) - } - Catch { } - } - - [scriptblock]$Form_StateCorrection_Load = { - ## Correct the initial state of the form to prevent the .NET maximized form issue - $formInstallationPrompt.WindowState = 'Normal' - $formInstallationPrompt.AutoSize = $true - $formInstallationPrompt.TopMost = $true - $formInstallationPrompt.BringToFront() - # Get the start position of the form so we can return the form to this position if PersistPrompt is enabled - Set-Variable -Name 'formInstallationPromptStartPosition' -Value $formInstallationPrompt.Location -Scope 'Script' - } - - ## Form - $formInstallationPrompt.Controls.Add($pictureBanner) - - ##---------------------------------------------- - ## Create padding object - $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' - $paddingNone.Top = 0 - $paddingNone.Bottom = 0 - $paddingNone.Left = 0 - $paddingNone.Right = 0 - - ## Generic Button properties - $buttonWidth = 110 - $buttonHeight = 23 - $buttonPadding = 50 - $buttonSize = New-Object -TypeName 'System.Drawing.Size' - $buttonSize.Width = $buttonWidth - $buttonSize.Height = $buttonHeight - $buttonPadding = New-Object -TypeName 'System.Windows.Forms.Padding' - $buttonPadding.Top = 0 - $buttonPadding.Bottom = 5 - $buttonPadding.Left = 50 - $buttonPadding.Right = 0 - - ## Picture Banner - $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 - $pictureBanner.ImageLocation = $appDeployLogoBanner - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 0 - $System_Drawing_Point.Y = 0 - $pictureBanner.Location = $System_Drawing_Point - $pictureBanner.Name = 'pictureBanner' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 50 - $System_Drawing_Size.Width = 450 - $pictureBanner.Size = $System_Drawing_Size - $pictureBanner.SizeMode = 'CenterImage' - $pictureBanner.Margin = $paddingNone - $pictureBanner.TabIndex = 0 - $pictureBanner.TabStop = $false - - ## Picture Icon - $pictureIcon.DataBindings.DefaultDataSourceUpdateMode = 0 - If ($icon -ne 'None') { $pictureIcon.Image = ([Drawing.SystemIcons]::$Icon).ToBitmap() } - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 15 - $System_Drawing_Point.Y = 105 - $pictureIcon.Location = $System_Drawing_Point - $pictureIcon.Name = 'pictureIcon' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 32 - $System_Drawing_Size.Width = 32 - $pictureIcon.Size = $System_Drawing_Size - $pictureIcon.AutoSize = $true - $pictureIcon.Margin = $paddingNone - $pictureIcon.TabIndex = 0 - $pictureIcon.TabStop = $false - - ## Label Text - $labelText.DataBindings.DefaultDataSourceUpdateMode = 0 - $labelText.Name = 'labelText' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 148 - $System_Drawing_Size.Width = 385 - $labelText.Size = $System_Drawing_Size - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 25 - $System_Drawing_Point.Y = 50 - $labelText.Location = $System_Drawing_Point - $labelText.Margin = '0,0,0,0' - $labelText.Padding = '40,0,20,0' - $labelText.TabIndex = 1 - $labelText.Text = $message - $labelText.TextAlign = "Middle$($MessageAlignment)" - $labelText.Anchor = 'Top' - $labelText.add_Click($handler_labelText_Click) - - ## Button Left - $buttonLeft.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonLeft.Location = '15,200' - $buttonLeft.Name = 'buttonLeft' - $buttonLeft.Size = $buttonSize - $buttonLeft.TabIndex = 5 - $buttonLeft.Text = $buttonLeftText - $buttonLeft.DialogResult = 'No' - $buttonLeft.AutoSize = $false - $buttonLeft.UseVisualStyleBackColor = $true - $buttonLeft.add_Click($buttonLeft_OnClick) - - ## Button Middle - $buttonMiddle.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonMiddle.Location = '170,200' - $buttonMiddle.Name = 'buttonMiddle' - $buttonMiddle.Size = $buttonSize - $buttonMiddle.TabIndex = 6 - $buttonMiddle.Text = $buttonMiddleText - $buttonMiddle.DialogResult = 'Ignore' - $buttonMiddle.AutoSize = $true - $buttonMiddle.UseVisualStyleBackColor = $true - $buttonMiddle.add_Click($buttonMiddle_OnClick) - - ## Button Right - $buttonRight.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonRight.Location = '325,200' - $buttonRight.Name = 'buttonRight' - $buttonRight.Size = $buttonSize - $buttonRight.TabIndex = 7 - $buttonRight.Text = $ButtonRightText - $buttonRight.DialogResult = 'Yes' - $buttonRight.AutoSize = $true - $buttonRight.UseVisualStyleBackColor = $true - $buttonRight.add_Click($buttonRight_OnClick) - - ## Button Abort (Hidden) - $buttonAbort.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonAbort.Name = 'buttonAbort' - $buttonAbort.Size = '1,1' - $buttonAbort.DialogResult = 'Abort' - $buttonAbort.TabStop = $false - $buttonAbort.UseVisualStyleBackColor = $true - $buttonAbort.add_Click($buttonAbort_OnClick) - - ## Form Installation Prompt - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 270 - $System_Drawing_Size.Width = 450 - $formInstallationPrompt.Size = $System_Drawing_Size - $formInstallationPrompt.Padding = '0,0,0,10' - $formInstallationPrompt.Margin = $paddingNone - $formInstallationPrompt.DataBindings.DefaultDataSourceUpdateMode = 0 - $formInstallationPrompt.Name = 'WelcomeForm' - $formInstallationPrompt.Text = $title - $formInstallationPrompt.StartPosition = 'CenterScreen' - $formInstallationPrompt.FormBorderStyle = 'FixedDialog' - $formInstallationPrompt.MaximizeBox = $false - $formInstallationPrompt.MinimizeBox = $false - $formInstallationPrompt.TopMost = $true - $formInstallationPrompt.TopLevel = $true - $formInstallationPrompt.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon - $formInstallationPrompt.Controls.Add($pictureBanner) - $formInstallationPrompt.Controls.Add($pictureIcon) - $formInstallationPrompt.Controls.Add($labelText) - $formInstallationPrompt.Controls.Add($buttonAbort) - If ($buttonLeftText) { $formInstallationPrompt.Controls.Add($buttonLeft) } - If ($buttonMiddleText) { $formInstallationPrompt.Controls.Add($buttonMiddle) } - If ($buttonRightText) { $formInstallationPrompt.Controls.Add($buttonRight) } - - ## Timer - $timer = New-Object -TypeName 'System.Windows.Forms.Timer' - $timer.Interval = ($timeout * 1000) - $timer.Add_Tick({ - Write-Log -Message 'Installation action not taken within a reasonable amount of time.' -Source ${CmdletName} - $buttonAbort.PerformClick() - }) - - ## Save the initial state of the form - $InitialFormInstallationPromptWindowState = $formInstallationPrompt.WindowState - ## Init the OnLoad event to correct the initial state of the form - $formInstallationPrompt.add_Load($Form_StateCorrection_Load) - ## Clean up the control events - $formInstallationPrompt.add_FormClosed($Form_Cleanup_FormClosed) - - ## Start the timer - $timer.Start() - - ## Persistence Timer - [scriptblock]$RefreshInstallationPrompt = { - $formInstallationPrompt.BringToFront() - $formInstallationPrompt.Location = "$($formInstallationPromptStartPosition.X),$($formInstallationPromptStartPosition.Y)" - $formInstallationPrompt.Refresh() - } - If ($persistPrompt) { - $timerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' - $timerPersist.Interval = ($configInstallationPersistInterval * 1000) - [scriptblock]$timerPersist_Tick = { & $RefreshInstallationPrompt } - $timerPersist.add_Tick($timerPersist_Tick) - $timerPersist.Start() - } - - ## Close the Installation Progress Dialog if running - Close-InstallationProgress - - [string]$installPromptLoggedParameters = ($installPromptParameters.GetEnumerator() | ForEach-Object { If ($_.Value.GetType().Name -eq 'SwitchParameter') { "-$($_.Key):`$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Boolean') { "-$($_.Key) `$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Int32') { "-$($_.Key) $($_.Value)" } Else { "-$($_.Key) `"$($_.Value)`"" } }) -join ' ' - Write-Log -Message "Displaying custom installation prompt with the non-default parameters: [$installPromptLoggedParameters]." -Source ${CmdletName} - - ## If the NoWait parameter is specified, launch a new PowerShell session to show the prompt asynchronously - If ($NoWait) { - # Remove the NoWait parameter so that the script is run synchronously in the new PowerShell session - $installPromptParameters.Remove('NoWait') - # Format the parameters as a string - [string]$installPromptParameters = ($installPromptParameters.GetEnumerator() | ForEach-Object { If ($_.Value.GetType().Name -eq 'SwitchParameter') { "-$($_.Key):`$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Boolean') { "-$($_.Key) `$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Int32') { "-$($_.Key) $($_.Value)" } Else { "-$($_.Key) `"$($_.Value)`"" } }) -join ' ' - Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `"$scriptPath`" -ReferredInstallTitle `"$Title`" -ReferredInstallName `"$installName`" -ReferredLogName `"$logName`" -ShowInstallationPrompt $installPromptParameters -AsyncToolkitLaunch" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' - } - ## Otherwise, show the prompt synchronously. If user cancels, then keep showing it until user responds using one of the buttons. - Else { - $showDialog = $true - While ($showDialog) { - # Minimize all other windows - If ($minimizeWindows) { $null = $shellApp.MinimizeAll() } - # Show the Form - $result = $formInstallationPrompt.ShowDialog() - If (($result -eq 'Yes') -or ($result -eq 'No') -or ($result -eq 'Ignore') -or ($result -eq 'Abort')) { - $showDialog = $false - } - } - $formInstallationPrompt.Dispose() - - Switch ($result) { - 'Yes' { Write-Output -InputObject $buttonRightText } - 'No' { Write-Output -InputObject $buttonLeftText } - 'Ignore' { Write-Output -InputObject $buttonMiddleText } - 'Abort' { - # Restore minimized windows - $null = $shellApp.UndoMinimizeAll() - If ($ExitOnTimeout) { - Exit-Script -ExitCode $configInstallationUIExitCode - } - Else { - Write-Log -Message 'UI timed out but `$ExitOnTimeout set to `$false. Continue...' -Source ${CmdletName} - } - } - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Title = $installTitle, + [Parameter(Mandatory = $false)] + [String]$Message = '', + [Parameter(Mandatory = $false)] + [ValidateSet('Left', 'Center', 'Right')] + [String]$MessageAlignment = 'Center', + [Parameter(Mandatory = $false)] + [String]$ButtonRightText = '', + [Parameter(Mandatory = $false)] + [String]$ButtonLeftText = '', + [Parameter(Mandatory = $false)] + [String]$ButtonMiddleText = '', + [Parameter(Mandatory = $false)] + [ValidateSet('Application', 'Asterisk', 'Error', 'Exclamation', 'Hand', 'Information', 'None', 'Question', 'Shield', 'Warning', 'WinLogo')] + [String]$Icon = 'None', + [Parameter(Mandatory = $false)] + [Switch]$NoWait = $false, + [Parameter(Mandatory = $false)] + [Switch]$PersistPrompt = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$MinimizeWindows = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$Timeout = $configInstallationUITimeout, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ExitOnTimeout = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Bypass if in non-interactive mode + If ($deployModeSilent) { + Write-Log -Message "Bypassing Show-InstallationPrompt [Mode: $deployMode]. Message:$Message" -Source ${CmdletName} + Return + } + + ## Get parameters for calling function asynchronously + [Hashtable]$installPromptParameters = $PSBoundParameters + + ## Check if the countdown was specified + If ($timeout -gt $configInstallationUITimeout) { + [String]$CountdownTimeoutErr = 'The installation UI dialog timeout cannot be longer than the timeout specified in the XML configuration file.' + Write-Log -Message $CountdownTimeoutErr -Severity 3 -Source ${CmdletName} + Throw $CountdownTimeoutErr + } + + ## If the NoWait parameter is specified, launch a new PowerShell session to show the prompt asynchronously + If ($NoWait) { + # Remove the NoWait parameter so that the script is run synchronously in the new PowerShell session. This also prevents the function to loop indefinitely. + $installPromptParameters.Remove('NoWait') + # Format the parameters as a string + [String]$installPromptParameters = ($installPromptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' + + + Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {& `'$scriptPath`' -ReferredInstallTitle `'$Title`' -ReferredInstallName `'$installName`' -ReferredLogName `'$logName`' -ShowInstallationPrompt $installPromptParameters -AsyncToolkitLaunch}" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' + Return + } + + [Windows.Forms.Application]::EnableVisualStyles() + $formInstallationPrompt = New-Object -TypeName 'System.Windows.Forms.Form' + $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' + If ($Icon -ne 'None') { + $pictureIcon = New-Object -TypeName 'System.Windows.Forms.PictureBox' + } + $labelText = New-Object -TypeName 'System.Windows.Forms.Label' + $buttonRight = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonMiddle = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonLeft = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonAbort = New-Object -TypeName 'System.Windows.Forms.Button' + $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' + $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' + + [ScriptBlock]$Install_Prompt_Form_Cleanup_FormClosed = { + ## Remove all event handlers from the controls + Try { + $labelText.remove_Click($handler_labelText_Click) + $buttonLeft.remove_Click($buttonLeft_OnClick) + $buttonRight.remove_Click($buttonRight_OnClick) + $buttonMiddle.remove_Click($buttonMiddle_OnClick) + $buttonAbort.remove_Click($buttonAbort_OnClick) + $installPromptTimer.remove_Tick($installPromptTimer_Tick) + $installPromptTimer.Dispose() + $installPromptTimer = $null + $installPromptTimerPersist.remove_Tick($installPromptTimerPersist_Tick) + $installPromptTimerPersist.Dispose() + $installPromptTimerPersist = $null + $formInstallationPrompt.remove_Load($Install_Prompt_Form_StateCorrection_Load) + $formInstallationPrompt.remove_FormClosed($Install_Prompt_Form_Cleanup_FormClosed) + } + Catch { + } + } + + [ScriptBlock]$Install_Prompt_Form_StateCorrection_Load = { + # Disable the X button + Try { + $windowHandle = $formInstallationPrompt.Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the button. Just disable the Control Box instead + Write-Log 'Failed to disable the Close button. Disabling the Control Box instead.' -Severity 2 -Source ${CmdletName} + $formInstallationPrompt.ControlBox = $false + } + $formInstallationPrompt.WindowState = 'Normal' + $formInstallationPrompt.AutoSize = $true + $formInstallationPrompt.AutoScaleMode = 'Font' + $formInstallationPrompt.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formInstallationPrompt.TopMost = $TopMost + $formInstallationPrompt.BringToFront() + # Get the start position of the form so we can return the form to this position if PersistPrompt is enabled + Set-Variable -Name 'formInstallationPromptStartPosition' -Value $formInstallationPrompt.Location -Scope 'Script' + } + + ## Form + + ##---------------------------------------------- + ## Create padding object + $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 0) + + ## Default control size + $DefaultControlSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 0) + + ## Generic Button properties + $buttonSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (130, 24) + + ## Picture Banner + $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureBanner.ImageLocation = $appDeployLogoBanner + $pictureBanner.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, $appDeployLogoBannerHeight) + $pictureBanner.MinimumSize = $DefaultControlSize + $pictureBanner.SizeMode = 'CenterImage' + $pictureBanner.Margin = $paddingNone + $pictureBanner.TabStop = $false + $pictureBanner.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + + ## Picture Icon + If ($Icon -ne 'None') { + $pictureIcon.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureIcon.Image = ([Drawing.SystemIcons]::$Icon).ToBitmap() + $pictureIcon.Name = 'pictureIcon' + $pictureIcon.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (64, 32) + $pictureIcon.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (64, 32) + $pictureIcon.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (24, 0, 8, 0) + $pictureIcon.SizeMode = 'CenterImage' + $pictureIcon.TabStop = $false + $pictureIcon.Anchor = 'None' + $pictureIcon.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 5) + } + + ## Label Text + $labelText.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelText.Font = $defaultFont + $labelText.Name = 'labelText' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (386, 0) + $labelText.Size = $System_Drawing_Size + If ($Icon -ne 'None') { + $labelText.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (386, $pictureIcon.Height) + } + Else { + $labelText.MinimumSize = $System_Drawing_Size + } + $labelText.MaximumSize = $System_Drawing_Size + $labelText.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 5) + $labelText.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (20, 0, 20, 0) + $labelText.TabStop = $false + $labelText.Text = $message + $labelText.TextAlign = "Middle$($MessageAlignment)" + $labelText.Anchor = 'None' + $labelText.AutoSize = $true + $labelText.add_Click($handler_labelText_Click) + + If ($Icon -ne 'None') { + # Add margin for the icon based on labelText Height so its centered + $pictureIcon.Height = $labelText.Height + } + ## Button Left + $buttonLeft.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonLeft.Name = 'buttonLeft' + $buttonLeft.Font = $defaultFont + $buttonLeft.Size = $buttonSize + $buttonLeft.MinimumSize = $buttonSize + $buttonLeft.MaximumSize = $buttonSize + $buttonLeft.TabIndex = 0 + $buttonLeft.Text = $buttonLeftText + $buttonLeft.DialogResult = 'No' + $buttonLeft.AutoSize = $false + $buttonLeft.Margin = $paddingNone + $buttonLeft.Padding = $paddingNone + $buttonLeft.UseVisualStyleBackColor = $true + $buttonLeft.Location = '14,4' + $buttonLeft.add_Click($buttonLeft_OnClick) + + ## Button Middle + $buttonMiddle.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonMiddle.Name = 'buttonMiddle' + $buttonMiddle.Font = $defaultFont + $buttonMiddle.Size = $buttonSize + $buttonMiddle.MinimumSize = $buttonSize + $buttonMiddle.MaximumSize = $buttonSize + $buttonMiddle.TabIndex = 1 + $buttonMiddle.Text = $buttonMiddleText + $buttonMiddle.DialogResult = 'Ignore' + $buttonMiddle.AutoSize = $true + $buttonMiddle.Margin = $paddingNone + $buttonMiddle.Padding = $paddingNone + $buttonMiddle.UseVisualStyleBackColor = $true + $buttonMiddle.Location = '160,4' + $buttonMiddle.add_Click($buttonMiddle_OnClick) + + ## Button Right + $buttonRight.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonRight.Name = 'buttonRight' + $buttonRight.Font = $defaultFont + $buttonRight.Size = $buttonSize + $buttonRight.MinimumSize = $buttonSize + $buttonRight.MaximumSize = $buttonSize + $buttonRight.TabIndex = 2 + $buttonRight.Text = $ButtonRightText + $buttonRight.DialogResult = 'Yes' + $buttonRight.AutoSize = $true + $buttonRight.Margin = $paddingNone + $buttonRight.Padding = $paddingNone + $buttonRight.UseVisualStyleBackColor = $true + $buttonRight.Location = '306,4' + $buttonRight.add_Click($buttonRight_OnClick) + + ## Button Abort (Hidden) + $buttonAbort.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonAbort.Name = 'buttonAbort' + $buttonAbort.Font = $defaultFont + $buttonAbort.Size = '0,0' + $buttonAbort.MinimumSize = '0,0' + $buttonAbort.MaximumSize = '0,0' + $buttonAbort.BackColor = [System.Drawing.Color]::Transparent + $buttonAbort.ForeColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.BorderSize = 0 + $buttonAbort.FlatAppearance.MouseDownBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.MouseOverBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatStyle = [System.Windows.Forms.FlatStyle]::System + $buttonAbort.DialogResult = 'Abort' + $buttonAbort.TabStop = $false + $buttonAbort.Visible = $true # Has to be set visible so we can call Click on it + $buttonAbort.Margin = $paddingNone + $buttonAbort.Padding = $paddingNone + $buttonAbort.UseVisualStyleBackColor = $true + $buttonAbort.add_Click($buttonAbort_OnClick) + + ## FlowLayoutPanel + $flowLayoutPanel.MinimumSize = $DefaultControlSize + $flowLayoutPanel.MaximumSize = $DefaultControlSize + $flowLayoutPanel.Size = $DefaultControlSize + $flowLayoutPanel.AutoSize = $true + $flowLayoutPanel.AutoSizeMode = 'GrowAndShrink' + $flowLayoutPanel.Anchor = 'Top,Left' + $flowLayoutPanel.FlowDirection = 'LeftToRight' + $flowLayoutPanel.WrapContents = $true + $flowLayoutPanel.Margin = $paddingNone + $flowLayoutPanel.Padding = $paddingNone + ## Make sure label text is positioned correctly + If ($Icon -ne 'None') { + $labelText.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 10, 0) + $pictureIcon.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + $labelText.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (64, 0) + } + Else { + $labelText.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelText.MinimumSize = $DefaultControlSize + $labelText.MaximumSize = $DefaultControlSize + $labelText.Size = $DefaultControlSize + $labelText.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + } + If ($Icon -ne 'None') { + $flowLayoutPanel.Controls.Add($pictureIcon) + } + $flowLayoutPanel.Controls.Add($labelText) + $flowLayoutPanel.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, $appDeployLogoBannerHeight) + + ## ButtonsPanel + $panelButtons.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + If ($Icon -ne 'None') { + $panelButtons.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (64, 0) + } + Else { + $panelButtons.Padding = $paddingNone + } + $panelButtons.Margin = $paddingNone + $panelButtons.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.AutoSize = $true + If ($buttonLeftText) { + $panelButtons.Controls.Add($buttonLeft) + } + If ($buttonMiddleText) { + $panelButtons.Controls.Add($buttonMiddle) + } + If ($buttonRightText) { + $panelButtons.Controls.Add($buttonRight) + } + ## Add the ButtonsPanel to the flowLayoutPanel if any buttons are present + If ($buttonLeftText -or $buttonMiddleText -or $buttonRightText) { + $flowLayoutPanel.Controls.Add($panelButtons) + } + + ## Form Installation Prompt + $formInstallationPrompt.MinimumSize = $DefaultControlSize + $formInstallationPrompt.Size = $DefaultControlSize + $formInstallationPrompt.Padding = $paddingNone + $formInstallationPrompt.Margin = $paddingNone + $formInstallationPrompt.DataBindings.DefaultDataSourceUpdateMode = 0 + $formInstallationPrompt.Name = 'InstallPromptForm' + $formInstallationPrompt.Text = $title + $formInstallationPrompt.StartPosition = 'CenterScreen' + # $formInstallationPrompt.FormBorderStyle = 'FixedDialog' + $formInstallationPrompt.MaximizeBox = $false + $formInstallationPrompt.MinimizeBox = $false + $formInstallationPrompt.TopMost = $TopMost + $formInstallationPrompt.TopLevel = $true + $formInstallationPrompt.AutoSize = $true + $formInstallationPrompt.AutoScaleMode = 'Font' + $formInstallationPrompt.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formInstallationPrompt.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + $formInstallationPrompt.Controls.Add($pictureBanner) + $formInstallationPrompt.Controls.Add($buttonAbort) + $formInstallationPrompt.Controls.Add($flowLayoutPanel) + ## Timer + $installPromptTimer = New-Object -TypeName 'System.Windows.Forms.Timer' + $installPromptTimer.Interval = ($timeout * 1000) + $installPromptTimer.Add_Tick({ + Write-Log -Message 'Installation action not taken within a reasonable amount of time.' -Source ${CmdletName} + $buttonAbort.PerformClick() + }) + ## Init the OnLoad event to correct the initial state of the form + $formInstallationPrompt.add_Load($Install_Prompt_Form_StateCorrection_Load) + ## Clean up the control events + $formInstallationPrompt.add_FormClosed($Install_Prompt_Form_Cleanup_FormClosed) + + ## Start the timer + $installPromptTimer.Start() + + ## Persistence Timer + If ($persistPrompt) { + $installPromptTimerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' + $installPromptTimerPersist.Interval = ($configInstallationPersistInterval * 1000) + [ScriptBlock]$installPromptTimerPersist_Tick = { + $formInstallationPrompt.WindowState = 'Normal' + $formInstallationPrompt.TopMost = $TopMost + $formInstallationPrompt.BringToFront() + $formInstallationPrompt.Location = "$($formInstallationPromptStartPosition.X),$($formInstallationPromptStartPosition.Y)" + } + $installPromptTimerPersist.add_Tick($installPromptTimerPersist_Tick) + $installPromptTimerPersist.Start() + } + + If (-not $AsyncToolkitLaunch) { + ## Close the Installation Progress Dialog if running + Close-InstallationProgress + } + + [String]$installPromptLoggedParameters = ($installPromptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' + Write-Log -Message "Displaying custom installation prompt with the parameters: [$installPromptLoggedParameters]." -Source ${CmdletName} + + + ## Show the prompt synchronously. If user cancels, then keep showing it until user responds using one of the buttons. + $showDialog = $true + While ($showDialog) { + # Minimize all other windows + If ($minimizeWindows) { + $null = $shellApp.MinimizeAll() + } + # Show the Form + $result = $formInstallationPrompt.ShowDialog() + If (($result -eq 'Yes') -or ($result -eq 'No') -or ($result -eq 'Ignore') -or ($result -eq 'Abort')) { + $showDialog = $false + } + } + $formInstallationPrompt.Dispose() + + Switch ($result) { + 'Yes' { + Write-Output -InputObject ($buttonRightText) + } + 'No' { + Write-Output -InputObject ($buttonLeftText) + } + 'Ignore' { + Write-Output -InputObject ($buttonMiddleText) + } + 'Abort' { + # Restore minimized windows + $null = $shellApp.UndoMinimizeAll() + If ($ExitOnTimeout) { + Exit-Script -ExitCode $configInstallationUIExitCode + } + Else { + Write-Log -Message 'UI timed out but `$ExitOnTimeout set to `$false. Continue...' -Source ${CmdletName} + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Show-DialogBox Function Show-DialogBox { -<# + <# .SYNOPSIS - Display a custom dialog box with optional title, buttons, icon and timeout. - Show-InstallationPrompt is recommended over this function as it provides more customization and uses consistent branding with the other UI components. + +Display a custom dialog box with optional title, buttons, icon and timeout. + +Show-InstallationPrompt is recommended over this function as it provides more customization and uses consistent branding with the other UI components. + .DESCRIPTION - Display a custom dialog box with optional title, buttons, icon and timeout. The default button is "OK", the default Icon is "None", and the default Timeout is none. + +Display a custom dialog box with optional title, buttons, icon and timeout. The default button is "OK", the default Icon is "None", and the default Timeout is None + .PARAMETER Text - Text in the message dialog box + +Text in the message dialog box + .PARAMETER Title - Title of the message dialog box + +Title of the message dialog box + .PARAMETER Buttons - Buttons to be included on the dialog box. Options: OK, OKCancel, AbortRetryIgnore, YesNoCancel, YesNo, RetryCancel, CancelTryAgainContinue. Default: OK. + +Buttons to be included on the dialog box. Options: OK, OKCancel, AbortRetryIgnore, YesNoCancel, YesNo, RetryCancel, CancelTryAgainContinue. Default: OK. + .PARAMETER DefaultButton - The Default button that is selected. Options: First, Second, Third. Default: First. + +The Default button that is selected. Options: First, Second, Third. Default: First. + .PARAMETER Icon - Icon to display on the dialog box. Options: None, Stop, Question, Exclamation, Information. Default: None. + +Icon to display on the dialog box. Options: None, Stop, Question, Exclamation, Information. Default: None + .PARAMETER Timeout - Timeout period in seconds before automatically closing the dialog box with the return message "Timeout". Default: UI timeout value set in the config XML file. + +Timeout period in seconds before automatically closing the dialog box with the return message "Timeout". Default: UI timeout value set in the config XML file. + .PARAMETER TopMost - Specifies whether the message box is a system modal message box and appears in a topmost window. Default: $true. + +Specifies whether the message box is a system modal message box and appears in a topmost window. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the text of the button that was clicked. + .EXAMPLE - Show-DialogBox -Title 'Installed Complete' -Text 'Installation has completed. Please click OK and restart your computer.' -Icon 'Information' + +Show-DialogBox -Title 'Installed Complete' -Text 'Installation has completed. Please click OK and restart your computer.' -Icon 'Information' + .EXAMPLE - Show-DialogBox -Title 'Installation Notice' -Text 'Installation will take approximately 30 minutes. Do you wish to proceed?' -Buttons 'OKCancel' -DefaultButton 'Second' -Icon 'Exclamation' -Timeout 600 -Topmost $false + +Show-DialogBox -Title 'Installation Notice' -Text 'Installation will take approximately 30 minutes. Do you wish to proceed?' -Buttons 'OKCancel' -DefaultButton 'Second' -Icon 'Exclamation' -Timeout 600 -Topmost $false + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,Position=0,HelpMessage='Enter a message for the dialog box')] - [ValidateNotNullorEmpty()] - [string]$Text, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Title = $installTitle, - [Parameter(Mandatory=$false)] - [ValidateSet('OK','OKCancel','AbortRetryIgnore','YesNoCancel','YesNo','RetryCancel','CancelTryAgainContinue')] - [string]$Buttons = 'OK', - [Parameter(Mandatory=$false)] - [ValidateSet('First','Second','Third')] - [string]$DefaultButton = 'First', - [Parameter(Mandatory=$false)] - [ValidateSet('Exclamation','Information','None','Stop','Question')] - [string]$Icon = 'None', - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Timeout = $configInstallationUITimeout, - [Parameter(Mandatory=$false)] - [boolean]$TopMost = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - # Bypass if in non-interactive mode - If ($deployModeNonInteractive) { - Write-Log -Message "Bypassing Dialog Box [Mode: $deployMode]: $Text..." -Source ${CmdletName} - Return - } - - Write-Log -Message "Display Dialog Box with message: $Text..." -Source ${CmdletName} - - [hashtable]$dialogButtons = @{ - 'OK' = 0 - 'OKCancel' = 1 - 'AbortRetryIgnore' = 2 - 'YesNoCancel' = 3 - 'YesNo' = 4 - 'RetryCancel' = 5 - 'CancelTryAgainContinue' = 6 - } - - [hashtable]$dialogIcons = @{ - 'None' = 0 - 'Stop' = 16 - 'Question' = 32 - 'Exclamation' = 48 - 'Information' = 64 - } - - [hashtable]$dialogDefaultButton = @{ - 'First' = 0 - 'Second' = 256 - 'Third' = 512 - } - - Switch ($TopMost) { - $true { $dialogTopMost = 4096 } - $false { $dialogTopMost = 0 } - } - - $response = $Shell.Popup($Text, $Timeout, $Title, ($dialogButtons[$Buttons] + $dialogIcons[$Icon] + $dialogDefaultButton[$DefaultButton] + $dialogTopMost)) - - Switch ($response) { - 1 { - Write-Log -Message 'Dialog Box Response: OK' -Source ${CmdletName} - Write-Output -InputObject 'OK' - } - 2 { - Write-Log -Message 'Dialog Box Response: Cancel' -Source ${CmdletName} - Write-Output -InputObject 'Cancel' - } - 3 { - Write-Log -Message 'Dialog Box Response: Abort' -Source ${CmdletName} - Write-Output -InputObject 'Abort' - } - 4 { - Write-Log -Message 'Dialog Box Response: Retry' -Source ${CmdletName} - Write-Output -InputObject 'Retry' - } - 5 { - Write-Log -Message 'Dialog Box Response: Ignore' -Source ${CmdletName} - Write-Output -InputObject 'Ignore' - } - 6 { - Write-Log -Message 'Dialog Box Response: Yes' -Source ${CmdletName} - Write-Output -InputObject 'Yes' - } - 7 { - Write-Log -Message 'Dialog Box Response: No' -Source ${CmdletName} - Write-Output -InputObject 'No' - } - 10 { - Write-Log -Message 'Dialog Box Response: Try Again' -Source ${CmdletName} - Write-Output -InputObject 'Try Again' - } - 11 { - Write-Log -Message 'Dialog Box Response: Continue' -Source ${CmdletName} - Write-Output -InputObject 'Continue' - } - -1 { - Write-Log -Message 'Dialog Box Timed Out...' -Source ${CmdletName} - Write-Output -InputObject 'Timeout' - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, HelpMessage = 'Enter a message for the dialog box')] + [ValidateNotNullorEmpty()] + [String]$Text, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Title = $installTitle, + [Parameter(Mandatory = $false)] + [ValidateSet('OK', 'OKCancel', 'AbortRetryIgnore', 'YesNoCancel', 'YesNo', 'RetryCancel', 'CancelTryAgainContinue')] + [String]$Buttons = 'OK', + [Parameter(Mandatory = $false)] + [ValidateSet('First', 'Second', 'Third')] + [String]$DefaultButton = 'First', + [Parameter(Mandatory = $false)] + [ValidateSet('Exclamation', 'Information', 'None', 'Stop', 'Question')] + [String]$Icon = 'None', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Timeout = $configInstallationUITimeout, + [Parameter(Mandatory = $false)] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + # Bypass if in non-interactive mode + If ($deployModeNonInteractive) { + Write-Log -Message "Bypassing Show-DialogBox [Mode: $deployMode]. Text:$Text" -Source ${CmdletName} + Return + } + + Write-Log -Message "Displaying Dialog Box with message: $Text..." -Source ${CmdletName} + + [Hashtable]$dialogButtons = @{ + 'OK' = 0 + 'OKCancel' = 1 + 'AbortRetryIgnore' = 2 + 'YesNoCancel' = 3 + 'YesNo' = 4 + 'RetryCancel' = 5 + 'CancelTryAgainContinue' = 6 + } + + [Hashtable]$dialogIcons = @{ + 'None' = 0 + 'Stop' = 16 + 'Question' = 32 + 'Exclamation' = 48 + 'Information' = 64 + } + + [Hashtable]$dialogDefaultButton = @{ + 'First' = 0 + 'Second' = 256 + 'Third' = 512 + } + + Switch ($TopMost) { + $true { + $dialogTopMost = 4096 + } + $false { + $dialogTopMost = 0 + } + } + + $response = $Shell.Popup($Text, $Timeout, $Title, ($dialogButtons[$Buttons] + $dialogIcons[$Icon] + $dialogDefaultButton[$DefaultButton] + $dialogTopMost)) + + Switch ($response) { + 1 { + Write-Log -Message 'Dialog Box Response: OK' -Source ${CmdletName} + Write-Output -InputObject ('OK') + } + 2 { + Write-Log -Message 'Dialog Box Response: Cancel' -Source ${CmdletName} + Write-Output -InputObject ('Cancel') + } + 3 { + Write-Log -Message 'Dialog Box Response: Abort' -Source ${CmdletName} + Write-Output -InputObject ('Abort') + } + 4 { + Write-Log -Message 'Dialog Box Response: Retry' -Source ${CmdletName} + Write-Output -InputObject ('Retry') + } + 5 { + Write-Log -Message 'Dialog Box Response: Ignore' -Source ${CmdletName} + Write-Output -InputObject ('Ignore') + } + 6 { + Write-Log -Message 'Dialog Box Response: Yes' -Source ${CmdletName} + Write-Output -InputObject ('Yes') + } + 7 { + Write-Log -Message 'Dialog Box Response: No' -Source ${CmdletName} + Write-Output -InputObject ('No') + } + 10 { + Write-Log -Message 'Dialog Box Response: Try Again' -Source ${CmdletName} + Write-Output -InputObject ('Try Again') + } + 11 { + Write-Log -Message 'Dialog Box Response: Continue' -Source ${CmdletName} + Write-Output -InputObject ('Continue') + } + -1 { + Write-Log -Message 'Dialog Box Timed Out...' -Source ${CmdletName} + Write-Output -InputObject ('Timeout') + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-HardwarePlatform Function Get-HardwarePlatform { -<# + <# .SYNOPSIS - Retrieves information about the hardware platform (physical or virtual) + +Retrieves information about the hardware platform (physical or virtual) + .DESCRIPTION - Retrieves information about the hardware platform (physical or virtual) + +Retrieves information about the hardware platform (physical or virtual) + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the hardware platform (physical or virtual) + .EXAMPLE - Get-HardwarePlatform + +Get-HardwarePlatform + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Retrieve hardware platform information.' -Source ${CmdletName} - $hwBios = Get-WmiObject -Class 'Win32_BIOS' -ErrorAction 'Stop' | Select-Object -Property 'Version', 'SerialNumber' - $hwMakeModel = Get-WMIObject -Class 'Win32_ComputerSystem' -ErrorAction 'Stop' | Select-Object -Property 'Model', 'Manufacturer' - - If ($hwBIOS.Version -match 'VRTUAL') { $hwType = 'Virtual:Hyper-V' } - ElseIf ($hwBIOS.Version -match 'A M I') { $hwType = 'Virtual:Virtual PC' } - ElseIf ($hwBIOS.Version -like '*Xen*') { $hwType = 'Virtual:Xen' } - ElseIf ($hwBIOS.SerialNumber -like '*VMware*') { $hwType = 'Virtual:VMWare' } - ElseIf (($hwMakeModel.Manufacturer -like '*Microsoft*') -and ($hwMakeModel.Model -notlike '*Surface*')) { $hwType = 'Virtual:Hyper-V' } - ElseIf ($hwMakeModel.Manufacturer -like '*VMWare*') { $hwType = 'Virtual:VMWare' } - ElseIf ($hwMakeModel.Model -like '*Virtual*') { $hwType = 'Virtual' } - Else { $hwType = 'Physical' } - - Write-Output -InputObject $hwType - } - Catch { - Write-Log -Message "Failed to retrieve hardware platform information. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to retrieve hardware platform information: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Retrieving hardware platform information.' -Source ${CmdletName} + $hwBios = Get-WmiObject -Class 'Win32_BIOS' -ErrorAction 'Stop' | Select-Object -Property 'Version', 'SerialNumber' + $hwMakeModel = Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'Stop' | Select-Object -Property 'Model', 'Manufacturer' + + If ($hwBIOS.Version -match 'VRTUAL') { + $hwType = 'Virtual:Hyper-V' + } + ElseIf ($hwBIOS.Version -match 'A M I') { + $hwType = 'Virtual:Virtual PC' + } + ElseIf ($hwBIOS.Version -like '*Xen*') { + $hwType = 'Virtual:Xen' + } + ElseIf ($hwBIOS.SerialNumber -like '*VMware*') { + $hwType = 'Virtual:VMWare' + } + ElseIf (($hwMakeModel.Manufacturer -like '*Microsoft*') -and ($hwMakeModel.Model -notlike '*Surface*')) { + $hwType = 'Virtual:Hyper-V' + } + ElseIf ($hwMakeModel.Manufacturer -like '*VMWare*') { + $hwType = 'Virtual:VMWare' + } + ElseIf ($hwMakeModel.Model -like '*Virtual*') { + $hwType = 'Virtual' + } + Else { + $hwType = 'Physical' + } + + Write-Output -InputObject ($hwType) + } + Catch { + Write-Log -Message "Failed to retrieve hardware platform information. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to retrieve hardware platform information: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-FreeDiskSpace Function Get-FreeDiskSpace { -<# + <# .SYNOPSIS - Retrieves the free disk space in MB on a particular drive (defaults to system drive) + +Retrieves the free disk space in MB on a particular drive (defaults to system drive) + .DESCRIPTION - Retrieves the free disk space in MB on a particular drive (defaults to system drive) + +Retrieves the free disk space in MB on a particular drive (defaults to system drive) + .PARAMETER Drive - Drive to check free disk space on + +Drive to check free disk space on + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Double + +Returns the free disk space in MB + .EXAMPLE - Get-FreeDiskSpace -Drive 'C:' + +Get-FreeDiskSpace -Drive 'C:' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Drive = $envSystemDrive, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Retrieve free disk space for drive [$Drive]." -Source ${CmdletName} - $disk = Get-WmiObject -Class 'Win32_LogicalDisk' -Filter "DeviceID='$Drive'" -ErrorAction 'Stop' - [double]$freeDiskSpace = [math]::Round($disk.FreeSpace / 1MB) - - Write-Log -Message "Free disk space for drive [$Drive]: [$freeDiskSpace MB]." -Source ${CmdletName} - Write-Output -InputObject $freeDiskSpace - } - Catch { - Write-Log -Message "Failed to retrieve free disk space for drive [$Drive]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to retrieve free disk space for drive [$Drive]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Drive = $envSystemDrive, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Retrieving free disk space for drive [$Drive]." -Source ${CmdletName} + $disk = Get-WmiObject -Class 'Win32_LogicalDisk' -Filter "DeviceID='$Drive'" -ErrorAction 'Stop' + [Double]$freeDiskSpace = [Math]::Round($disk.FreeSpace / 1MB) + + Write-Log -Message "Free disk space for drive [$Drive]: [$freeDiskSpace MB]." -Source ${CmdletName} + Write-Output -InputObject ($freeDiskSpace) + } + Catch { + Write-Log -Message "Failed to retrieve free disk space for drive [$Drive]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to retrieve free disk space for drive [$Drive]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-InstalledApplication Function Get-InstalledApplication { -<# + <# .SYNOPSIS - Retrieves information about installed applications. + +Retrieves information about installed applications. + .DESCRIPTION - Retrieves information about installed applications by querying the registry. You can specify an application name, a product code, or both. - Returns information about application publisher, name & version, product code, uninstall string, install source, location, date, and application architecture. + +Retrieves information about installed applications by querying the registry. You can specify an application name, a product code, or both. + +Returns information about application publisher, name & version, product code, uninstall string, install source, location, date, and application architecture. + .PARAMETER Name - The name of the application to retrieve information for. Performs a contains match on the application display name by default. + +The name of the application to retrieve information for. Performs a contains match on the application display name by default. + .PARAMETER Exact - Specifies that the named application must be matched using the exact name. + +Specifies that the named application must be matched using the exact name. + .PARAMETER WildCard - Specifies that the named application must be matched using a wildcard search. + +Specifies that the named application must be matched using a wildcard search. + .PARAMETER RegEx - Specifies that the named application must be matched using a regular expression search. + +Specifies that the named application must be matched using a regular expression search. + .PARAMETER ProductCode - The product code of the application to retrieve information for. + +The product code of the application to retrieve information for. + .PARAMETER IncludeUpdatesAndHotfixes - Include matches against updates and hotfixes in results. + +Include matches against updates and hotfixes in results. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns a PSObject with information about an installed application +- Publisher +- DisplayName +- DisplayVersion +- ProductCode +- UninstallString +- InstallSource +- InstallLocation +- InstallDate +- Architecture + .EXAMPLE - Get-InstalledApplication -Name 'Adobe Flash' + +Get-InstalledApplication -Name 'Adobe Flash' + .EXAMPLE - Get-InstalledApplication -ProductCode '{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + Get-InstalledApplication -ProductCode '{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' +.Outputs + For every detected matching Application the Function puts out a custom Object containing the following Properties: + DisplayName, DisplayVersion, InstallDate, Publisher, Is64BitApplication, ProductCode, InstallLocation, UninstallSubkey, UninstallString, InstallSource. .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string[]]$Name, - [Parameter(Mandatory=$false)] - [switch]$Exact = $false, - [Parameter(Mandatory=$false)] - [switch]$WildCard = $false, - [Parameter(Mandatory=$false)] - [switch]$RegEx = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$ProductCode, - [Parameter(Mandatory=$false)] - [switch]$IncludeUpdatesAndHotfixes - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - If ($name) { - Write-Log -Message "Get information for installed Application Name(s) [$($name -join ', ')]..." -Source ${CmdletName} - } - If ($productCode) { - Write-Log -Message "Get information for installed Product Code [$ProductCode]..." -Source ${CmdletName} - } - - ## Enumerate the installed applications from the registry for applications that have the "DisplayName" property - [psobject[]]$regKeyApplication = @() - ForEach ($regKey in $regKeyApplications) { - If (Test-Path -LiteralPath $regKey -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorUninstallKeyPath') { - [psobject[]]$UninstallKeyApps = Get-ChildItem -LiteralPath $regKey -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorUninstallKeyPath' - ForEach ($UninstallKeyApp in $UninstallKeyApps) { - Try { - [psobject]$regKeyApplicationProps = Get-ItemProperty -LiteralPath $UninstallKeyApp.PSPath -ErrorAction 'Stop' - If ($regKeyApplicationProps.DisplayName) { [psobject[]]$regKeyApplication += $regKeyApplicationProps } - } - Catch{ - Write-Log -Message "Unable to enumerate properties from registry key path [$($UninstallKeyApp.PSPath)]. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - Continue - } - } - } - } - If ($ErrorUninstallKeyPath) { - Write-Log -Message "The following error(s) took place while enumerating installed applications from the registry. `n$(Resolve-Error -ErrorRecord $ErrorUninstallKeyPath)" -Severity 2 -Source ${CmdletName} - } - - ## Create a custom object with the desired properties for the installed applications and sanitize property details - [psobject[]]$installedApplication = @() - ForEach ($regKeyApp in $regKeyApplication) { - Try { - [string]$appDisplayName = '' - [string]$appDisplayVersion = '' - [string]$appPublisher = '' - - ## Bypass any updates or hotfixes - If (-not $IncludeUpdatesAndHotfixes) { - If ($regKeyApp.DisplayName -match '(?i)kb\d+') { Continue } - If ($regKeyApp.DisplayName -match 'Cumulative Update') { Continue } - If ($regKeyApp.DisplayName -match 'Security Update') { Continue } - If ($regKeyApp.DisplayName -match 'Hotfix') { Continue } - } - - ## Remove any control characters which may interfere with logging and creating file path names from these variables - $appDisplayName = $regKeyApp.DisplayName -replace '[^\u001F-\u007F]','' - $appDisplayVersion = $regKeyApp.DisplayVersion -replace '[^\u001F-\u007F]','' - $appPublisher = $regKeyApp.Publisher -replace '[^\u001F-\u007F]','' - - ## Determine if application is a 64-bit application - [boolean]$Is64BitApp = If (($is64Bit) -and ($regKeyApp.PSPath -notmatch '^Microsoft\.PowerShell\.Core\\Registry::HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node')) { $true } Else { $false } - - If ($ProductCode) { - ## Verify if there is a match with the product code passed to the script - If ($regKeyApp.PSChildName -match [regex]::Escape($productCode)) { - Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] matching product code [$productCode]." -Source ${CmdletName} - $installedApplication += New-Object -TypeName 'PSObject' -Property @{ - UninstallSubkey = $regKeyApp.PSChildName - ProductCode = If ($regKeyApp.PSChildName -match $MSIProductCodeRegExPattern) { $regKeyApp.PSChildName } Else { [string]::Empty } - DisplayName = $appDisplayName - DisplayVersion = $appDisplayVersion - UninstallString = $regKeyApp.UninstallString - InstallSource = $regKeyApp.InstallSource - InstallLocation = $regKeyApp.InstallLocation - InstallDate = $regKeyApp.InstallDate - Publisher = $appPublisher - Is64BitApplication = $Is64BitApp - } - } - } - - If ($name) { - ## Verify if there is a match with the application name(s) passed to the script - ForEach ($application in $Name) { - $applicationMatched = $false - If ($exact) { - # Check for an exact application name match - If ($regKeyApp.DisplayName -eq $application) { - $applicationMatched = $true - Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using exact name matching for search term [$application]." -Source ${CmdletName} - } - } - ElseIf ($WildCard) { - # Check for wildcard application name match - If ($regKeyApp.DisplayName -like $application) { - $applicationMatched = $true - Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using wildcard matching for search term [$application]." -Source ${CmdletName} - } - } - ElseIf ($RegEx) { - # Check for a regex application name match - If ($regKeyApp.DisplayName -match $application) { - $applicationMatched = $true - Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using regex matching for search term [$application]." -Source ${CmdletName} - } - } - # Check for a contains application name match - ElseIf ($regKeyApp.DisplayName -match [regex]::Escape($application)) { - $applicationMatched = $true - Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using contains matching for search term [$application]." -Source ${CmdletName} - } - - If ($applicationMatched) { - $installedApplication += New-Object -TypeName 'PSObject' -Property @{ - UninstallSubkey = $regKeyApp.PSChildName - ProductCode = If ($regKeyApp.PSChildName -match $MSIProductCodeRegExPattern) { $regKeyApp.PSChildName } Else { [string]::Empty } - DisplayName = $appDisplayName - DisplayVersion = $appDisplayVersion - UninstallString = $regKeyApp.UninstallString - InstallSource = $regKeyApp.InstallSource - InstallLocation = $regKeyApp.InstallLocation - InstallDate = $regKeyApp.InstallDate - Publisher = $appPublisher - Is64BitApplication = $Is64BitApp - } - } - } - } - } - Catch { - Write-Log -Message "Failed to resolve application details from registry for [$appDisplayName]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - Continue - } - } - - Write-Output -InputObject $installedApplication - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String[]]$Name, + [Parameter(Mandatory = $false)] + [Switch]$Exact = $false, + [Parameter(Mandatory = $false)] + [Switch]$WildCard = $false, + [Parameter(Mandatory = $false)] + [Switch]$RegEx = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$ProductCode, + [Parameter(Mandatory = $false)] + [Switch]$IncludeUpdatesAndHotfixes + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($name) { + Write-Log -Message "Getting information for installed Application Name(s) [$($name -join ', ')]..." -Source ${CmdletName} + } + If ($productCode) { + Write-Log -Message "Getting information for installed Product Code [$ProductCode]..." -Source ${CmdletName} + } + + ## Enumerate the installed applications from the registry for applications that have the "DisplayName" property + [PSObject[]]$regKeyApplication = @() + ForEach ($regKey in $regKeyApplications) { + If (Test-Path -LiteralPath $regKey -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorUninstallKeyPath') { + [PSObject[]]$UninstallKeyApps = Get-ChildItem -LiteralPath $regKey -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorUninstallKeyPath' + ForEach ($UninstallKeyApp in $UninstallKeyApps) { + Try { + [PSObject]$regKeyApplicationProps = Get-ItemProperty -LiteralPath $UninstallKeyApp.PSPath -ErrorAction 'Stop' + If ($regKeyApplicationProps.DisplayName) { + [PSObject[]]$regKeyApplication += $regKeyApplicationProps + } + } + Catch { + Write-Log -Message "Unable to enumerate properties from registry key path [$($UninstallKeyApp.PSPath)]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Continue + } + } + } + } + If ($ErrorUninstallKeyPath) { + Write-Log -Message "The following error(s) took place while enumerating installed applications from the registry. `r`n$(Resolve-Error -ErrorRecord $ErrorUninstallKeyPath)" -Severity 2 -Source ${CmdletName} + } + + $UpdatesSkippedCounter = 0 + ## Create a custom object with the desired properties for the installed applications and sanitize property details + [PSObject[]]$installedApplication = @() + ForEach ($regKeyApp in $regKeyApplication) { + Try { + [String]$appDisplayName = '' + [String]$appDisplayVersion = '' + [String]$appPublisher = '' + + ## Bypass any updates or hotfixes + If ((-not $IncludeUpdatesAndHotfixes) -and (($regKeyApp.DisplayName -match '(?i)kb\d+') -or ($regKeyApp.DisplayName -match 'Cumulative Update') -or ($regKeyApp.DisplayName -match 'Security Update') -or ($regKeyApp.DisplayName -match 'Hotfix'))) { + $UpdatesSkippedCounter += 1 + Continue + } + + ## Remove any control characters which may interfere with logging and creating file path names from these variables + $appDisplayName = $regKeyApp.DisplayName -replace '[^\p{L}\p{Nd}\p{Z}\p{P}]', '' + $appDisplayVersion = $regKeyApp.DisplayVersion -replace '[^\p{L}\p{Nd}\p{Z}\p{P}]', '' + $appPublisher = $regKeyApp.Publisher -replace '[^\p{L}\p{Nd}\p{Z}\p{P}]', '' + + + ## Determine if application is a 64-bit application + [Boolean]$Is64BitApp = If (($is64Bit) -and ($regKeyApp.PSPath -notmatch '^Microsoft\.PowerShell\.Core\\Registry::HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node')) { + $true + } + Else { + $false + } + + If ($ProductCode) { + ## Verify if there is a match with the product code passed to the script + If ($regKeyApp.PSChildName -match [RegEx]::Escape($productCode)) { + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] matching product code [$productCode]." -Source ${CmdletName} + $installedApplication += New-Object -TypeName 'PSObject' -Property @{ + UninstallSubkey = $regKeyApp.PSChildName + ProductCode = If ($regKeyApp.PSChildName -match $MSIProductCodeRegExPattern) { + $regKeyApp.PSChildName + } + Else { + [String]::Empty + } + DisplayName = $appDisplayName + DisplayVersion = $appDisplayVersion + UninstallString = $regKeyApp.UninstallString + InstallSource = $regKeyApp.InstallSource + InstallLocation = $regKeyApp.InstallLocation + InstallDate = $regKeyApp.InstallDate + Publisher = $appPublisher + Is64BitApplication = $Is64BitApp + } + } + } + + If ($name) { + ## Verify if there is a match with the application name(s) passed to the script + ForEach ($application in $Name) { + $applicationMatched = $false + If ($exact) { + # Check for an exact application name match + If ($regKeyApp.DisplayName -eq $application) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using exact name matching for search term [$application]." -Source ${CmdletName} + } + } + ElseIf ($WildCard) { + # Check for wildcard application name match + If ($regKeyApp.DisplayName -like $application) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using wildcard matching for search term [$application]." -Source ${CmdletName} + } + } + ElseIf ($RegEx) { + # Check for a regex application name match + If ($regKeyApp.DisplayName -match $application) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using regex matching for search term [$application]." -Source ${CmdletName} + } + } + # Check for a contains application name match + ElseIf ($regKeyApp.DisplayName -match [RegEx]::Escape($application)) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using contains matching for search term [$application]." -Source ${CmdletName} + } + + If ($applicationMatched) { + $installedApplication += New-Object -TypeName 'PSObject' -Property @{ + UninstallSubkey = $regKeyApp.PSChildName + ProductCode = If ($regKeyApp.PSChildName -match $MSIProductCodeRegExPattern) { + $regKeyApp.PSChildName + } + Else { + [String]::Empty + } + DisplayName = $appDisplayName + DisplayVersion = $appDisplayVersion + UninstallString = $regKeyApp.UninstallString + InstallSource = $regKeyApp.InstallSource + InstallLocation = $regKeyApp.InstallLocation + InstallDate = $regKeyApp.InstallDate + Publisher = $appPublisher + Is64BitApplication = $Is64BitApp + } + } + } + } + } + Catch { + Write-Log -Message "Failed to resolve application details from registry for [$appDisplayName]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Continue + } + } + + If (-not $IncludeUpdatesAndHotfixes) { + ## Write to log the number of entries skipped due to them being considered updates + If ($UpdatesSkippedCounter -eq 1) { + Write-Log -Message 'Skipped 1 entry while searching, because it was considered a Microsoft update.' -Source ${CmdletName} + } + Else { + Write-Log -Message "Skipped $UpdatesSkippedCounter entries while searching, because they were considered Microsoft updates." -Source ${CmdletName} + } + } + + If (-not $installedApplication) { + Write-Log -Message 'Found no application based on the supplied parameters.' -Source ${CmdletName} + } + + Write-Output -InputObject ($installedApplication) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Execute-MSI Function Execute-MSI { -<# + <# .SYNOPSIS - Executes msiexec.exe to perform the following actions for MSI & MSP files and MSI product codes: install, uninstall, patch, repair, active setup. + +Executes msiexec.exe to perform the following actions for MSI & MSP files and MSI product codes: install, uninstall, patch, repair, active setup. + .DESCRIPTION - Executes msiexec.exe to perform the following actions for MSI & MSP files and MSI product codes: install, uninstall, patch, repair, active setup. - If the -Action parameter is set to "Install" and the MSI is already installed, the function will exit. - Sets default switches to be passed to msiexec based on the preferences in the XML configuration file. - Automatically generates a log file name and creates a verbose log file for all msiexec operations. - Expects the MSI or MSP file to be located in the "Files" sub directory of the App Deploy Toolkit. Expects transform files to be in the same directory as the MSI file. + +Executes msiexec.exe to perform the following actions for MSI & MSP files and MSI product codes: install, uninstall, patch, repair, active setup. + +If the -Action parameter is set to "Install" and the MSI is already installed, the function will exit. + +Sets default switches to be passed to msiexec based on the preferences in the XML configuration file. + +Automatically generates a log file name and creates a verbose log file for all msiexec operations. + +Expects the MSI or MSP file to be located in the "Files" sub directory of the App Deploy Toolkit. Expects transform files to be in the same directory as the MSI file. + .PARAMETER Action - The action to perform. Options: Install, Uninstall, Patch, Repair, ActiveSetup. + +The action to perform. Options: Install, Uninstall, Patch, Repair, ActiveSetup. + .PARAMETER Path - The path to the MSI/MSP file or the product code of the installed MSI. + +The path to the MSI/MSP file or the product code of the installed MSI. + .PARAMETER Transform - The name of the transform file(s) to be applied to the MSI. The transform file is expected to be in the same directory as the MSI file. + +The name of the transform file(s) to be applied to the MSI. The transform file is expected to be in the same directory as the MSI file. Multiple transforms have to be separated by a semi-colon. + .PARAMETER Patch - The name of the patch (msp) file(s) to be applied to the MSI for use with the "Install" action. The patch file is expected to be in the same directory as the MSI file. + +The name of the patch (msp) file(s) to be applied to the MSI for use with the "Install" action. The patch file is expected to be in the same directory as the MSI file. Multiple patches have to be separated by a semi-colon. + .PARAMETER Parameters - Overrides the default parameters specified in the XML configuration file. Install default is: "REBOOT=ReallySuppress /QB!". Uninstall default is: "REBOOT=ReallySuppress /QN". + +Overrides the default parameters specified in the XML configuration file. Install default is: "REBOOT=ReallySuppress /QB!". Uninstall default is: "REBOOT=ReallySuppress /QN". + .PARAMETER AddParameters - Adds to the default parameters specified in the XML configuration file. Install default is: "REBOOT=ReallySuppress /QB!". Uninstall default is: "REBOOT=ReallySuppress /QN". + +Adds to the default parameters specified in the XML configuration file. Install default is: "REBOOT=ReallySuppress /QB!". Uninstall default is: "REBOOT=ReallySuppress /QN". + .PARAMETER SecureParameters - Hides all parameters passed to the MSI or MSP file from the toolkit Log file. + +Hides all parameters passed to the MSI or MSP file from the toolkit Log file. + .PARAMETER LoggingOptions - Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". + +Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". + .PARAMETER LogName - Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. - For uninstallations, by default the product code is resolved to the DisplayName and version of the application. + +Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. + +For uninstallations, by default the product code is resolved to the DisplayName and version of the application. + .PARAMETER WorkingDirectory - Overrides the working directory. The working directory is set to the location of the MSI file. + +Overrides the working directory. The working directory is set to the location of the MSI file. + .PARAMETER SkipMSIAlreadyInstalledCheck - Skips the check to determine if the MSI is already installed on the system. Default is: $false. + +Skips the check to determine if the MSI is already installed on the system. Default is: $false. + .PARAMETER IncludeUpdatesAndHotfixes - Include matches against updates and hotfixes in results. + +Include matches against updates and hotfixes in results. + +.PARAMETER NoWait + +Immediately continue after executing the process. + .PARAMETER PassThru - Returns ExitCode, STDOut, and STDErr output from the process. + +Returns ExitCode, STDOut, and STDErr output from the process. + +.PARAMETER IgnoreExitCodes + +List the exit codes to ignore or * to ignore all exit codes. + +.PARAMETER PriorityClass + +Specifies priority class for the process. Options: Idle, Normal, High, AboveNormal, BelowNormal, RealTime. Default: Normal + +.PARAMETER ExitOnProcessFailure + +Specifies whether the function should call Exit-Script when the process returns an exit code that is considered an error/failure. Default: $true + +.PARAMETER RepairFromSource + +Specifies whether we should repair from source. Also rewrites local cache. Default: $false + .PARAMETER ContinueOnError - Continue if an exit code is returned by msiexec that is not recognized by the App Deploy Toolkit. Default is: $false. + +Continue if an error occurred while trying to start the process. Default: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns a PSObject with the results of the installation +- ExitCode +- STDOut +- STDErr + .EXAMPLE - Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' - Installs an MSI + +Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' + +Installs an MSI + .EXAMPLE - Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -Transform 'Adobe_FlashPlayer_11.2.202.233_x64_EN_01.mst' -Parameters '/QN' - Installs an MSI, applying a transform and overriding the default MSI toolkit parameters + +Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -Transform 'Adobe_FlashPlayer_11.2.202.233_x64_EN_01.mst' -Parameters '/QN' + +Installs an MSI, applying a transform and overriding the default MSI toolkit parameters + .EXAMPLE - [psobject]$ExecuteMSIResult = Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -PassThru - Installs an MSI and stores the result of the execution into a variable by using the -PassThru option + +[PSObject]$ExecuteMSIResult = Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -PassThru + +Installs an MSI and stores the result of the execution into a variable by using the -PassThru option + .EXAMPLE - Execute-MSI -Action 'Uninstall' -Path '{26923b43-4d38-484f-9b9e-de460746276c}' - Uninstalls an MSI using a product code + +Execute-MSI -Action 'Uninstall' -Path '{26923b43-4d38-484f-9b9e-de460746276c}' + +Uninstalls an MSI using a product code + .EXAMPLE - Execute-MSI -Action 'Patch' -Path 'Adobe_Reader_11.0.3_EN.msp' - Installs an MSP + +Execute-MSI -Action 'Patch' -Path 'Adobe_Reader_11.0.3_EN.msp' + +Installs an MSP + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateSet('Install','Uninstall','Patch','Repair','ActiveSetup')] - [string]$Action = 'Install', - [Parameter(Mandatory=$true,HelpMessage='Please enter either the path to the MSI/MSP file or the ProductCode')] - [ValidateScript({($_ -match $MSIProductCodeRegExPattern) -or ('.msi','.msp' -contains [IO.Path]::GetExtension($_))})] - [Alias('FilePath')] - [string]$Path, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Transform, - [Parameter(Mandatory=$false)] - [Alias('Arguments')] - [ValidateNotNullorEmpty()] - [string]$Parameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$AddParameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$SecureParameters = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Patch, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$LoggingOptions, - [Parameter(Mandatory=$false)] - [Alias('LogName')] - [string]$private:LogName, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$WorkingDirectory, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$SkipMSIAlreadyInstalledCheck = $false, - [Parameter(Mandatory=$false)] - [switch]$IncludeUpdatesAndHotfixes = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Initialize variable indicating whether $Path variable is a Product Code or not - [boolean]$PathIsProductCode = $false - - ## If the path matches a product code - If ($Path -match $MSIProductCodeRegExPattern) { - # Set variable indicating that $Path variable is a Product Code - [boolean]$PathIsProductCode = $true - - # Resolve the product code to a publisher, application name, and version - Write-Log -Message 'Resolve product code to a publisher, application name, and version.' -Source ${CmdletName} - - If ($IncludeUpdatesAndHotfixes) { - [psobject]$productCodeNameVersion = Get-InstalledApplication -ProductCode $path -IncludeUpdatesAndHotfixes | Select-Object -Property 'Publisher', 'DisplayName', 'DisplayVersion' -First 1 -ErrorAction 'SilentlyContinue' - } - Else { - [psobject]$productCodeNameVersion = Get-InstalledApplication -ProductCode $path | Select-Object -Property 'Publisher', 'DisplayName', 'DisplayVersion' -First 1 -ErrorAction 'SilentlyContinue' - } - - # Build the log file name - If (-not $logName) { - If ($productCodeNameVersion) { - If ($productCodeNameVersion.Publisher) { - $logName = ($productCodeNameVersion.Publisher + '_' + $productCodeNameVersion.DisplayName + '_' + $productCodeNameVersion.DisplayVersion) -replace "[$invalidFileNameChars]",'' -replace ' ','' - } - Else { - $logName = ($productCodeNameVersion.DisplayName + '_' + $productCodeNameVersion.DisplayVersion) -replace "[$invalidFileNameChars]",'' -replace ' ','' - } - } - Else { - # Out of other options, make the Product Code the name of the log file - $logName = $Path - } - } - } - Else { - # Get the log file name without file extension - If (-not $logName) { $logName = ([IO.FileInfo]$path).BaseName } ElseIf ('.log','.txt' -contains [IO.Path]::GetExtension($logName)) { $logName = [IO.Path]::GetFileNameWithoutExtension($logName) } - } - - If ($configToolkitCompressLogs) { - ## Build the log file path - [string]$logPath = Join-Path -Path $logTempFolder -ChildPath $logName - } - Else { - ## Create the Log directory if it doesn't already exist - If (-not (Test-Path -LiteralPath $configMSILogDir -PathType 'Container' -ErrorAction 'SilentlyContinue')) { - $null = New-Item -Path $configMSILogDir -ItemType 'Directory' -ErrorAction 'SilentlyContinue' - } - ## Build the log file path - [string]$logPath = Join-Path -Path $configMSILogDir -ChildPath $logName - } - - ## Set the installation Parameters - If ($deployModeSilent) { - $msiInstallDefaultParams = $configMSISilentParams - $msiUninstallDefaultParams = $configMSISilentParams - } - Else { - $msiInstallDefaultParams = $configMSIInstallParams - $msiUninstallDefaultParams = $configMSIUninstallParams - } - - ## Build the MSI Parameters - Switch ($action) { - 'Install' { $option = '/i'; [string]$msiLogFile = "$logPath" + '_Install'; $msiDefaultParams = $msiInstallDefaultParams } - 'Uninstall' { $option = '/x'; [string]$msiLogFile = "$logPath" + '_Uninstall'; $msiDefaultParams = $msiUninstallDefaultParams } - 'Patch' { $option = '/update'; [string]$msiLogFile = "$logPath" + '_Patch'; $msiDefaultParams = $msiInstallDefaultParams } - 'Repair' { $option = '/f'; [string]$msiLogFile = "$logPath" + '_Repair'; $msiDefaultParams = $msiInstallDefaultParams } - 'ActiveSetup' { $option = '/fups'; [string]$msiLogFile = "$logPath" + '_ActiveSetup' } - } - - ## Append ".log" to the MSI logfile path and enclose in quotes - If ([IO.Path]::GetExtension($msiLogFile) -ne '.log') { - [string]$msiLogFile = $msiLogFile + '.log' - [string]$msiLogFile = "`"$msiLogFile`"" - } - - ## If the MSI is in the Files directory, set the full path to the MSI - If (Test-Path -LiteralPath (Join-Path -Path $dirFiles -ChildPath $path -ErrorAction 'SilentlyContinue') -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { - [string]$msiFile = Join-Path -Path $dirFiles -ChildPath $path - } - ElseIf (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') { - [string]$msiFile = (Get-Item -LiteralPath $Path).FullName - } - ElseIf ($PathIsProductCode) { - [string]$msiFile = $Path - } - Else { - Write-Log -Message "Failed to find MSI file [$path]." -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to find MSI file [$path]." - } - Continue - } - - ## Set the working directory of the MSI - If ((-not $PathIsProductCode) -and (-not $workingDirectory)) { [string]$workingDirectory = Split-Path -Path $msiFile -Parent } - - ## Enumerate all transforms specified, qualify the full path if possible and enclose in quotes - If ($transform) { - [string[]]$transforms = $transform -split ',' - 0..($transforms.Length - 1) | ForEach-Object { - If (Test-Path -LiteralPath (Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $transforms[$_]) -PathType 'Leaf') { - $transforms[$_] = Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $transforms[$_].Replace('.\','') - } - Else { - $transforms[$_] = $transforms[$_] - } - } - [string]$mstFile = "`"$($transforms -join ';')`"" - } - - ## Enumerate all patches specified, qualify the full path if possible and enclose in quotes - If ($patch) { - [string[]]$patches = $patch -split ',' - 0..($patches.Length - 1) | ForEach-Object { - If (Test-Path -LiteralPath (Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $patches[$_]) -PathType 'Leaf') { - $patches[$_] = Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $patches[$_].Replace('.\','') - } - Else { - $patches[$_] = $patches[$_] - } - } - [string]$mspFile = "`"$($patches -join ';')`"" - } - - ## Get the ProductCode of the MSI - If ($PathIsProductCode) { - [string]$MSIProductCode = $path - } - ElseIf ([IO.Path]::GetExtension($msiFile) -eq '.msi') { - Try { - [hashtable]$GetMsiTablePropertySplat = @{ Path = $msiFile; Table = 'Property'; ContinueOnError = $false } - If ($transforms) { $GetMsiTablePropertySplat.Add( 'TransformPath', $transforms ) } - [string]$MSIProductCode = Get-MsiTableProperty @GetMsiTablePropertySplat | Select-Object -ExpandProperty 'ProductCode' -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to get the ProductCode from the MSI file. Continue with requested action [$Action]..." -Source ${CmdletName} - } - } - - ## Enclose the MSI file in quotes to avoid issues with spaces when running msiexec - [string]$msiFile = "`"$msiFile`"" - - ## Start building the MsiExec command line starting with the base action and file - [string]$argsMSI = "$option $msiFile" - # Add MST - If ($transform) { $argsMSI = "$argsMSI TRANSFORMS=$mstFile TRANSFORMSSECURE=1" } - # Add MSP - If ($patch) { $argsMSI = "$argsMSI PATCH=$mspFile" } - # Replace default parameters if specified. - If ($Parameters) { $argsMSI = "$argsMSI $Parameters" } Else { $argsMSI = "$argsMSI $msiDefaultParams" } - # Append parameters to default parameters if specified. - If ($AddParameters) { $argsMSI = "$argsMSI $AddParameters" } - # Add custom Logging Options if specified, otherwise, add default Logging Options from Config file - If ($LoggingOptions) { $argsMSI = "$argsMSI $LoggingOptions $msiLogFile" } Else { $argsMSI = "$argsMSI $configMSILoggingOptions $msiLogFile" } - - ## Check if the MSI is already installed. If no valid ProductCode to check, then continue with requested MSI action. - If ($MSIProductCode) { - If ($SkipMSIAlreadyInstalledCheck) { - [boolean]$IsMsiInstalled = $false - } - Else { - If ($IncludeUpdatesAndHotfixes) { - [psobject]$MsiInstalled = Get-InstalledApplication -ProductCode $MSIProductCode -IncludeUpdatesAndHotfixes - } - Else { - [psobject]$MsiInstalled = Get-InstalledApplication -ProductCode $MSIProductCode - } - If ($MsiInstalled) { [boolean]$IsMsiInstalled = $true } - } - } - Else { - If ($Action -eq 'Install') { [boolean]$IsMsiInstalled = $false } Else { [boolean]$IsMsiInstalled = $true } - } - - If (($IsMsiInstalled) -and ($Action -eq 'Install')) { - Write-Log -Message "The MSI is already installed on this system. Skipping action [$Action]..." -Source ${CmdletName} - } - ElseIf (((-not $IsMsiInstalled) -and ($Action -eq 'Install')) -or ($IsMsiInstalled)) { - Write-Log -Message "Executing MSI action [$Action]..." -Source ${CmdletName} - # Build the hashtable with the options that will be passed to Execute-Process using splatting - [hashtable]$ExecuteProcessSplat = @{ Path = $exeMsiexec - Parameters = $argsMSI - WindowStyle = 'Normal' } - If ($WorkingDirectory) { $ExecuteProcessSplat.Add( 'WorkingDirectory', $WorkingDirectory) } - If ($ContinueOnError) { $ExecuteProcessSplat.Add( 'ContinueOnError', $ContinueOnError) } - If ($SecureParameters) { $ExecuteProcessSplat.Add( 'SecureParameters', $SecureParameters) } - If ($PassThru) { $ExecuteProcessSplat.Add( 'PassThru', $PassThru) } - # Call the Execute-Process function - If ($PassThru) { - [psobject]$ExecuteResults = Execute-Process @ExecuteProcessSplat - } - Else { - Execute-Process @ExecuteProcessSplat - } - # Refresh environment variables for Windows Explorer process as Windows does not consistently update environment variables created by MSIs - Update-Desktop - } - Else { - Write-Log -Message "The MSI is not installed on this system. Skipping action [$Action]..." -Source ${CmdletName} - } - } - End { - If ($PassThru) { Write-Output -InputObject $ExecuteResults } - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateSet('Install', 'Uninstall', 'Patch', 'Repair', 'ActiveSetup')] + [String]$Action = 'Install', + [Parameter(Mandatory = $true, HelpMessage = 'Please enter either the path to the MSI/MSP file or the ProductCode')] + [ValidateScript({ ($_ -match $MSIProductCodeRegExPattern) -or ('.msi', '.msp' -contains [IO.Path]::GetExtension($_)) })] + [Alias('FilePath')] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Transform, + [Parameter(Mandatory = $false)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [String]$Parameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$AddParameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$SecureParameters = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Patch, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$LoggingOptions, + [Parameter(Mandatory = $false)] + [Alias('LogName')] + [String]$private:LogName, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$SkipMSIAlreadyInstalledCheck = $false, + [Parameter(Mandatory = $false)] + [Switch]$IncludeUpdatesAndHotfixes = $false, + [Parameter(Mandatory = $false)] + [Switch]$NoWait = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IgnoreExitCodes, + [Parameter(Mandatory = $false)] + [ValidateSet('Idle', 'Normal', 'High', 'AboveNormal', 'BelowNormal', 'RealTime')] + [Diagnostics.ProcessPriorityClass]$PriorityClass = 'Normal', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ExitOnProcessFailure = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$RepairFromSource = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Initialize variable indicating whether $Path variable is a Product Code or not + [Boolean]$PathIsProductCode = $false + + ## If the path matches a product code + If ($Path -match $MSIProductCodeRegExPattern) { + # Set variable indicating that $Path variable is a Product Code + [Boolean]$PathIsProductCode = $true + + # Resolve the product code to a publisher, application name, and version + Write-Log -Message 'Resolving product code to a publisher, application name, and version.' -Source ${CmdletName} + + If ($IncludeUpdatesAndHotfixes) { + [PSObject]$productCodeNameVersion = Get-InstalledApplication -ProductCode $path -IncludeUpdatesAndHotfixes | Select-Object -Property 'Publisher', 'DisplayName', 'DisplayVersion' -First 1 -ErrorAction 'SilentlyContinue' + } + Else { + [PSObject]$productCodeNameVersion = Get-InstalledApplication -ProductCode $path | Select-Object -Property 'Publisher', 'DisplayName', 'DisplayVersion' -First 1 -ErrorAction 'SilentlyContinue' + } + + # Build the log file name + If (-not $logName) { + If ($productCodeNameVersion) { + If ($productCodeNameVersion.Publisher) { + $logName = (Remove-InvalidFileNameChars -Name ($productCodeNameVersion.Publisher + '_' + $productCodeNameVersion.DisplayName + '_' + $productCodeNameVersion.DisplayVersion)) -replace ' ', '' + } + Else { + $logName = (Remove-InvalidFileNameChars -Name ($productCodeNameVersion.DisplayName + '_' + $productCodeNameVersion.DisplayVersion)) -replace ' ', '' + } + } + Else { + # Out of other options, make the Product Code the name of the log file + $logName = $Path + } + } + } + Else { + # Get the log file name without file extension + If (-not $logName) { + $logName = ([IO.FileInfo]$path).BaseName + } + ElseIf ('.log', '.txt' -contains [IO.Path]::GetExtension($logName)) { + $logName = [IO.Path]::GetFileNameWithoutExtension($logName) + } + } + + If ($configToolkitCompressLogs) { + ## Build the log file path + [String]$logPath = Join-Path -Path $logTempFolder -ChildPath $logName + } + Else { + ## Create the Log directory if it doesn't already exist + If (-not (Test-Path -LiteralPath $configMSILogDir -PathType 'Container' -ErrorAction 'SilentlyContinue')) { + $null = New-Item -Path $configMSILogDir -ItemType 'Directory' -ErrorAction 'SilentlyContinue' + } + ## Build the log file path + [String]$logPath = Join-Path -Path $configMSILogDir -ChildPath $logName + } + + ## Set the installation Parameters + If ($deployModeSilent) { + $msiInstallDefaultParams = $configMSISilentParams + $msiUninstallDefaultParams = $configMSISilentParams + } + Else { + $msiInstallDefaultParams = $configMSIInstallParams + $msiUninstallDefaultParams = $configMSIUninstallParams + } + + ## Build the MSI Parameters + Switch ($action) { + 'Install' { + $option = '/i'; [String]$msiLogFile = "$logPath" + '_Install'; $msiDefaultParams = $msiInstallDefaultParams + } + 'Uninstall' { + $option = '/x'; [String]$msiLogFile = "$logPath" + '_Uninstall'; $msiDefaultParams = $msiUninstallDefaultParams + } + 'Patch' { + $option = '/update'; [String]$msiLogFile = "$logPath" + '_Patch'; $msiDefaultParams = $msiInstallDefaultParams + } + 'Repair' { + $option = '/f'; If ($RepairFromSource) { + $option += 'vomus' + } [String]$msiLogFile = "$logPath" + '_Repair'; $msiDefaultParams = $msiInstallDefaultParams + } + 'ActiveSetup' { + $option = '/fups'; [String]$msiLogFile = "$logPath" + '_ActiveSetup' + } + } + + ## Append ".log" to the MSI logfile path and enclose in quotes + If ([IO.Path]::GetExtension($msiLogFile) -ne '.log') { + [String]$msiLogFile = $msiLogFile + '.log' + [String]$msiLogFile = "`"$msiLogFile`"" + } + + ## If the MSI is in the Files directory, set the full path to the MSI + If (Test-Path -LiteralPath (Join-Path -Path $dirFiles -ChildPath $path -ErrorAction 'SilentlyContinue') -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { + [String]$msiFile = Join-Path -Path $dirFiles -ChildPath $path + } + ElseIf (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') { + [String]$msiFile = (Get-Item -LiteralPath $Path).FullName + } + ElseIf ($PathIsProductCode) { + [String]$msiFile = $Path + } + Else { + Write-Log -Message "Failed to find MSI file [$path]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to find MSI file [$path]." + } + Continue + } + + ## Set the working directory of the MSI + If ((-not $PathIsProductCode) -and (-not $workingDirectory)) { + [String]$workingDirectory = Split-Path -Path $msiFile -Parent + } + + ## Enumerate all transforms specified, qualify the full path if possible and enclose in quotes + If ($transform) { + [String[]]$transforms = $transform -replace "`"", '' -split ';' + For ($i = 0; $i -lt $transforms.Length; $i++) { + [String]$FullPath = $null + [String]$FullPath = Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $transforms[$i].Replace('.\', '') + If ($FullPath -and (Test-Path -LiteralPath $FullPath -PathType 'Leaf')) { + $transforms[$i] = $FullPath + } + } + [String]$mstFile = "`"$($transforms -join ';')`"" + } + + ## Enumerate all patches specified, qualify the full path if possible and enclose in quotes + If ($patch) { + [String[]]$patches = $patch -replace "`"", '' -split ';' + For ($i = 0; $i -lt $patches.Length; $i++) { + [String]$FullPath = $null + [String]$FullPath = Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $patches[$i].Replace('.\', '') + If ($FullPath -and (Test-Path -LiteralPath $FullPath -PathType 'Leaf')) { + $patches[$i] = $FullPath + } + } + [String]$mspFile = "`"$($patches -join ';')`"" + } + + ## Get the ProductCode of the MSI + If ($PathIsProductCode) { + [String]$MSIProductCode = $path + } + ElseIf ([IO.Path]::GetExtension($msiFile) -eq '.msi') { + Try { + [Hashtable]$GetMsiTablePropertySplat = @{ Path = $msiFile; Table = 'Property'; ContinueOnError = $false } + If ($transforms) { + $GetMsiTablePropertySplat.Add( 'TransformPath', $transforms ) + } + [String]$MSIProductCode = Get-MsiTableProperty @GetMsiTablePropertySplat | Select-Object -ExpandProperty 'ProductCode' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to get the ProductCode from the MSI file. Continue with requested action [$Action]..." -Source ${CmdletName} + } + } + + ## Enclose the MSI file in quotes to avoid issues with spaces when running msiexec + [String]$msiFile = "`"$msiFile`"" + + ## Start building the MsiExec command line starting with the base action and file + [String]$argsMSI = "$option $msiFile" + # Add MST + If ($transform) { + $argsMSI = "$argsMSI TRANSFORMS=$mstFile TRANSFORMSSECURE=1" + } + # Add MSP + If ($patch) { + $argsMSI = "$argsMSI PATCH=$mspFile" + } + # Replace default parameters if specified. + If ($Parameters) { + $argsMSI = "$argsMSI $Parameters" + } + Else { + $argsMSI = "$argsMSI $msiDefaultParams" + } + # Add reinstallmode and reinstall variable for Patch + If ($action -eq 'Patch') { + $argsMSI += ' REINSTALLMODE=ecmus REINSTALL=ALL' + } + # Append parameters to default parameters if specified. + If ($AddParameters) { + $argsMSI = "$argsMSI $AddParameters" + } + # Add custom Logging Options if specified, otherwise, add default Logging Options from Config file + If ($LoggingOptions) { + $argsMSI = "$argsMSI $LoggingOptions $msiLogFile" + } + Else { + $argsMSI = "$argsMSI $configMSILoggingOptions $msiLogFile" + } + + ## Check if the MSI is already installed. If no valid ProductCode to check, then continue with requested MSI action. + If ($MSIProductCode) { + If ($SkipMSIAlreadyInstalledCheck) { + [Boolean]$IsMsiInstalled = $false + } + Else { + If ($IncludeUpdatesAndHotfixes) { + [PSObject]$MsiInstalled = Get-InstalledApplication -ProductCode $MSIProductCode -IncludeUpdatesAndHotfixes + } + Else { + [PSObject]$MsiInstalled = Get-InstalledApplication -ProductCode $MSIProductCode + } + If ($MsiInstalled) { + [Boolean]$IsMsiInstalled = $true + } + } + } + Else { + If ($Action -eq 'Install') { + [Boolean]$IsMsiInstalled = $false + } + Else { + [Boolean]$IsMsiInstalled = $true + } + } + + If (($IsMsiInstalled) -and ($Action -eq 'Install')) { + Write-Log -Message "The MSI is already installed on this system. Skipping action [$Action]..." -Source ${CmdletName} + [PSObject]$ExecuteResults = @{ ExitCode = 1638; StdOut = 0; StdErr = '' } + } + ElseIf (((-not $IsMsiInstalled) -and ($Action -eq 'Install')) -or ($IsMsiInstalled)) { + Write-Log -Message "Executing MSI action [$Action]..." -Source ${CmdletName} + # Build the hashtable with the options that will be passed to Execute-Process using splatting + [Hashtable]$ExecuteProcessSplat = @{ + Path = $exeMsiexec + Parameters = $argsMSI + WindowStyle = 'Normal' + ExitOnProcessFailure = $ExitOnProcessFailure + ContinueOnError = $ContinueOnError + } + If ($WorkingDirectory) { + $ExecuteProcessSplat.Add( 'WorkingDirectory', $WorkingDirectory) + } + If ($SecureParameters) { + $ExecuteProcessSplat.Add( 'SecureParameters', $SecureParameters) + } + If ($PassThru) { + $ExecuteProcessSplat.Add( 'PassThru', $PassThru) + } + If ($IgnoreExitCodes) { + $ExecuteProcessSplat.Add( 'IgnoreExitCodes', $IgnoreExitCodes) + } + If ($PriorityClass) { + $ExecuteProcessSplat.Add( 'PriorityClass', $PriorityClass) + } + If ($NoWait) { + $ExecuteProcessSplat.Add( 'NoWait', $NoWait) + } + + # Call the Execute-Process function + If ($PassThru) { + [PSObject]$ExecuteResults = Execute-Process @ExecuteProcessSplat + } + Else { + Execute-Process @ExecuteProcessSplat + } + # Refresh environment variables for Windows Explorer process as Windows does not consistently update environment variables created by MSIs + Update-Desktop + } + Else { + Write-Log -Message "The MSI is not installed on this system. Skipping action [$Action]..." -Source ${CmdletName} + } + } + End { + If ($PassThru) { + Write-Output -InputObject ($ExecuteResults) + } + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Remove-MSIApplications Function Remove-MSIApplications { -<# + <# .SYNOPSIS - Removes all MSI applications matching the specified application name. + +Removes all MSI applications matching the specified application name. + .DESCRIPTION - Removes all MSI applications matching the specified application name. - Enumerates the registry for installed applications matching the specified application name and uninstalls that application using the product code, provided the uninstall string matches "msiexec". + +Removes all MSI applications matching the specified application name. +Enumerates the registry for installed applications matching the specified application name and uninstalls that application using the product code, provided the uninstall string matches "msiexec". + .PARAMETER Name - The name of the application to uninstall. Performs a contains match on the application display name by default. + +The name of the application to uninstall. Performs a contains match on the application display name by default. + .PARAMETER Exact - Specifies that the named application must be matched using the exact name. + +Specifies that the named application must be matched using the exact name. + .PARAMETER WildCard - Specifies that the named application must be matched using a wildcard search. + +Specifies that the named application must be matched using a wildcard search. + .PARAMETER Parameters - Overrides the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". + +Overrides the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". + .PARAMETER AddParameters - Adds to the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". + +Adds to the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". + .PARAMETER FilterApplication - Two-dimensional array that contains one or more (property, value, match-type) sets that should be used to filter the list of results returned by Get-InstalledApplication to only those that should be uninstalled. - Properties that can be filtered upon: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication + +Two-dimensional array that contains one or more (property, value, match-type) sets that should be used to filter the list of results returned by Get-InstalledApplication to only those that should be uninstalled. +Properties that can be filtered upon: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication + .PARAMETER ExcludeFromUninstall - Two-dimensional array that contains one or more (property, value, match-type) sets that should be excluded from uninstall if found. - Properties that can be excluded: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication + +Two-dimensional array that contains one or more (property, value, match-type) sets that should be excluded from uninstall if found. +Properties that can be excluded: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication + .PARAMETER IncludeUpdatesAndHotfixes - Include matches against updates and hotfixes in results. + +Include matches against updates and hotfixes in results. + .PARAMETER LoggingOptions - Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". + +Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". + .PARAMETER LogName - Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. - For uninstallations, by default the product code is resolved to the DisplayName and version of the application. + +Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. +For uninstallations, by default the product code is resolved to the DisplayName and version of the application. + .PARAMETER PassThru - Returns ExitCode, STDOut, and STDErr output from the process. + +Returns ExitCode, STDOut, and STDErr output from the process. + .PARAMETER ContinueOnError - Continue if an exit code is returned by msiexec that is not recognized by the App Deploy Toolkit. Default is: $true. + +Continue if an error occured while trying to start the processes. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns an object with the following properties: +- ExitCode +- StdOut +- StdErr + .EXAMPLE - Remove-MSIApplications -Name 'Adobe Flash' - Removes all versions of software that match the name "Adobe Flash" + +Remove-MSIApplications -Name 'Adobe Flash' + +Removes all versions of software that match the name "Adobe Flash" + .EXAMPLE - Remove-MSIApplications -Name 'Adobe' - Removes all versions of software that match the name "Adobe" + +Remove-MSIApplications -Name 'Adobe' + +Removes all versions of software that match the name "Adobe" + .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication ('Is64BitApplication', $false, 'Exact'),('Publisher', 'Oracle Corporation', 'Exact') - Removes all versions of software that match the name "Java 8 Update" where the software is 32-bits and the publisher is "Oracle Corporation". + +Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication @( + @('Is64BitApplication', $false, 'Exact'), + @('Publisher', 'Oracle Corporation', 'Exact') + ) + +Removes all versions of software that match the name "Java 8 Update" where the software is 32-bits and the publisher is "Oracle Corporation". + .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication (,('Publisher', 'Oracle Corporation', 'Exact')) -ExcludeFromUninstall (,('DisplayName', 'Java 8 Update 45', 'Contains')) - Removes all versions of software that match the name "Java 8 Update" and also have "Oracle Corporation" as the Publisher; however, it does not uninstall "Java 8 Update 45" of the software. - NOTE: if only specifying a single row in the two-dimensional arrays, the array must have the extra parentheses and leading comma as in this example. + +Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication @(, @('Publisher', 'Oracle Corporation', 'Exact')) -ExcludeFromUninstall @(, @('DisplayName', 'Java 8 Update 45', 'Contains')) + +Removes all versions of software that match the name "Java 8 Update" and also have "Oracle Corporation" as the Publisher; however, it does not uninstall "Java 8 Update 45" of the software. +NOTE: If only specifying a single row in the two-dimensional arrays, the array must have the extra parentheses and leading comma as in this example. + .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall (,('DisplayName', 'Java 8 Update 45', 'Contains')) - Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall "Java 8 Update 45" of the software. - NOTE: if only specifying a single row in the two-dimensional array, the array must have the extra parentheses and leading comma as in this example. + +Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall @(, @('DisplayName', 'Java 8 Update 45', 'Contains')) + +Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall "Java 8 Update 45" of the software. +NOTE: If only specifying a single row in the two-dimensional array, the array must have the extra parentheses and leading comma as in this example. + .EXAMPLE - Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall - ('Is64BitApplication', $true, 'Exact'), - ('DisplayName', 'Java 8 Update 45', 'Exact'), - ('DisplayName', 'Java 8 Update 4*', 'WildCard'), - ('DisplayName', 'Java \d Update \d{3}', 'RegEx'), - ('DisplayName', 'Java 8 Update', 'Contains') - Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall 64-bit versions of the software, Update 45 of the software, or any Update that starts with 4. + +Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall @( + @('Is64BitApplication', $true, 'Exact'), + @('DisplayName', 'Java 8 Update 45', 'Exact'), + @('DisplayName', 'Java 8 Update 4*', 'WildCard'), + @('DisplayName', 'Java \d Update \d{3}', 'RegEx'), + @('DisplayName', 'Java 8 Update', 'Contains')) + +Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall 64-bit versions of the software, Update 45 of the software, or any Update that starts with 4. + .NOTES - More reading on how to create arrays if having trouble with -FilterApplication or -ExcludeFromUninstall parameter: http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx + +More reading on how to create arrays if having trouble with -FilterApplication or -ExcludeFromUninstall parameter: http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [switch]$Exact = $false, - [Parameter(Mandatory=$false)] - [switch]$WildCard = $false, - [Parameter(Mandatory=$false)] - [Alias('Arguments')] - [ValidateNotNullorEmpty()] - [string]$Parameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$AddParameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [array]$FilterApplication = @(@()), - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [array]$ExcludeFromUninstall = @(@()), - [Parameter(Mandatory=$false)] - [switch]$IncludeUpdatesAndHotfixes = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$LoggingOptions, - [Parameter(Mandatory=$false)] - [Alias('LogName')] - [string]$private:LogName, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Build the hashtable with the options that will be passed to Get-InstalledApplication using splatting - [hashtable]$GetInstalledApplicationSplat = @{ Name = $name } - If ($Exact) { $GetInstalledApplicationSplat.Add( 'Exact', $Exact) } - ElseIf ($WildCard) { $GetInstalledApplicationSplat.Add( 'WildCard', $WildCard) } - If ($IncludeUpdatesAndHotfixes) { $GetInstalledApplicationSplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) } - - [psobject[]]$installedApplications = Get-InstalledApplication @GetInstalledApplicationSplat - - Write-Log -Message "Found [$($installedApplications.Count)] application(s) that matched the specified criteria [$Name]." -Source ${CmdletName} - - ## Filter the results from Get-InstalledApplication - [Collections.ArrayList]$removeMSIApplications = New-Object -TypeName 'System.Collections.ArrayList' - If (($null -ne $installedApplications) -and ($installedApplications.Count)) { - ForEach ($installedApplication in $installedApplications) { - If ($installedApplication.UninstallString -notmatch 'msiexec') { - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName)] because uninstall string [$($installedApplication.UninstallString)] does not match `"msiexec`"." -Severity 2 -Source ${CmdletName} - Continue - } - If ([string]::IsNullOrEmpty($installedApplication.ProductCode)) { - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName)] because unable to discover MSI ProductCode from application's registry Uninstall subkey [$($installedApplication.UninstallSubkey)]." -Severity 2 -Source ${CmdletName} - Continue - } - - # Filter the results from Get-InstalledApplication to only those that should be uninstalled - If (($null -ne $FilterApplication) -and ($FilterApplication.Count)) { - Write-Log -Message "Filter the results to only those that should be uninstalled as specified in parameter [-FilterApplication]." -Source ${CmdletName} - [boolean]$addAppToRemoveList = $false - ForEach ($Filter in $FilterApplication) { - If ($Filter[2] -eq 'RegEx') { - If ($installedApplication.($Filter[0]) -match $Filter[1]) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - ElseIf ($Filter[2] -eq 'Contains') { - If ($installedApplication.($Filter[0]) -match [regex]::Escape($Filter[1])) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - ElseIf ($Filter[2] -eq 'WildCard') { - If ($installedApplication.($Filter[0]) -like $Filter[1]) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - ElseIf ($Filter[2] -eq 'Exact') { - If ($installedApplication.($Filter[0]) -eq $Filter[1]) { - [boolean]$addAppToRemoveList = $true - Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-FilterApplication] criteria." -Source ${CmdletName} - } - } - } - } - Else { - [boolean]$addAppToRemoveList = $true - } - - # Filter the results from Get-InstalledApplication to remove those that should never be uninstalled - If (($null -ne $ExcludeFromUninstall) -and ($ExcludeFromUninstall.Count)) { - ForEach ($Exclude in $ExcludeFromUninstall) { - If ($Exclude[2] -eq 'RegEx') { - If ($installedApplication.($Exclude[0]) -match $Exclude[1]) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - ElseIf ($Exclude[2] -eq 'Contains') { - If ($installedApplication.($Exclude[0]) -match [regex]::Escape($Exclude[1])) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - ElseIf ($Exclude[2] -eq 'WildCard') { - If ($installedApplication.($Exclude[0]) -like $Exclude[1]) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - ElseIf ($Exclude[2] -eq 'Exact') { - If ($installedApplication.($Exclude[0]) -eq $Exclude[1]) { - [boolean]$addAppToRemoveList = $false - Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} - } - } - } - } - - If ($addAppToRemoveList) { - Write-Log -Message "Adding application to list for removal: [$($installedApplication.DisplayName) $($installedApplication.Version)]." -Source ${CmdletName} - $removeMSIApplications.Add($installedApplication) - } - } - } - - ## Build the hashtable with the options that will be passed to Execute-MSI using splatting - [hashtable]$ExecuteMSISplat = @{ Action = 'Uninstall'; Path = '' } - If ($ContinueOnError) { $ExecuteMSISplat.Add( 'ContinueOnError', $ContinueOnError) } - If ($Parameters) { $ExecuteMSISplat.Add( 'Parameters', $Parameters) } - ElseIf ($AddParameters) { $ExecuteMSISplat.Add( 'AddParameters', $AddParameters) } - If ($LoggingOptions) { $ExecuteMSISplat.Add( 'LoggingOptions', $LoggingOptions) } - If ($LogName) { $ExecuteMSISplat.Add( 'LogName', $LogName) } - If ($PassThru) { $ExecuteMSISplat.Add( 'PassThru', $PassThru) } - If ($IncludeUpdatesAndHotfixes) { $ExecuteMSISplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) } - - If (($null -ne $removeMSIApplications) -and ($removeMSIApplications.Count)) { - ForEach ($removeMSIApplication in $removeMSIApplications) { - Write-Log -Message "Remove application [$($removeMSIApplication.DisplayName) $($removeMSIApplication.Version)]." -Source ${CmdletName} - $ExecuteMSISplat.Path = $removeMSIApplication.ProductCode - If ($PassThru) { - [psobject[]]$ExecuteResults += Execute-MSI @ExecuteMSISplat - } - Else { - Execute-MSI @ExecuteMSISplat - } - } - } - Else { - Write-Log -Message 'No applications found for removal. Continue...' -Source ${CmdletName} - } - } - End { - If ($PassThru) { Write-Output -InputObject $ExecuteResults } - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [Switch]$Exact = $false, + [Parameter(Mandatory = $false)] + [Switch]$WildCard = $false, + [Parameter(Mandatory = $false)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [String]$Parameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$AddParameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Array]$FilterApplication = @(@()), + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Array]$ExcludeFromUninstall = @(@()), + [Parameter(Mandatory = $false)] + [Switch]$IncludeUpdatesAndHotfixes = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$LoggingOptions, + [Parameter(Mandatory = $false)] + [Alias('LogName')] + [String]$private:LogName, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Build the hashtable with the options that will be passed to Get-InstalledApplication using splatting + [Hashtable]$GetInstalledApplicationSplat = @{ Name = $name } + If ($Exact) { + $GetInstalledApplicationSplat.Add( 'Exact', $Exact) + } + ElseIf ($WildCard) { + $GetInstalledApplicationSplat.Add( 'WildCard', $WildCard) + } + If ($IncludeUpdatesAndHotfixes) { + $GetInstalledApplicationSplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) + } + + [PSObject[]]$installedApplications = Get-InstalledApplication @GetInstalledApplicationSplat + + Write-Log -Message "Found [$($installedApplications.Count)] application(s) that matched the specified criteria [$Name]." -Source ${CmdletName} + + ## Filter the results from Get-InstalledApplication + [Collections.ArrayList]$removeMSIApplications = New-Object -TypeName 'System.Collections.ArrayList' + If (($null -ne $installedApplications) -and ($installedApplications.Count)) { + ForEach ($installedApplication in $installedApplications) { + If ([String]::IsNullOrEmpty($installedApplication.ProductCode)) { + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName)] because unable to discover MSI ProductCode from application's registry Uninstall subkey [$($installedApplication.UninstallSubkey)]." -Severity 2 -Source ${CmdletName} + Continue + } + + # Filter the results from Get-InstalledApplication to only those that should be uninstalled + [Boolean]$addAppToRemoveList = $true + If (($null -ne $FilterApplication) -and ($FilterApplication.Count)) { + Write-Log -Message 'Filter the results to only those that should be uninstalled as specified in parameter [-FilterApplication].' -Source ${CmdletName} + ForEach ($Filter in $FilterApplication) { + If ($Filter[2] -eq 'RegEx') { + If ($installedApplication.($Filter[0]) -match $Filter[1]) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + ElseIf ($Filter[2] -eq 'Contains') { + If ($installedApplication.($Filter[0]) -match [RegEx]::Escape($Filter[1])) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + ElseIf ($Filter[2] -eq 'WildCard') { + If ($installedApplication.($Filter[0]) -like $Filter[1]) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + ElseIf ($Filter[2] -eq 'Exact') { + If ($installedApplication.($Filter[0]) -eq $Filter[1]) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + } + } + + # Filter the results from Get-InstalledApplication to remove those that should never be uninstalled + If (($null -ne $ExcludeFromUninstall) -and ($ExcludeFromUninstall.Count)) { + ForEach ($Exclude in $ExcludeFromUninstall) { + If ($Exclude[2] -eq 'RegEx') { + If ($installedApplication.($Exclude[0]) -match $Exclude[1]) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + ElseIf ($Exclude[2] -eq 'Contains') { + If ($installedApplication.($Exclude[0]) -match [RegEx]::Escape($Exclude[1])) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + ElseIf ($Exclude[2] -eq 'WildCard') { + If ($installedApplication.($Exclude[0]) -like $Exclude[1]) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + ElseIf ($Exclude[2] -eq 'Exact') { + If ($installedApplication.($Exclude[0]) -eq $Exclude[1]) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + } + } + + If ($addAppToRemoveList) { + Write-Log -Message "Adding application to list for removal: [$($installedApplication.DisplayName) $($installedApplication.Version)]." -Source ${CmdletName} + $removeMSIApplications.Add($installedApplication) + } + } + } + + ## Build the hashtable with the options that will be passed to Execute-MSI using splatting + [Hashtable]$ExecuteMSISplat = @{ + Action = 'Uninstall' + Path = '' + ContinueOnError = $ContinueOnError + } + If ($Parameters) { + $ExecuteMSISplat.Add( 'Parameters', $Parameters) + } + ElseIf ($AddParameters) { + $ExecuteMSISplat.Add( 'AddParameters', $AddParameters) + } + If ($LoggingOptions) { + $ExecuteMSISplat.Add( 'LoggingOptions', $LoggingOptions) + } + If ($LogName) { + $ExecuteMSISplat.Add( 'LogName', $LogName) + } + If ($PassThru) { + $ExecuteMSISplat.Add( 'PassThru', $PassThru) + } + If ($IncludeUpdatesAndHotfixes) { + $ExecuteMSISplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) + } + + If (($null -ne $removeMSIApplications) -and ($removeMSIApplications.Count)) { + ForEach ($removeMSIApplication in $removeMSIApplications) { + Write-Log -Message "Removing application [$($removeMSIApplication.DisplayName) $($removeMSIApplication.Version)]." -Source ${CmdletName} + $ExecuteMSISplat.Path = $removeMSIApplication.ProductCode + If ($PassThru) { + [PSObject[]]$ExecuteResults += Execute-MSI @ExecuteMSISplat + } + Else { + Execute-MSI @ExecuteMSISplat + } + } + } + Else { + Write-Log -Message 'No applications found for removal. Continue...' -Source ${CmdletName} + } + } + End { + If ($PassThru) { + Write-Output -InputObject ($ExecuteResults) + } + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Execute-Process Function Execute-Process { -<# + <# .SYNOPSIS - Execute a process with optional arguments, working directory, window style. + +Execute a process with optional arguments, working directory, window style. + .DESCRIPTION - Executes a process, e.g. a file included in the Files directory of the App Deploy Toolkit, or a file on the local machine. - Provides various options for handling the return codes (see Parameters). + +Executes a process, e.g. a file included in the Files directory of the App Deploy Toolkit, or a file on the local machine. +Provides various options for handling the return codes (see Parameters). + .PARAMETER Path - Path to the file to be executed. If the file is located directly in the "Files" directory of the App Deploy Toolkit, only the file name needs to be specified. - Otherwise, the full path of the file must be specified. If the files is in a subdirectory of "Files", use the "$dirFiles" variable as shown in the example. + +Path to the file to be executed. If the file is located directly in the "Files" directory of the App Deploy Toolkit, only the file name needs to be specified. +Otherwise, the full path of the file must be specified. If the files is in a subdirectory of "Files", use the "$dirFiles" variable as shown in the example. + .PARAMETER Parameters - Arguments to be passed to the executable + +Arguments to be passed to the executable + .PARAMETER SecureParameters - Hides all parameters passed to the executable from the Toolkit log file + +Hides all parameters passed to the executable from the Toolkit log file + .PARAMETER WindowStyle - Style of the window of the process executed. Options: Normal, Hidden, Maximized, Minimized. Default: Normal. - Note: Not all processes honor the "Hidden" flag. If it it not working, then check the command line options for the process being executed to see it has a silent option. + +Style of the window of the process executed. Options: Normal, Hidden, Maximized, Minimized. Default: Normal. +Note: Not all processes honor WindowStyle. WindowStyle is a recommendation passed to the process. They can choose to ignore it. +Only works for native Windows GUI applications. If the WindowStyle is set to Hidden, UseShellExecute should be set to $true. + .PARAMETER CreateNoWindow - Specifies whether the process should be started with a new window to contain it. Default is false. + +Specifies whether the process should be started with a new window to contain it. Only works for Console mode applications. UseShellExecute should be set to $false. +Default is false. + .PARAMETER WorkingDirectory - The working directory used for executing the process. Defaults to the directory of the file being executed. + +The working directory used for executing the process. Defaults to the directory of the file being executed. +Parameter UseShellExecute affects this parameter. + .PARAMETER NoWait - Immediately continue after executing the process. + +Immediately continue after executing the process. + .PARAMETER PassThru - Returns ExitCode, STDOut, and STDErr output from the process. + +If NoWait is not specified, returns an object with ExitCode, STDOut and STDErr output from the process. If NoWait is specified, returns an object with Id, Handle and ProcessName. + .PARAMETER WaitForMsiExec - Sometimes an EXE bootstrapper will launch an MSI install. In such cases, this variable will ensure that - this function waits for the msiexec engine to become available before starting the install. + +Sometimes an EXE bootstrapper will launch an MSI install. In such cases, this variable will ensure that +this function waits for the msiexec engine to become available before starting the install. + .PARAMETER MsiExecWaitTime - Specify the length of time in seconds to wait for the msiexec engine to become available. Default: 600 seconds (10 minutes). + +Specify the length of time in seconds to wait for the msiexec engine to become available. Default: 600 seconds (10 minutes). + .PARAMETER IgnoreExitCodes - List the exit codes to ignore. + +List the exit codes to ignore or * to ignore all exit codes. + +.PARAMETER PriorityClass + +Specifies priority class for the process. Options: Idle, Normal, High, AboveNormal, BelowNormal, RealTime. Default: Normal + +.PARAMETER ExitOnProcessFailure + +Specifies whether the function should call Exit-Script when the process returns an exit code that is considered an error/failure. Default: $true + +.PARAMETER UseShellExecute + +Specifies whether to use the operating system shell to start the process. $true if the shell should be used when starting the process; $false if the process should be created directly from the executable file. + +The word "Shell" in this context refers to a graphical shell (similar to the Windows shell) rather than command shells (for example, bash or sh) and lets users launch graphical applications or open documents. +It lets you open a file or a url and the Shell will figure out the program to open it with. +The WorkingDirectory property behaves differently depending on the value of the UseShellExecute property. When UseShellExecute is true, the WorkingDirectory property specifies the location of the executable. +When UseShellExecute is false, the WorkingDirectory property is not used to find the executable. Instead, it is used only by the process that is started and has meaning only within the context of the new process. +If you set UseShellExecute to $true, there will be no available output from the process. + +Default: $false + .PARAMETER ContinueOnError - Continue if an exit code is returned by the process that is not recognized by the App Deploy Toolkit. Default: $false. + +Continue if an error occured while trying to start the process. Default: $false. + .EXAMPLE - Execute-Process -Path 'uninstall_flash_player_64bit.exe' -Parameters '/uninstall' -WindowStyle 'Hidden' - If the file is in the "Files" directory of the App Deploy Toolkit, only the file name needs to be specified. + +Execute-Process -Path 'uninstall_flash_player_64bit.exe' -Parameters '/uninstall' -WindowStyle 'Hidden' + +If the file is in the "Files" directory of the App Deploy Toolkit, only the file name needs to be specified. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Execute-Process -Path "$dirFiles\Bin\setup.exe" -Parameters '/S' -WindowStyle 'Hidden' + +Execute-Process -Path "$dirFiles\Bin\setup.exe" -Parameters '/S' -WindowStyle 'Hidden' + .EXAMPLE - Execute-Process -Path 'setup.exe' -Parameters '/S' -IgnoreExitCodes '1,2' + +Execute-Process -Path 'setup.exe' -Parameters '/S' -IgnoreExitCodes '1,2' + .EXAMPLE - Execute-Process -Path 'setup.exe' -Parameters "-s -f2`"$configToolkitLogDir\$installName.log`"" - Launch InstallShield "setup.exe" from the ".\Files" sub-directory and force log files to the logging folder. + +Execute-Process -Path 'setup.exe' -Parameters "-s -f2`"$configToolkitLogDir\$installName.log`"" + +Launch InstallShield "setup.exe" from the ".\Files" sub-directory and force log files to the logging folder. + .EXAMPLE - Execute-Process -Path 'setup.exe' -Parameters "/s /v`"ALLUSERS=1 /qn /L* \`"$configToolkitLogDir\$installName.log`"`"" - Launch InstallShield "setup.exe" with embedded MSI and force log files to the logging folder. + +Execute-Process -Path 'setup.exe' -Parameters "/s /v`"ALLUSERS=1 /qn /L* \`"$configToolkitLogDir\$installName.log`"`"" + +Launch InstallShield "setup.exe" with embedded MSI and force log files to the logging folder. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [Alias('FilePath')] - [ValidateNotNullorEmpty()] - [string]$Path, - [Parameter(Mandatory=$false)] - [Alias('Arguments')] - [ValidateNotNullorEmpty()] - [string[]]$Parameters, - [Parameter(Mandatory=$false)] - [switch]$SecureParameters = $false, - [Parameter(Mandatory=$false)] - [ValidateSet('Normal','Hidden','Maximized','Minimized')] - [Diagnostics.ProcessWindowStyle]$WindowStyle = 'Normal', - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$CreateNoWindow = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$WorkingDirectory, - [Parameter(Mandatory=$false)] - [switch]$NoWait = $false, - [Parameter(Mandatory=$false)] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false)] - [switch]$WaitForMsiExec = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [timespan]$MsiExecWaitTime = $(New-TimeSpan -Seconds $configMSIMutexWaitTime), - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$IgnoreExitCodes, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - $private:returnCode = $null - - ## Validate and find the fully qualified path for the $Path variable. - If (([IO.Path]::IsPathRooted($Path)) -and ([IO.Path]::HasExtension($Path))) { - Write-Log -Message "[$Path] is a valid fully qualified path, continue." -Source ${CmdletName} - If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { - Throw "File [$Path] not found." - } - } - Else { - # The first directory to search will be the 'Files' subdirectory of the script directory - [string]$PathFolders = $dirFiles - # Add the current location of the console (Windows always searches this location first) - [string]$PathFolders = $PathFolders + ';' + (Get-Location -PSProvider 'FileSystem').Path - # Add the new path locations to the PATH environment variable - $env:PATH = $PathFolders + ';' + $env:PATH - - # Get the fully qualified path for the file. Get-Command searches PATH environment variable to find this value. - [string]$FullyQualifiedPath = Get-Command -Name $Path -CommandType 'Application' -TotalCount 1 -Syntax -ErrorAction 'Stop' - - # Revert the PATH environment variable to it's original value - $env:PATH = $env:PATH -replace [regex]::Escape($PathFolders + ';'), '' - - If ($FullyQualifiedPath) { - Write-Log -Message "[$Path] successfully resolved to fully qualified path [$FullyQualifiedPath]." -Source ${CmdletName} - $Path = $FullyQualifiedPath - } - Else { - Throw "[$Path] contains an invalid path or file name." - } - } - - ## Set the Working directory (if not specified) - If (-not $WorkingDirectory) { $WorkingDirectory = Split-Path -Path $Path -Parent -ErrorAction 'Stop' } - - ## If MSI install, check to see if the MSI installer service is available or if another MSI install is already underway. - ## Please note that a race condition is possible after this check where another process waiting for the MSI installer - ## to become available grabs the MSI Installer mutex before we do. Not too concerned about this possible race condition. - If (($Path -match 'msiexec') -or ($WaitForMsiExec)) { - [boolean]$MsiExecAvailable = Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds $MsiExecWaitTime.TotalMilliseconds - Start-Sleep -Seconds 1 - If (-not $MsiExecAvailable) { - # Default MSI exit code for install already in progress - [int32]$returnCode = 1618 - Throw 'Please complete in progress MSI installation before proceeding with this install.' - } - } - - Try { - ## Disable Zone checking to prevent warnings when running executables - $env:SEE_MASK_NOZONECHECKS = 1 - - ## Using this variable allows capture of exceptions from .NET methods. Private scope only changes value for current function. - $private:previousErrorActionPreference = $ErrorActionPreference - $ErrorActionPreference = 'Stop' - - ## Define process - $processStartInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' -ErrorAction 'Stop' - $processStartInfo.FileName = $Path - $processStartInfo.WorkingDirectory = $WorkingDirectory - $processStartInfo.UseShellExecute = $false - $processStartInfo.ErrorDialog = $false - $processStartInfo.RedirectStandardOutput = $true - $processStartInfo.RedirectStandardError = $true - $processStartInfo.CreateNoWindow = $CreateNoWindow - If ($Parameters) { $processStartInfo.Arguments = $Parameters } - If ($windowStyle) { $processStartInfo.WindowStyle = $WindowStyle } - $process = New-Object -TypeName 'System.Diagnostics.Process' -ErrorAction 'Stop' - $process.StartInfo = $processStartInfo - - ## Add event handler to capture process's standard output redirection - [scriptblock]$processEventHandler = { If (-not [string]::IsNullOrEmpty($EventArgs.Data)) { $Event.MessageData.AppendLine($EventArgs.Data) } } - $stdOutBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList '' - $stdOutEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'OutputDataReceived' -MessageData $stdOutBuilder -ErrorAction 'Stop' - - ## Start Process - Write-Log -Message "Working Directory is [$WorkingDirectory]." -Source ${CmdletName} - If ($Parameters) { - If ($Parameters -match '-Command \&') { - Write-Log -Message "Executing [$Path [PowerShell ScriptBlock]]..." -Source ${CmdletName} - } - Else { - If ($SecureParameters) { - Write-Log -Message "Executing [$Path (Parameters Hidden)]..." -Source ${CmdletName} - } - Else { - Write-Log -Message "Executing [$Path $Parameters]..." -Source ${CmdletName} - } - } - } - Else { - Write-Log -Message "Executing [$Path]..." -Source ${CmdletName} - } - [boolean]$processStarted = $process.Start() - - If ($NoWait) { - Write-Log -Message 'NoWait parameter specified. Continuing without waiting for exit code...' -Source ${CmdletName} - } - Else { - $process.BeginOutputReadLine() - $stdErr = $($process.StandardError.ReadToEnd()).ToString() -replace $null,'' - - ## Instructs the Process component to wait indefinitely for the associated process to exit. - $process.WaitForExit() - - ## HasExited indicates that the associated process has terminated, either normally or abnormally. Wait until HasExited returns $true. - While (-not ($process.HasExited)) { $process.Refresh(); Start-Sleep -Seconds 1 } - - ## Get the exit code for the process - Try { - [int32]$returnCode = $process.ExitCode - } - Catch [System.Management.Automation.PSInvalidCastException] { - # Catch exit codes that are out of int32 range - [int32]$returnCode = 60013 - } - - ## Unregister standard output event to retrieve process output - If ($stdOutEvent) { Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'; $stdOutEvent = $null } - $stdOut = $stdOutBuilder.ToString() -replace $null,'' - - If ($stdErr.Length -gt 0) { - Write-Log -Message "Standard error output from the process: $stdErr" -Severity 3 -Source ${CmdletName} - } - } - } - Finally { - ## Make sure the standard output event is unregistered - If ($stdOutEvent) { Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'} - - ## Free resources associated with the process, this does not cause process to exit - If ($process) { $process.Close() } - - ## Re-enable Zone checking - Remove-Item -LiteralPath 'env:SEE_MASK_NOZONECHECKS' -ErrorAction 'SilentlyContinue' - - If ($private:previousErrorActionPreference) { $ErrorActionPreference = $private:previousErrorActionPreference } - } - - If (-not $NoWait) { - ## Check to see whether we should ignore exit codes - $ignoreExitCodeMatch = $false - If ($ignoreExitCodes) { - # Split the processes on a comma - [int32[]]$ignoreExitCodesArray = $ignoreExitCodes -split ',' - ForEach ($ignoreCode in $ignoreExitCodesArray) { - If ($returnCode -eq $ignoreCode) { $ignoreExitCodeMatch = $true } - } - } - # Or always ignore exit codes - If ($ContinueOnError) { $ignoreExitCodeMatch = $true } - - ## If the passthru switch is specified, return the exit code and any output from process - If ($PassThru) { - Write-Log -Message "Execution completed with exit code [$returnCode]." -Source ${CmdletName} - [psobject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = $stdOut; StdErr = $stdErr } - Write-Output -InputObject $ExecutionResults - } - ElseIf ($ignoreExitCodeMatch) { - Write-Log -Message "Execution complete and the exit code [$returncode] is being ignored." -Source ${CmdletName} - } - ElseIf (($returnCode -eq 3010) -or ($returnCode -eq 1641)) { - Write-Log -Message "Execution completed successfully with exit code [$returnCode]. A reboot is required." -Severity 2 -Source ${CmdletName} - Set-Variable -Name 'msiRebootDetected' -Value $true -Scope 'Script' - } - ElseIf (($returnCode -eq 1605) -and ($Path -match 'msiexec')) { - Write-Log -Message "Execution failed with exit code [$returnCode] because the product is not currently installed." -Severity 3 -Source ${CmdletName} - } - ElseIf (($returnCode -eq -2145124329) -and ($Path -match 'wusa')) { - Write-Log -Message "Execution failed with exit code [$returnCode] because the Windows Update is not applicable to this system." -Severity 3 -Source ${CmdletName} - } - ElseIf (($returnCode -eq 17025) -and ($Path -match 'fullfile')) { - Write-Log -Message "Execution failed with exit code [$returnCode] because the Office Update is not applicable to this system." -Severity 3 -Source ${CmdletName} - } - ElseIf ($returnCode -eq 0) { - Write-Log -Message "Execution completed successfully with exit code [$returnCode]." -Source ${CmdletName} - } - Else { - [string]$MsiExitCodeMessage = '' - If ($Path -match 'msiexec') { - [string]$MsiExitCodeMessage = Get-MsiExitCodeMessage -MsiExitCode $returnCode - } - - If ($MsiExitCodeMessage) { - Write-Log -Message "Execution failed with exit code [$returnCode]: $MsiExitCodeMessage" -Severity 3 -Source ${CmdletName} - } - Else { - Write-Log -Message "Execution failed with exit code [$returnCode]." -Severity 3 -Source ${CmdletName} - } - Exit-Script -ExitCode $returnCode - } - } - } - Catch { - If ([string]::IsNullOrEmpty([string]$returnCode)) { - [int32]$returnCode = 60002 - Write-Log -Message "Function failed, setting exit code to [$returnCode]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - Else { - Write-Log -Message "Execution completed with exit code [$returnCode]. Function failed. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - If ($PassThru) { - [psobject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { $stdOut } Else { '' }; StdErr = If ($stdErr) { $stdErr } Else { '' } } - Write-Output -InputObject $ExecutionResults - } - Else { - Exit-Script -ExitCode $returnCode - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [Alias('FilePath')] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [String[]]$Parameters, + [Parameter(Mandatory = $false)] + [Switch]$SecureParameters = $false, + [Parameter(Mandatory = $false)] + [ValidateSet('Normal', 'Hidden', 'Maximized', 'Minimized')] + [Diagnostics.ProcessWindowStyle]$WindowStyle = 'Normal', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$CreateNoWindow = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [Switch]$NoWait = $false, + [Parameter(Mandatory = $false)] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [Switch]$WaitForMsiExec = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$MsiExecWaitTime = $configMSIMutexWaitTime, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IgnoreExitCodes, + [Parameter(Mandatory = $false)] + [ValidateSet('Idle', 'Normal', 'High', 'AboveNormal', 'BelowNormal', 'RealTime')] + [Diagnostics.ProcessPriorityClass]$PriorityClass = 'Normal', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ExitOnProcessFailure = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$UseShellExecute = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + $private:returnCode = $null + + ## Validate and find the fully qualified path for the $Path variable. + If (([IO.Path]::IsPathRooted($Path)) -and ([IO.Path]::HasExtension($Path))) { + Write-Log -Message "[$Path] is a valid fully qualified path, continue." -Source ${CmdletName} + If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { + Write-Log -Message "File [$Path] not found." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "File [$Path] not found." + } + Return + } + } + Else { + # The first directory to search will be the 'Files' subdirectory of the script directory + [String]$PathFolders = $dirFiles + # Add the current location of the console (Windows always searches this location first) + [String]$PathFolders = $PathFolders + ';' + (Get-Location -PSProvider 'FileSystem').Path + # Add the new path locations to the PATH environment variable + $env:PATH = $PathFolders + ';' + $env:PATH + + # Get the fully qualified path for the file. Get-Command searches PATH environment variable to find this value. + [String]$FullyQualifiedPath = Get-Command -Name $Path -CommandType 'Application' -TotalCount 1 -Syntax -ErrorAction 'Stop' + + # Revert the PATH environment variable to it's original value + $env:PATH = $env:PATH -replace [RegEx]::Escape($PathFolders + ';'), '' + + If ($FullyQualifiedPath) { + Write-Log -Message "[$Path] successfully resolved to fully qualified path [$FullyQualifiedPath]." -Source ${CmdletName} + $Path = $FullyQualifiedPath + } + Else { + Write-Log -Message "[$Path] contains an invalid path or file name." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "[$Path] contains an invalid path or file name." + } + Return + } + } + + ## Set the Working directory (if not specified) + If (-not $WorkingDirectory) { + $WorkingDirectory = Split-Path -Path $Path -Parent -ErrorAction 'Stop' + } + + ## If MSI install, check to see if the MSI installer service is available or if another MSI install is already underway. + ## Please note that a race condition is possible after this check where another process waiting for the MSI installer + ## to become available grabs the MSI Installer mutex before we do. Not too concerned about this possible race condition. + If (($Path -match 'msiexec') -or ($WaitForMsiExec)) { + [Timespan]$MsiExecWaitTimeSpan = New-TimeSpan -Seconds $MsiExecWaitTime + [Boolean]$MsiExecAvailable = Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds $MsiExecWaitTimeSpan.TotalMilliseconds + Start-Sleep -Seconds 1 + If (-not $MsiExecAvailable) { + # Default MSI exit code for install already in progress + [Int32]$returnCode = 1618 + Write-Log -Message 'Another MSI installation is already in progress and needs to be completed before proceeding with this installation.' -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw 'Another MSI installation is already in progress and needs to be completed before proceeding with this installation.' + } + Return + } + } + + Try { + ## Disable Zone checking to prevent warnings when running executables + $env:SEE_MASK_NOZONECHECKS = 1 + + ## Using this variable allows capture of exceptions from .NET methods. Private scope only changes value for current function. + $private:previousErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + + ## Define process + $processStartInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' -ErrorAction 'Stop' + $processStartInfo.FileName = $Path + $processStartInfo.WorkingDirectory = $WorkingDirectory + $processStartInfo.UseShellExecute = $UseShellExecute + $processStartInfo.ErrorDialog = $false + $processStartInfo.RedirectStandardOutput = $true + $processStartInfo.RedirectStandardError = $true + $processStartInfo.CreateNoWindow = $CreateNoWindow + If ($Parameters) { + $processStartInfo.Arguments = $Parameters + } + $processStartInfo.WindowStyle = $WindowStyle + If ($processStartInfo.UseShellExecute -eq $true) { + Write-Log -Message 'UseShellExecute is set to true, standard output and error will not be available.' -Source ${CmdletName} + $processStartInfo.RedirectStandardOutput = $false + $processStartInfo.RedirectStandardError = $false + } + $process = New-Object -TypeName 'System.Diagnostics.Process' -ErrorAction 'Stop' + $process.StartInfo = $processStartInfo + + If ($processStartInfo.UseShellExecute -eq $false) { + ## Add event handler to capture process's standard output redirection + [ScriptBlock]$processEventHandler = { If (-not [String]::IsNullOrEmpty($EventArgs.Data)) { + $Event.MessageData.AppendLine($EventArgs.Data) + } } + $stdOutBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList ('') + $stdOutEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'OutputDataReceived' -MessageData $stdOutBuilder -ErrorAction 'Stop' + $stdErrBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList ('') + $stdErrEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'ErrorDataReceived' -MessageData $stdErrBuilder -ErrorAction 'Stop' + } + + ## Start Process + Write-Log -Message "Working Directory is [$WorkingDirectory]." -Source ${CmdletName} + If ($Parameters) { + If ($Parameters -match '-Command \&') { + Write-Log -Message "Executing [$Path [PowerShell ScriptBlock]]..." -Source ${CmdletName} + } + Else { + If ($SecureParameters) { + Write-Log -Message "Executing [$Path (Parameters Hidden)]..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Executing [$Path $Parameters]..." -Source ${CmdletName} + } + } + } + Else { + Write-Log -Message "Executing [$Path]..." -Source ${CmdletName} + } + + $null = $process.Start() + ## Set priority + If ($PriorityClass -ne 'Normal') { + Try { + If ($process.HasExited -eq $false) { + Write-Log -Message "Changing the priority class for the process to [$PriorityClass]" -Source ${CmdletName} + $process.PriorityClass = $PriorityClass + } + Else { + Write-Log -Message "Cannot change the priority class for the process to [$PriorityClass], because the process has exited already." -Severity 2 -Source ${CmdletName} + } + + } + Catch { + Write-Log -Message 'Failed to change the priority class for the process.' -Severity 2 -Source ${CmdletName} + } + } + ## NoWait specified, return process details. If it isn't specified, start reading standard Output and Error streams + If ($NoWait) { + Write-Log -Message 'NoWait parameter specified. Continuing without waiting for exit code...' -Source ${CmdletName} + + If ($PassThru) { + If ($process.HasExited -eq $false) { + Write-Log -Message 'PassThru parameter specified, returning process details object.' -Source ${CmdletName} + [PSObject]$ProcessDetails = New-Object -TypeName 'PSObject' -Property @{ Id = If ($process.Id) { + $process.Id + } + Else { + $null + } ; Handle = If ($process.Handle) { + $process.Handle + } + Else { + [IntPtr]::Zero + }; ProcessName = If ($process.ProcessName) { + $process.ProcessName + } + Else { + '' + } + } + Write-Output -InputObject ($ProcessDetails) + } + Else { + Write-Log -Message 'PassThru parameter specified, however the process has already exited.' -Source ${CmdletName} + } + } + } + Else { + If ($processStartInfo.UseShellExecute -eq $false) { + $process.BeginOutputReadLine() + $process.BeginErrorReadLine() + } + ## Instructs the Process component to wait indefinitely for the associated process to exit. + $process.WaitForExit() + + ## HasExited indicates that the associated process has terminated, either normally or abnormally. Wait until HasExited returns $true. + While (-not $process.HasExited) { + $process.Refresh(); Start-Sleep -Seconds 1 + } + + ## Get the exit code for the process + Try { + [Int32]$returnCode = $process.ExitCode + } + Catch [System.Management.Automation.PSInvalidCastException] { + # Catch exit codes that are out of int32 range + [Int32]$returnCode = 60013 + } + + If ($processStartInfo.UseShellExecute -eq $false) { + ## Unregister standard output and error event to retrieve process output + If ($stdOutEvent) { + Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'; $stdOutEvent = $null + } + If ($stdErrEvent) { + Unregister-Event -SourceIdentifier $stdErrEvent.Name -ErrorAction 'Stop'; $stdErrEvent = $null + } + $stdOut = $stdOutBuilder.ToString() -replace $null, '' + $stdErr = $stdErrBuilder.ToString() -replace $null, '' + + If ($stdErr.Length -gt 0) { + Write-Log -Message "Standard error output from the process: $stdErr" -Severity 3 -Source ${CmdletName} + } + } + } + } + Finally { + If ($processStartInfo.UseShellExecute -eq $false) { + ## Make sure the standard output and error event is unregistered + If ($stdOutEvent) { + Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'SilentlyContinue'; $stdOutEvent = $null + } + If ($stdErrEvent) { + Unregister-Event -SourceIdentifier $stdErrEvent.Name -ErrorAction 'SilentlyContinue'; $stdErrEvent = $null + } + } + ## Free resources associated with the process, this does not cause process to exit + If ($process) { + $process.Dispose() + } + + ## Re-enable Zone checking + Remove-Item -LiteralPath 'env:SEE_MASK_NOZONECHECKS' -ErrorAction 'SilentlyContinue' + + If ($private:previousErrorActionPreference) { + $ErrorActionPreference = $private:previousErrorActionPreference + } + } + + If (-not $NoWait) { + ## Check to see whether we should ignore exit codes + $ignoreExitCodeMatch = $false + If ($ignoreExitCodes) { + ## Check whether * was specified, which would tell us to ignore all exit codes + If ($ignoreExitCodes.Trim() -eq '*') { + $ignoreExitCodeMatch = $true + } + Else { + ## Split the processes on a comma + [Int32[]]$ignoreExitCodesArray = $ignoreExitCodes -split ',' + ForEach ($ignoreCode in $ignoreExitCodesArray) { + If ($returnCode -eq $ignoreCode) { + $ignoreExitCodeMatch = $true + } + } + } + } + + ## If the passthru switch is specified, return the exit code and any output from process + If ($PassThru) { + Write-Log -Message 'PassThru parameter specified, returning execution results object.' -Source ${CmdletName} + [PSObject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { + $stdOut + } + Else { + '' + }; StdErr = If ($stdErr) { + $stdErr + } + Else { + '' + } + } + Write-Output -InputObject ($ExecutionResults) + } + + If ($ignoreExitCodeMatch) { + Write-Log -Message "Execution completed and the exit code [$returncode] is being ignored." -Source ${CmdletName} + } + ElseIf (($returnCode -eq 3010) -or ($returnCode -eq 1641)) { + Write-Log -Message "Execution completed successfully with exit code [$returnCode]. A reboot is required." -Severity 2 -Source ${CmdletName} + Set-Variable -Name 'msiRebootDetected' -Value $true -Scope 'Script' + } + ElseIf (($returnCode -eq 1605) -and ($Path -match 'msiexec')) { + Write-Log -Message "Execution failed with exit code [$returnCode] because the product is not currently installed." -Severity 3 -Source ${CmdletName} + } + ElseIf (($returnCode -eq -2145124329) -and ($Path -match 'wusa')) { + Write-Log -Message "Execution failed with exit code [$returnCode] because the Windows Update is not applicable to this system." -Severity 3 -Source ${CmdletName} + } + ElseIf (($returnCode -eq 17025) -and ($Path -match 'fullfile')) { + Write-Log -Message "Execution failed with exit code [$returnCode] because the Office Update is not applicable to this system." -Severity 3 -Source ${CmdletName} + } + ElseIf ($returnCode -eq 0) { + Write-Log -Message "Execution completed successfully with exit code [$returnCode]." -Source ${CmdletName} + } + Else { + [String]$MsiExitCodeMessage = '' + If ($Path -match 'msiexec') { + [String]$MsiExitCodeMessage = Get-MsiExitCodeMessage -MsiExitCode $returnCode + } + + If ($MsiExitCodeMessage) { + Write-Log -Message "Execution failed with exit code [$returnCode]: $MsiExitCodeMessage" -Severity 3 -Source ${CmdletName} + } + Else { + Write-Log -Message "Execution failed with exit code [$returnCode]." -Severity 3 -Source ${CmdletName} + } + + If ($ExitOnProcessFailure) { + Exit-Script -ExitCode $returnCode + } + } + } + } + Catch { + If ([String]::IsNullOrEmpty([String]$returnCode)) { + [Int32]$returnCode = 60002 + Write-Log -Message "Function failed, setting exit code to [$returnCode]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Function failed, setting exit code to [$returnCode]. $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Execution completed with exit code [$returnCode]. Function failed. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + If ($PassThru) { + [PSObject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { + $stdOut + } + Else { + '' + }; StdErr = If ($stdErr) { + $stdErr + } + Else { + '' + } + } + Write-Output -InputObject ($ExecutionResults) + } + + If ($ExitOnProcessFailure) { + Exit-Script -ExitCode $returnCode + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-MsiExitCodeMessage Function Get-MsiExitCodeMessage { -<# + <# .SYNOPSIS - Get message for MSI error code + + Get message for MSI error code + .DESCRIPTION - Get message for MSI error code by reading it from msimsg.dll + + Get message for MSI error code by reading it from msimsg.dll + .PARAMETER MsiErrorCode - MSI error code + + MSI error code + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the message for the MSI error code. + .EXAMPLE - Get-MsiExitCodeMessage -MsiErrorCode 1618 + + Get-MsiExitCodeMessage -MsiErrorCode 1618 + .NOTES - This is an internal script function and should typically not be called directly. + + This is an internal script function and should typically not be called directly. + +.LINK + + http://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx + .LINK - http://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx - http://psappdeploytoolkit.com + + https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [int32]$MsiExitCode - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Get message for exit code [$MsiExitCode]." -Source ${CmdletName} - [string]$MsiExitCodeMsg = [PSADT.Msi]::GetMessageFromMsiExitCode($MsiExitCode) - Write-Output -InputObject $MsiExitCodeMsg - } - Catch { - Write-Log -Message "Failed to get message for exit code [$MsiExitCode]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [Int32]$MsiExitCode + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Getting message for exit code [$MsiExitCode]." -Source ${CmdletName} + [String]$MsiExitCodeMsg = [PSADT.Msi]::GetMessageFromMsiExitCode($MsiExitCode) + Write-Output -InputObject ($MsiExitCodeMsg) + } + Catch { + Write-Log -Message "Failed to get message for exit code [$MsiExitCode]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-IsMutexAvailable Function Test-IsMutexAvailable { -<# + <# .SYNOPSIS - Wait, up to a timeout value, to check if current thread is able to acquire an exclusive lock on a system mutex. + +Wait, up to a timeout value, to check if current thread is able to acquire an exclusive lock on a system mutex. + .DESCRIPTION - A mutex can be used to serialize applications and prevent multiple instances from being opened at the same time. - Wait, up to a timeout (default is 1 millisecond), for the mutex to become available for an exclusive lock. + +A mutex can be used to serialize applications and prevent multiple instances from being opened at the same time. +Wait, up to a timeout (default is 1 millisecond), for the mutex to become available for an exclusive lock. + .PARAMETER MutexName - The name of the system mutex. + +The name of the system mutex. + .PARAMETER MutexWaitTime - The number of milliseconds the current thread should wait to acquire an exclusive lock of a named mutex. Default is: 1 millisecond. - A wait time of -1 milliseconds means to wait indefinitely. A wait time of zero does not acquire an exclusive lock but instead tests the state of the wait handle and returns immediately. + +The number of milliseconds the current thread should wait to acquire an exclusive lock of a named mutex. Default is: 1 millisecond. +A wait timeof -1 milliseconds means to wait indefinitely. A wait time of zero does not acquire an exclusive lock but instead tests the state of the wait handle and returns immediately. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if the current thread acquires an exclusive lock on the named mutex, $false otherwise. + .EXAMPLE - Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds 500 + +Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds 500 + .EXAMPLE - Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds (New-TimeSpan -Minutes 5).TotalMilliseconds + +Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds (New-TimeSpan -Minutes 5).TotalMilliseconds + .EXAMPLE - Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds (New-TimeSpan -Seconds 60).TotalMilliseconds + +Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds (New-TimeSpan -Seconds 60).TotalMilliseconds + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://msdn.microsoft.com/en-us/library/aa372909(VS.85).asp - http://psappdeploytoolkit.com + + http://msdn.microsoft.com/en-us/library/aa372909(VS.85).asp + +.LINK + + https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateLength(1,260)] - [string]$MutexName, - [Parameter(Mandatory=$false)] - [ValidateScript({($_ -ge -1) -and ($_ -le [int32]::MaxValue)})] - [int32]$MutexWaitTimeInMilliseconds = 1 - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## Initialize Variables - [timespan]$MutexWaitTime = [timespan]::FromMilliseconds($MutexWaitTimeInMilliseconds) - If ($MutexWaitTime.TotalMinutes -ge 1) { - [string]$WaitLogMsg = "$($MutexWaitTime.TotalMinutes) minute(s)" - } - ElseIf ($MutexWaitTime.TotalSeconds -ge 1) { - [string]$WaitLogMsg = "$($MutexWaitTime.TotalSeconds) second(s)" - } - Else { - [string]$WaitLogMsg = "$($MutexWaitTime.Milliseconds) millisecond(s)" - } - [boolean]$IsUnhandledException = $false - [boolean]$IsMutexFree = $false - [Threading.Mutex]$OpenExistingMutex = $null - } - Process { - Write-Log -Message "Check to see if mutex [$MutexName] is available. Wait up to [$WaitLogMsg] for the mutex to become available." -Source ${CmdletName} - Try { - ## Using this variable allows capture of exceptions from .NET methods. Private scope only changes value for current function. - $private:previousErrorActionPreference = $ErrorActionPreference - $ErrorActionPreference = 'Stop' - - ## Open the specified named mutex, if it already exists, without acquiring an exclusive lock on it. If the system mutex does not exist, this method throws an exception instead of creating the system object. - [Threading.Mutex]$OpenExistingMutex = [Threading.Mutex]::OpenExisting($MutexName) - ## Attempt to acquire an exclusive lock on the mutex. Use a Timespan to specify a timeout value after which no further attempt is made to acquire a lock on the mutex. - $IsMutexFree = $OpenExistingMutex.WaitOne($MutexWaitTime, $false) - } - Catch [Threading.WaitHandleCannotBeOpenedException] { - ## The named mutex does not exist - $IsMutexFree = $true - } - Catch [ObjectDisposedException] { - ## Mutex was disposed between opening it and attempting to wait on it - $IsMutexFree = $true - } - Catch [UnauthorizedAccessException] { - ## The named mutex exists, but the user does not have the security access required to use it - $IsMutexFree = $false - } - Catch [Threading.AbandonedMutexException] { - ## The wait completed because a thread exited without releasing a mutex. This exception is thrown when one thread acquires a mutex object that another thread has abandoned by exiting without releasing it. - $IsMutexFree = $true - } - Catch { - $IsUnhandledException = $true - ## Return $true, to signify that mutex is available, because function was unable to successfully complete a check due to an unhandled exception. Default is to err on the side of the mutex being available on a hard failure. - Write-Log -Message "Unable to check if mutex [$MutexName] is available due to an unhandled exception. Will default to return value of [$true]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - $IsMutexFree = $true - } - Finally { - If ($IsMutexFree) { - If (-not $IsUnhandledException) { - Write-Log -Message "Mutex [$MutexName] is available for an exclusive lock." -Source ${CmdletName} - } - } - Else { - If ($MutexName -eq 'Global\_MSIExecute') { - ## Get the command line for the MSI installation in progress - Try { - [string]$msiInProgressCmdLine = Get-WmiObject -Class 'Win32_Process' -Filter "name = 'msiexec.exe'" -ErrorAction 'Stop' | Where-Object { $_.CommandLine } | Select-Object -ExpandProperty 'CommandLine' | Where-Object { $_ -match '\.msi' } | ForEach-Object { $_.Trim() } - } - Catch { } - Write-Log -Message "Mutex [$MutexName] is not available for an exclusive lock because the following MSI installation is in progress [$msiInProgressCmdLine]." -Severity 2 -Source ${CmdletName} - } - Else { - Write-Log -Message "Mutex [$MutexName] is not available because another thread already has an exclusive lock on it." -Source ${CmdletName} - } - } - - If (($null -ne $OpenExistingMutex) -and ($IsMutexFree)) { - ## Release exclusive lock on the mutex - $null = $OpenExistingMutex.ReleaseMutex() - $OpenExistingMutex.Close() - } - If ($private:previousErrorActionPreference) { $ErrorActionPreference = $private:previousErrorActionPreference } - } - } - End { - Write-Output -InputObject $IsMutexFree - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateLength(1, 260)] + [String]$MutexName, + [Parameter(Mandatory = $false)] + [ValidateScript({ ($_ -ge -1) -and ($_ -le [Int32]::MaxValue) })] + [Int32]$MutexWaitTimeInMilliseconds = 1 + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Initialize Variables + [Timespan]$MutexWaitTime = [Timespan]::FromMilliseconds($MutexWaitTimeInMilliseconds) + If ($MutexWaitTime.TotalMinutes -ge 1) { + [String]$WaitLogMsg = "$($MutexWaitTime.TotalMinutes) minute(s)" + } + ElseIf ($MutexWaitTime.TotalSeconds -ge 1) { + [String]$WaitLogMsg = "$($MutexWaitTime.TotalSeconds) second(s)" + } + Else { + [String]$WaitLogMsg = "$($MutexWaitTime.Milliseconds) millisecond(s)" + } + [Boolean]$IsUnhandledException = $false + [Boolean]$IsMutexFree = $false + [Threading.Mutex]$OpenExistingMutex = $null + } + Process { + Write-Log -Message "Checking to see if mutex [$MutexName] is available. Wait up to [$WaitLogMsg] for the mutex to become available." -Source ${CmdletName} + Try { + ## Using this variable allows capture of exceptions from .NET methods. Private scope only changes value for current function. + $private:previousErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + + ## Open the specified named mutex, if it already exists, without acquiring an exclusive lock on it. If the system mutex does not exist, this method throws an exception instead of creating the system object. + [Threading.Mutex]$OpenExistingMutex = [Threading.Mutex]::OpenExisting($MutexName) + ## Attempt to acquire an exclusive lock on the mutex. Use a Timespan to specify a timeout value after which no further attempt is made to acquire a lock on the mutex. + $IsMutexFree = $OpenExistingMutex.WaitOne($MutexWaitTime, $false) + } + Catch [Threading.WaitHandleCannotBeOpenedException] { + ## The named mutex does not exist + $IsMutexFree = $true + } + Catch [ObjectDisposedException] { + ## Mutex was disposed between opening it and attempting to wait on it + $IsMutexFree = $true + } + Catch [UnauthorizedAccessException] { + ## The named mutex exists, but the user does not have the security access required to use it + $IsMutexFree = $false + } + Catch [Threading.AbandonedMutexException] { + ## The wait completed because a thread exited without releasing a mutex. This exception is thrown when one thread acquires a mutex object that another thread has abandoned by exiting without releasing it. + $IsMutexFree = $true + } + Catch { + $IsUnhandledException = $true + ## Return $true, to signify that mutex is available, because function was unable to successfully complete a check due to an unhandled exception. Default is to err on the side of the mutex being available on a hard failure. + Write-Log -Message "Unable to check if mutex [$MutexName] is available due to an unhandled exception. Will default to return value of [$true]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + $IsMutexFree = $true + } + Finally { + If ($IsMutexFree) { + If (-not $IsUnhandledException) { + Write-Log -Message "Mutex [$MutexName] is available for an exclusive lock." -Source ${CmdletName} + } + } + Else { + If ($MutexName -eq 'Global\_MSIExecute') { + ## Get the command line for the MSI installation in progress + Try { + [String]$msiInProgressCmdLine = Get-WmiObject -Class 'Win32_Process' -Filter "name = 'msiexec.exe'" -ErrorAction 'Stop' | Where-Object { $_.CommandLine } | Select-Object -ExpandProperty 'CommandLine' | Where-Object { $_ -match '\.msi' } | ForEach-Object { $_.Trim() } + } + Catch { + } + Write-Log -Message "Mutex [$MutexName] is not available for an exclusive lock because the following MSI installation is in progress [$msiInProgressCmdLine]." -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message "Mutex [$MutexName] is not available because another thread already has an exclusive lock on it." -Source ${CmdletName} + } + } + + If (($null -ne $OpenExistingMutex) -and ($IsMutexFree)) { + ## Release exclusive lock on the mutex + $null = $OpenExistingMutex.ReleaseMutex() + $OpenExistingMutex.Close() + } + If ($private:previousErrorActionPreference) { + $ErrorActionPreference = $private:previousErrorActionPreference + } + } + } + End { + Write-Output -InputObject ($IsMutexFree) + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function New-Folder Function New-Folder { -<# + <# .SYNOPSIS - Create a new folder. + +Create a new folder. + .DESCRIPTION - Create a new folder if it does not exist. + +Create a new folder if it does not exist. + .PARAMETER Path - Path to the new folder to create. + +Path to the new folder to create. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - New-Folder -Path "$envWinDir\System32" + +New-Folder -Path "$envWinDir\System32" + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Path, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - If (-not (Test-Path -LiteralPath $Path -PathType 'Container')) { - Write-Log -Message "Create folder [$Path]." -Source ${CmdletName} - $null = New-Item -Path $Path -ItemType 'Directory' -ErrorAction 'Stop' - } - Else { - Write-Log -Message "Folder [$Path] already exists." -Source ${CmdletName} - } - } - Catch { - Write-Log -Message "Failed to create folder [$Path]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to create folder [$Path]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If (-not (Test-Path -LiteralPath $Path -PathType 'Container')) { + Write-Log -Message "Creating folder [$Path]." -Source ${CmdletName} + $null = New-Item -Path $Path -ItemType 'Directory' -ErrorAction 'Stop' -Force + } + Else { + Write-Log -Message "Folder [$Path] already exists." -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to create folder [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create folder [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Remove-Folder Function Remove-Folder { -<# + <# .SYNOPSIS - Remove folder and files if they exist. + +Remove folder and files if they exist. + .DESCRIPTION - Remove folder and all files recursively in a given path. + +Remove folder and all files with or without recursion in a given path. + .PARAMETER Path - Path to the folder to remove. + +Path to the folder to remove. + +.PARAMETER DisableRecursion + +Disables recursion while deleting. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Remove-Folder -Path "$envWinDir\Downloaded Program Files" + +Deletes all files and subfolders in the Windows\Downloads Program Files folder + .EXAMPLE - Remove-Folder -Path "$envWinDir\Downloaded Program Files" + +Remove-Folder -Path "$envTemp\MyAppCache" -DisableRecursion + +Deletes all files in the Temp\MyAppCache folder but does not delete any subfolders. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Path, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - If (Test-Path -LiteralPath $Path -PathType 'Container') { - Try { - Remove-Item -LiteralPath $Path -Force -Recurse -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' - If ($ErrorRemoveFolder) { - Write-Log -Message "The following error(s) took place while deleting folder(s) and file(s) recursively from path [$path]. `n$(Resolve-Error -ErrorRecord $ErrorRemoveFolder)" -Severity 2 -Source ${CmdletName} - } - } - Catch { - Write-Log -Message "Failed to delete folder(s) and file(s) recursively from path [$path]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to delete folder(s) and file(s) recursively from path [$path]: $($_.Exception.Message)" - } - } - } - Else { - Write-Log -Message "Folder [$Path] does not exists..." -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [Switch]$DisableRecursion, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If (Test-Path -LiteralPath $Path -PathType 'Container' -ErrorAction 'SilentlyContinue') { + Try { + If ($DisableRecursion) { + Write-Log -Message "Deleting folder [$path] without recursion..." -Source ${CmdletName} + # Without recursion we have to go through the subfolder ourselves because Remove-Item asks for confirmation if we are trying to delete a non-empty folder without -Recurse + [Array]$ListOfChildItems = Get-ChildItem -LiteralPath $Path -Force + If ($ListOfChildItems) { + $SubfoldersSkipped = 0 + ForEach ($item in $ListOfChildItems) { + # Check whether this item is a folder + If (Test-Path -LiteralPath $item.FullName -PathType Container) { + # Item is a folder. Check if its empty + # Get list of child items in the folder + [Array]$ItemChildItems = Get-ChildItem -LiteralPath $item.FullName -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + If ($ItemChildItems.Count -eq 0) { + # The folder is empty, delete it + Remove-Item -LiteralPath $item.FullName -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + Else { + # Folder is not empty, skip it + $SubfoldersSkipped++ + Continue + } + } + Else { + # Item is a file. Delete it + Remove-Item -LiteralPath $item.FullName -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + } + If ($SubfoldersSkipped -gt 0) { + Throw "[$SubfoldersSkipped] subfolders are not empty!" + } + } + Else { + Remove-Item -LiteralPath $Path -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + } + Else { + Write-Log -Message "Deleting folder [$path] recursively..." -Source ${CmdletName} + Remove-Item -LiteralPath $Path -Force -Recurse -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + + If ($ErrorRemoveFolder) { + Throw $ErrorRemoveFolder + } + } + Catch { + Write-Log -Message "Failed to delete folder(s) and file(s) from path [$path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete folder(s) and file(s) from path [$path]: $($_.Exception.Message)" + } + } + } + Else { + Write-Log -Message "Folder [$Path] does not exist." -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Copy-File Function Copy-File { -<# + <# .SYNOPSIS - Copy a file or group of files to a destination path. + +Copy a file or group of files to a destination path. + .DESCRIPTION - Copy a file or group of files to a destination path. + +Copy a file or group of files to a destination path. + .PARAMETER Path - Path of the file to copy. + +Path of the file to copy. + .PARAMETER Destination - Destination Path of the file to copy. + +Destination Path of the file to copy. + .PARAMETER Recurse - Copy files in subdirectories. + +Copy files in subdirectories. + +.PARAMETER Flatten + +Flattens the files into the root destination directory. + .PARAMETER ContinueOnError - Continue if an error is encountered. This will continue the deployment script, but will not continue copying files if an error is encountered. Default is: $true. + +Continue if an error is encountered. This will continue the deployment script, but will not continue copying files if an error is encountered. Default is: $true. + .PARAMETER ContinueFileCopyOnError - Continue copying files if an error is encountered. This will continue the deployment script and will warn about files that failed to be copied. Default is: $false. + +Continue copying files if an error is encountered. This will continue the deployment script and will warn about files that failed to be copied. Default is: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Copy-File -Path "$dirSupportFiles\MyApp.ini" -Destination "$envWindir\MyApp.ini" + +Copy-File -Path "$dirSupportFiles\MyApp.ini" -Destination "$envWinDir\MyApp.ini" + .EXAMPLE - Copy-File -Path "$dirSupportFiles\*.*" -Destination "$envTemp\tempfiles" - Copy all of the files in a folder to a destination folder. + +Copy-File -Path "$dirSupportFiles\*.*" -Destination "$envTemp\tempfiles" + +Copy all of the files in a folder to a destination folder. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string[]]$Path, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Destination, - [Parameter(Mandatory=$false)] - [switch]$Recurse = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true, - [ValidateNotNullOrEmpty()] - [boolean]$ContinueFileCopyOnError = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - $null = $fileCopyError - If ((-not ([IO.Path]::HasExtension($Destination))) -and (-not (Test-Path -LiteralPath $Destination -PathType 'Container'))) { - Write-Log -Message "Destination folder does not exist, creating destination folder [$destination]." -Source ${CmdletName} - $null = New-Item -Path $Destination -Type 'Directory' -Force -ErrorAction 'Stop' - } - - $null = $FileCopyError - If ($Recurse) { - Write-Log -Message "Copy file(s) recursively in path [$path] to destination [$destination]." -Source ${CmdletName} - If (-not $ContinueFileCopyOnError) { - $null = Copy-Item -Path $Path -Destination $Destination -Force -Recurse -ErrorAction 'Stop' - } - Else { - $null = Copy-Item -Path $Path -Destination $Destination -Force -Recurse -ErrorAction 'SilentlyContinue' -ErrorVariable FileCopyError - } - } - Else { - Write-Log -Message "Copy file in path [$path] to destination [$destination]." -Source ${CmdletName} - If (-not $ContinueFileCopyOnError) { - $null = Copy-Item -Path $Path -Destination $Destination -Force -ErrorAction 'Stop' - } - Else { - $null = Copy-Item -Path $Path -Destination $Destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable FileCopyError - } - } - - If ($fileCopyError) { - Write-Log -Message "The following warnings were detected while copying file(s) in path [$path] to destination [$destination]. `n$FileCopyError" -Severity 2 -Source ${CmdletName} - } - Else { - Write-Log -Message "File copy completed successfully." -Source ${CmdletName} - } - } - Catch { - Write-Log -Message "Failed to copy file(s) in path [$path] to destination [$destination]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to copy file(s) in path [$path] to destination [$destination]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String[]]$Path, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Destination, + [Parameter(Mandatory = $false)] + [Switch]$Recurse = $false, + [Parameter(Mandatory = $false)] + [Switch]$Flatten, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true, + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueFileCopyOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If ((-not ([IO.Path]::HasExtension($Destination))) -and (-not (Test-Path -LiteralPath $Destination -PathType 'Container'))) { + Write-Log -Message "Destination folder does not exist, creating destination folder [$destination]." -Source ${CmdletName} + $null = New-Item -Path $Destination -Type 'Directory' -Force -ErrorAction 'Stop' + } + + If ($Flatten) { + If ($Recurse) { + Write-Log -Message "Copying file(s) recursively in path [$path] to destination [$destination] root folder, flattened." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Get-ChildItem -Path $path -Recurse -Force -ErrorAction 'SilentlyContinue' | Where-Object { -not $_.PSIsContainer } | ForEach-Object { + Copy-Item -Path ($_.FullName) -Destination $destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + } + Else { + $null = Get-ChildItem -Path $path -Recurse -Force -ErrorAction 'SilentlyContinue' | Where-Object { -not $_.PSIsContainer } | ForEach-Object { + Copy-Item -Path ($_.FullName) -Destination $destination -Force -ErrorAction 'Stop' + } + } + } + Else { + Write-Log -Message "Copying file in path [$path] to destination [$destination]." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Copy-Item -Path $path -Destination $destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + Else { + $null = Copy-Item -Path $path -Destination $destination -Force -ErrorAction 'Stop' + } + } + } + Else { + If ($Recurse) { + Write-Log -Message "Copying file(s) recursively in path [$path] to destination [$destination]." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Copy-Item -Path $Path -Destination $Destination -Force -Recurse -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + Else { + $null = Copy-Item -Path $Path -Destination $Destination -Force -Recurse -ErrorAction 'Stop' + } + } + Else { + Write-Log -Message "Copying file in path [$path] to destination [$destination]." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Copy-Item -Path $Path -Destination $Destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + Else { + $null = Copy-Item -Path $Path -Destination $Destination -Force -ErrorAction 'Stop' + } + } + } + + If ($FileCopyError) { + Write-Log -Message "The following warnings were detected while copying file(s) in path [$path] to destination [$destination]. `r`n$FileCopyError" -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message 'File copy completed successfully.' -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to copy file(s) in path [$path] to destination [$destination]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to copy file(s) in path [$path] to destination [$destination]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Remove-File Function Remove-File { -<# + <# .SYNOPSIS - Removes one or more items from a given path on the filesystem. + +Removes one or more items from a given path on the filesystem. + .DESCRIPTION - Removes one or more items from a given path on the filesystem. + +Removes one or more items from a given path on the filesystem. + .PARAMETER Path - Specifies the path on the filesystem to be resolved. The value of Path will accept wildcards. Will accept an array of values. + +Specifies the path on the filesystem to be resolved. The value of Path will accept wildcards. Will accept an array of values. + .PARAMETER LiteralPath - Specifies the path on the filesystem to be resolved. The value of LiteralPath is used exactly as it is typed; no characters are interpreted as wildcards. Will accept an array of values. + +Specifies the path on the filesystem to be resolved. The value of LiteralPath is used exactly as it is typed; no characters are interpreted as wildcards. Will accept an array of values. + .PARAMETER Recurse - Deletes the files in the specified location(s) and in all child items of the location(s). + +Deletes the files in the specified location(s) and in all child items of the location(s). + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Remove-File -Path 'C:\Windows\Downloaded Program Files\Temp.inf' + +Remove-File -Path 'C:\Windows\Downloaded Program Files\Temp.inf' + .EXAMPLE - Remove-File -LiteralPath 'C:\Windows\Downloaded Program Files' -Recurse + +Remove-File -LiteralPath 'C:\Windows\Downloaded Program Files' -Recurse + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,ParameterSetName='Path')] - [ValidateNotNullorEmpty()] - [string[]]$Path, - [Parameter(Mandatory=$true,ParameterSetName='LiteralPath')] - [ValidateNotNullorEmpty()] - [string[]]$LiteralPath, - [Parameter(Mandatory=$false)] - [switch]$Recurse = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Build hashtable of parameters/value pairs to be passed to Remove-Item cmdlet - [hashtable]$RemoveFileSplat = @{ 'Recurse' = $Recurse - 'Force' = $true - 'ErrorVariable' = '+ErrorRemoveItem' - } - If ($ContinueOnError) { - $RemoveFileSplat.Add('ErrorAction', 'SilentlyContinue') - } - Else { - $RemoveFileSplat.Add('ErrorAction', 'Stop') - } - - ## Resolve the specified path, if the path does not exist, display a warning instead of an error - If ($PSCmdlet.ParameterSetName -eq 'Path') { [string[]]$SpecifiedPath = $Path } Else { [string[]]$SpecifiedPath = $LiteralPath } - ForEach ($Item in $SpecifiedPath) { - Try { - If ($PSCmdlet.ParameterSetName -eq 'Path') { - [string[]]$ResolvedPath += Resolve-Path -Path $Item -ErrorAction 'Stop' | Where-Object { $_.Path } | Select-Object -ExpandProperty 'Path' -ErrorAction 'Stop' - } - Else { - [string[]]$ResolvedPath += Resolve-Path -LiteralPath $Item -ErrorAction 'Stop' | Where-Object { $_.Path } | Select-Object -ExpandProperty 'Path' -ErrorAction 'Stop' - } - } - Catch [System.Management.Automation.ItemNotFoundException] { - Write-Log -Message "Unable to resolve file(s) for deletion in path [$Item] because path does not exist." -Severity 2 -Source ${CmdletName} - } - Catch { - Write-Log -Message "Failed to resolve file(s) for deletion in path [$Item]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to resolve file(s) for deletion in path [$Item]: $($_.Exception.Message)" - } - } - } - - ## Delete specified path if it was successfully resolved - If ($ResolvedPath) { - ForEach ($Item in $ResolvedPath) { - Try { - If (($Recurse) -and (Test-Path -LiteralPath $Item -PathType 'Container')) { - Write-Log -Message "Delete file(s) recursively in path [$Item]..." -Source ${CmdletName} - } - ElseIf ((-not $Recurse) -and (Test-Path -LiteralPath $Item -PathType 'Container')) { - Write-Log -Message "Skipping folder [$Item] because the Recurse switch was not specified" - Continue - } - Else { - Write-Log -Message "Delete file in path [$Item]..." -Source ${CmdletName} - } - $null = Remove-Item @RemoveFileSplat -LiteralPath $Item - } - Catch { - Write-Log -Message "Failed to delete file(s) in path [$Item]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to delete file(s) in path [$Item]: $($_.Exception.Message)" - } - } - } - } - - If ($ErrorRemoveItem) { - Write-Log -Message "The following error(s) took place while removing file(s) in path [$SpecifiedPath]. `n$(Resolve-Error -ErrorRecord $ErrorRemoveItem)" -Severity 2 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'Path')] + [ValidateNotNullorEmpty()] + [String[]]$Path, + [Parameter(Mandatory = $true, ParameterSetName = 'LiteralPath')] + [ValidateNotNullorEmpty()] + [String[]]$LiteralPath, + [Parameter(Mandatory = $false)] + [Switch]$Recurse = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Build hashtable of parameters/value pairs to be passed to Remove-Item cmdlet + [Hashtable]$RemoveFileSplat = @{ 'Recurse' = $Recurse + 'Force' = $true + 'ErrorVariable' = '+ErrorRemoveItem' + } + If ($ContinueOnError) { + $RemoveFileSplat.Add('ErrorAction', 'SilentlyContinue') + } + Else { + $RemoveFileSplat.Add('ErrorAction', 'Stop') + } + + ## Resolve the specified path, if the path does not exist, display a warning instead of an error + If ($PSCmdlet.ParameterSetName -eq 'Path') { + [String[]]$SpecifiedPath = $Path + } + Else { + [String[]]$SpecifiedPath = $LiteralPath + } + ForEach ($Item in $SpecifiedPath) { + Try { + If ($PSCmdlet.ParameterSetName -eq 'Path') { + [String[]]$ResolvedPath += Resolve-Path -Path $Item -ErrorAction 'Stop' | Where-Object { $_.Path } | Select-Object -ExpandProperty 'Path' -ErrorAction 'Stop' + } + Else { + [String[]]$ResolvedPath += Resolve-Path -LiteralPath $Item -ErrorAction 'Stop' | Where-Object { $_.Path } | Select-Object -ExpandProperty 'Path' -ErrorAction 'Stop' + } + } + Catch [System.Management.Automation.ItemNotFoundException] { + Write-Log -Message "Unable to resolve file(s) for deletion in path [$Item] because path does not exist." -Severity 2 -Source ${CmdletName} + } + Catch { + Write-Log -Message "Failed to resolve file(s) for deletion in path [$Item]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to resolve file(s) for deletion in path [$Item]: $($_.Exception.Message)" + } + } + } + + ## Delete specified path if it was successfully resolved + If ($ResolvedPath) { + ForEach ($Item in $ResolvedPath) { + Try { + If (($Recurse) -and (Test-Path -LiteralPath $Item -PathType 'Container')) { + Write-Log -Message "Deleting file(s) recursively in path [$Item]..." -Source ${CmdletName} + } + ElseIf ((-not $Recurse) -and (Test-Path -LiteralPath $Item -PathType 'Container')) { + Write-Log -Message "Skipping folder [$Item] because the Recurse switch was not specified." -Source ${CmdletName} + Continue + } + Else { + Write-Log -Message "Deleting file in path [$Item]..." -Source ${CmdletName} + } + $null = Remove-Item @RemoveFileSplat -LiteralPath $Item + } + Catch { + Write-Log -Message "Failed to delete file(s) in path [$Item]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete file(s) in path [$Item]: $($_.Exception.Message)" + } + } + } + } + + If ($ErrorRemoveItem) { + Write-Log -Message "The following error(s) took place while removing file(s) in path [$SpecifiedPath]. `r`n$(Resolve-Error -ErrorRecord $ErrorRemoveItem)" -Severity 2 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Convert-RegistryPath Function Convert-RegistryPath { -<# + <# .SYNOPSIS - Converts the specified registry key path to a format that is compatible with built-in PowerShell cmdlets. + +Converts the specified registry key path to a format that is compatible with built-in PowerShell cmdlets. + .DESCRIPTION - Converts the specified registry key path to a format that is compatible with built-in PowerShell cmdlets. - Converts registry key hives to their full paths. Example: HKLM is converted to "Registry::HKEY_LOCAL_MACHINE". + +Converts the specified registry key path to a format that is compatible with built-in PowerShell cmdlets. + +Converts registry key hives to their full paths. Example: HKLM is converted to "Registry::HKEY_LOCAL_MACHINE". + .PARAMETER Key - Path to the registry key to convert (can be a registry hive or fully qualified path) + +Path to the registry key to convert (can be a registry hive or fully qualified path) + .PARAMETER SID - The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. - Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.PARAMETER DisableFunctionLogging + +Disables logging of this function. Default: $true + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the converted registry key path. + .EXAMPLE - Convert-RegistryPath -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + +Convert-RegistryPath -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + .EXAMPLE - Convert-RegistryPath -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + +Convert-RegistryPath -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Key, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$SID - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Convert the registry key hive to the full path, only match if at the beginning of the line - If ($Key -match '^HKLM:\\|^HKCU:\\|^HKCR:\\|^HKU:\\|^HKCC:\\|^HKPD:\\') { - # Converts registry paths that start with, e.g.: HKLM:\ - $key = $key -replace '^HKLM:\\', 'HKEY_LOCAL_MACHINE\' - $key = $key -replace '^HKCR:\\', 'HKEY_CLASSES_ROOT\' - $key = $key -replace '^HKCU:\\', 'HKEY_CURRENT_USER\' - $key = $key -replace '^HKU:\\', 'HKEY_USERS\' - $key = $key -replace '^HKCC:\\', 'HKEY_CURRENT_CONFIG\' - $key = $key -replace '^HKPD:\\', 'HKEY_PERFORMANCE_DATA\' - } - ElseIf ($Key -match '^HKLM:|^HKCU:|^HKCR:|^HKU:|^HKCC:|^HKPD:') { - # Converts registry paths that start with, e.g.: HKLM: - $key = $key -replace '^HKLM:', 'HKEY_LOCAL_MACHINE\' - $key = $key -replace '^HKCR:', 'HKEY_CLASSES_ROOT\' - $key = $key -replace '^HKCU:', 'HKEY_CURRENT_USER\' - $key = $key -replace '^HKU:', 'HKEY_USERS\' - $key = $key -replace '^HKCC:', 'HKEY_CURRENT_CONFIG\' - $key = $key -replace '^HKPD:', 'HKEY_PERFORMANCE_DATA\' - } - ElseIf ($Key -match '^HKLM\\|^HKCU\\|^HKCR\\|^HKU\\|^HKCC\\|^HKPD\\') { - # Converts registry paths that start with, e.g.: HKLM\ - $key = $key -replace '^HKLM\\', 'HKEY_LOCAL_MACHINE\' - $key = $key -replace '^HKCR\\', 'HKEY_CLASSES_ROOT\' - $key = $key -replace '^HKCU\\', 'HKEY_CURRENT_USER\' - $key = $key -replace '^HKU\\', 'HKEY_USERS\' - $key = $key -replace '^HKCC\\', 'HKEY_CURRENT_CONFIG\' - $key = $key -replace '^HKPD\\', 'HKEY_PERFORMANCE_DATA\' - } - - If ($PSBoundParameters.ContainsKey('SID')) { - ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID - If ($key -match '^HKEY_CURRENT_USER\\') { $key = $key -replace '^HKEY_CURRENT_USER\\', "HKEY_USERS\$SID\" } - } - - ## Append the PowerShell drive to the registry key path - If ($key -notmatch '^Registry::') {[string]$key = "Registry::$key" } - - If($Key -match '^Registry::HKEY_LOCAL_MACHINE|^Registry::HKEY_CLASSES_ROOT|^Registry::HKEY_CURRENT_USER|^Registry::HKEY_USERS|^Registry::HKEY_CURRENT_CONFIG|^Registry::HKEY_PERFORMANCE_DATA') { - ## Check for expected key string format - Write-Log -Message "Return fully qualified registry key path [$key]." -Source ${CmdletName} - Write-Output -InputObject $key - } - Else{ - # If key string is not properly formatted, throw an error - Throw "Unable to detect target registry hive in string [$key]." - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$DisableFunctionLogging = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Convert the registry key hive to the full path, only match if at the beginning of the line + If ($Key -match '^HKLM') { + $Key = $Key -replace '^HKLM:\\', 'HKEY_LOCAL_MACHINE\' -replace '^HKLM:', 'HKEY_LOCAL_MACHINE\' -replace '^HKLM\\', 'HKEY_LOCAL_MACHINE\' + } + ElseIf ($Key -match '^HKCR') { + $Key = $Key -replace '^HKCR:\\', 'HKEY_CLASSES_ROOT\' -replace '^HKCR:', 'HKEY_CLASSES_ROOT\' -replace '^HKCR\\', 'HKEY_CLASSES_ROOT\' + } + ElseIf ($Key -match '^HKCU') { + $Key = $Key -replace '^HKCU:\\', 'HKEY_CURRENT_USER\' -replace '^HKCU:', 'HKEY_CURRENT_USER\' -replace '^HKCU\\', 'HKEY_CURRENT_USER\' + } + ElseIf ($Key -match '^HKU') { + $Key = $Key -replace '^HKU:\\', 'HKEY_USERS\' -replace '^HKU:', 'HKEY_USERS\' -replace '^HKU\\', 'HKEY_USERS\' + } + ElseIf ($Key -match '^HKCC') { + $Key = $Key -replace '^HKCC:\\', 'HKEY_CURRENT_CONFIG\' -replace '^HKCC:', 'HKEY_CURRENT_CONFIG\' -replace '^HKCC\\', 'HKEY_CURRENT_CONFIG\' + } + ElseIf ($Key -match '^HKPD') { + $Key = $Key -replace '^HKPD:\\', 'HKEY_PERFORMANCE_DATA\' -replace '^HKPD:', 'HKEY_PERFORMANCE_DATA\' -replace '^HKPD\\', 'HKEY_PERFORMANCE_DATA\' + } + + ## Append the PowerShell provider to the registry key path + If ($key -notmatch '^Registry::') { + [String]$key = "Registry::$key" + } + + If ($PSBoundParameters.ContainsKey('SID')) { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($key -match '^Registry::HKEY_CURRENT_USER\\') { + $key = $key -replace '^Registry::HKEY_CURRENT_USER\\', "Registry::HKEY_USERS\$SID\" + } + ElseIf (-not $DisableFunctionLogging) { + Write-Log -Message 'SID parameter specified but the registry hive of the key is not HKEY_CURRENT_USER.' -Source ${CmdletName} -Severity 2 + } + } + + If ($Key -match '^Registry::HKEY_LOCAL_MACHINE|^Registry::HKEY_CLASSES_ROOT|^Registry::HKEY_CURRENT_USER|^Registry::HKEY_USERS|^Registry::HKEY_CURRENT_CONFIG|^Registry::HKEY_PERFORMANCE_DATA') { + ## Check for expected key string format + If (-not $DisableFunctionLogging) { + Write-Log -Message "Return fully qualified registry key path [$key]." -Source ${CmdletName} + } + Write-Output -InputObject ($key) + } + Else { + # If key string is not properly formatted, throw an error + Throw "Unable to detect target registry hive in string [$key]." + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-RegistryValue Function Test-RegistryValue { -<# + <# .SYNOPSIS - Test if a registry value exists. + +Test if a registry value exists. + .DESCRIPTION - Checks a registry key path to see if it has a value with a given name. Can correctly handle cases where a value simply has an empty or null value. -.PARAMETER Key - Path of the registry key. + +Checks a registry key path to see if it has a value with a given name. Can correctly handle cases where a value simply has an empty or null value. + +.PARAMETER Key + +Path of the registry key. + .PARAMETER Value - Specify the registry key value to check the existence of. + +Specify the registry key value to check the existence of. + .PARAMETER SID - The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. - Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.INPUTS + +System.String + +Accepts a string value for the registry key path. + +.OUTPUTS + +System.String + +Returns $true if the registry value exists, $false if it does not. + .EXAMPLE - Test-RegistryValue -Key 'HKLM:SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations' + +Test-RegistryValue -Key 'HKLM:SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations' + .NOTES - To test if registry key exists, use Test-Path function like so: - Test-Path -Path $Key -PathType 'Container' + +To test if registry key exists, use Test-Path function like so: + +Test-Path -Path $Key -PathType 'Container' + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - Param ( - [Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()]$Key, - [Parameter(Mandatory=$true,Position=1)] - [ValidateNotNullOrEmpty()]$Value, - [Parameter(Mandatory=$false,Position=2)] - [ValidateNotNullorEmpty()] - [string]$SID - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID - Try { - If ($PSBoundParameters.ContainsKey('SID')) { - [string]$Key = Convert-RegistryPath -Key $Key -SID $SID - } - Else { - [string]$Key = Convert-RegistryPath -Key $Key - } - } - Catch { - Throw - } - [boolean]$IsRegistryValueExists = $false - Try { - If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { - [string[]]$PathProperties = Get-Item -LiteralPath $Key -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Property' -ErrorAction 'Stop' - If ($PathProperties -contains $Value) { $IsRegistryValueExists = $true } - } - } - Catch { } - - If ($IsRegistryValueExists) { - Write-Log -Message "Registry key value [$Key] [$Value] does exist." -Source ${CmdletName} - } - Else { - Write-Log -Message "Registry key value [$Key] [$Value] does not exist." -Source ${CmdletName} - } - Write-Output -InputObject $IsRegistryValueExists - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()]$Key, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullOrEmpty()]$Value, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNullorEmpty()] + [String]$SID + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + Try { + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$Key = Convert-RegistryPath -Key $Key -SID $SID + } + Else { + [String]$Key = Convert-RegistryPath -Key $Key + } + } + Catch { + Throw + } + [Boolean]$IsRegistryValueExists = $false + Try { + If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { + [String[]]$PathProperties = Get-Item -LiteralPath $Key -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Property' -ErrorAction 'Stop' + If ($PathProperties -contains $Value) { + $IsRegistryValueExists = $true + } + } + } + Catch { + } + + If ($IsRegistryValueExists) { + Write-Log -Message "Registry key value [$Key] [$Value] does exist." -Source ${CmdletName} + } + Else { + Write-Log -Message "Registry key value [$Key] [$Value] does not exist." -Source ${CmdletName} + } + Write-Output -InputObject ($IsRegistryValueExists) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-RegistryKey Function Get-RegistryKey { -<# + <# .SYNOPSIS - Retrieves value names and value data for a specified registry key or optionally, a specific value. + +Retrieves value names and value data for a specified registry key or optionally, a specific value. + .DESCRIPTION - Retrieves value names and value data for a specified registry key or optionally, a specific value. - If the registry key does not exist or contain any values, the function will return $null by default. To test for existence of a registry key path, use built-in Test-Path cmdlet. + +Retrieves value names and value data for a specified registry key or optionally, a specific value. + +If the registry key does not exist or contain any values, the function will return $null by default. To test for existence of a registry key path, use built-in Test-Path cmdlet. + .PARAMETER Key - Path of the registry key. + +Path of the registry key. + .PARAMETER Value - Value to retrieve (optional). + +Value to retrieve (optional). + .PARAMETER SID - The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. - Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + .PARAMETER ReturnEmptyKeyIfExists - Return the registry key if it exists but it has no property/value pairs underneath it. Default is: $false. + +Return the registry key if it exists but it has no property/value pairs underneath it. Default is: $false. + .PARAMETER DoNotExpandEnvironmentNames - Return unexpanded REG_EXPAND_SZ values. Default is: $false. + +Return unexpanded REG_EXPAND_SZ values. Default is: $false. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the value of the registry key or value. + .EXAMPLE - Get-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + +Get-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + .EXAMPLE - Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe' + +Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe' + .EXAMPLE - Get-RegistryKey -Key 'HKLM:Software\Wow6432Node\Microsoft\Microsoft SQL Server Compact Edition\v3.5' -Value 'Version' + +Get-RegistryKey -Key 'HKLM:Software\Wow6432Node\Microsoft\Microsoft SQL Server Compact Edition\v3.5' -Value 'Version' + .EXAMPLE - Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Value 'Path' -DoNotExpandEnvironmentNames - Returns %ProgramFiles%\Java instead of C:\Program Files\Java + +Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Value 'Path' -DoNotExpandEnvironmentNames + +Returns %ProgramFiles%\Java instead of C:\Program Files\Java + .EXAMPLE - Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Value '(Default)' + +Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Value '(Default)' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Key, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$Value, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$SID, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$ReturnEmptyKeyIfExists = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$DoNotExpandEnvironmentNames = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID - If ($PSBoundParameters.ContainsKey('SID')) { - [string]$key = Convert-RegistryPath -Key $key -SID $SID - } - Else { - [string]$key = Convert-RegistryPath -Key $key - } - - ## Check if the registry key exists - If (-not (Test-Path -LiteralPath $key -ErrorAction 'Stop')) { - Write-Log -Message "Registry key [$key] does not exist. Return `$null." -Severity 2 -Source ${CmdletName} - $regKeyValue = $null - } - Else { - If ($PSBoundParameters.ContainsKey('Value')) { - Write-Log -Message "Get registry key [$key] value [$value]." -Source ${CmdletName} - } - Else { - Write-Log -Message "Get registry key [$key] and all property values." -Source ${CmdletName} - } - - ## Get all property values for registry key - $regKeyValue = Get-ItemProperty -LiteralPath $key -ErrorAction 'Stop' - [int32]$regKeyValuePropertyCount = $regKeyValue | Measure-Object | Select-Object -ExpandProperty 'Count' - - ## Select requested property - If ($PSBoundParameters.ContainsKey('Value')) { - # Check if registry value exists - [boolean]$IsRegistryValueExists = $false - If ($regKeyValuePropertyCount -gt 0) { - Try { - [string[]]$PathProperties = Get-Item -LiteralPath $Key -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Property' -ErrorAction 'Stop' - If ($PathProperties -contains $Value) { $IsRegistryValueExists = $true } - } - Catch { } - } - - # Get the Value (do not make a strongly typed variable because it depends entirely on what kind of value is being read) - If ($IsRegistryValueExists) { - If ($DoNotExpandEnvironmentNames) { #Only useful on 'ExpandString' values - If ($Value -like '(Default)') { - $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($null,$null,[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) - } - Else { - $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($Value,$null,[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) - } - } - ElseIf ($Value -like '(Default)') { - $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($null) - } - Else { - $regKeyValue = $regKeyValue | Select-Object -ExpandProperty $Value -ErrorAction 'SilentlyContinue' - } - } - Else { - Write-Log -Message "Registry key value [$Key] [$Value] does not exist. Return `$null." -Source ${CmdletName} - $regKeyValue = $null - } - } - ## Select all properties or return empty key object - Else { - If ($regKeyValuePropertyCount -eq 0) { - If ($ReturnEmptyKeyIfExists) { - Write-Log -Message "No property values found for registry key. Return empty registry key object [$key]." -Source ${CmdletName} - $regKeyValue = Get-Item -LiteralPath $key -Force -ErrorAction 'Stop' - } - Else { - Write-Log -Message "No property values found for registry key. Return `$null." -Source ${CmdletName} - $regKeyValue = $null - } - } - } - } - Write-Output -InputObject ($regKeyValue) - } - Catch { - If (-not $Value) { - Write-Log -Message "Failed to read registry key [$key]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to read registry key [$key]: $($_.Exception.Message)" - } - } - Else { - Write-Log -Message "Failed to read registry key [$key] value [$value]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to read registry key [$key] value [$value]: $($_.Exception.Message)" - } - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Value, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$ReturnEmptyKeyIfExists = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$DoNotExpandEnvironmentNames = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$key = Convert-RegistryPath -Key $key -SID $SID + } + Else { + [String]$key = Convert-RegistryPath -Key $key + } + + ## Check if the registry key exists + If (-not (Test-Path -LiteralPath $key -ErrorAction 'Stop')) { + Write-Log -Message "Registry key [$key] does not exist. Return `$null." -Severity 2 -Source ${CmdletName} + $regKeyValue = $null + } + Else { + If ($PSBoundParameters.ContainsKey('Value')) { + Write-Log -Message "Getting registry key [$key] value [$value]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Getting registry key [$key] and all property values." -Source ${CmdletName} + } + + ## Get all property values for registry key + $regKeyValue = Get-ItemProperty -LiteralPath $key -ErrorAction 'Stop' + [Int32]$regKeyValuePropertyCount = $regKeyValue | Measure-Object | Select-Object -ExpandProperty 'Count' + + ## Select requested property + If ($PSBoundParameters.ContainsKey('Value')) { + # Check if registry value exists + [Boolean]$IsRegistryValueExists = $false + If ($regKeyValuePropertyCount -gt 0) { + Try { + [string[]]$PathProperties = Get-Item -LiteralPath $Key -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Property' -ErrorAction 'Stop' + If ($PathProperties -contains $Value) { + $IsRegistryValueExists = $true + } + } + Catch { + } + } + + # Get the Value (do not make a strongly typed variable because it depends entirely on what kind of value is being read) + If ($IsRegistryValueExists) { + If ($DoNotExpandEnvironmentNames) { + #Only useful on 'ExpandString' values + If ($Value -like '(Default)') { + $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($null, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) + } + Else { + $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($Value, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) + } + } + ElseIf ($Value -like '(Default)') { + $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($null) + } + Else { + $regKeyValue = $regKeyValue | Select-Object -ExpandProperty $Value -ErrorAction 'SilentlyContinue' + } + } + Else { + Write-Log -Message "Registry key value [$Key] [$Value] does not exist. Return `$null." -Source ${CmdletName} + $regKeyValue = $null + } + } + ## Select all properties or return empty key object + Else { + If ($regKeyValuePropertyCount -eq 0) { + If ($ReturnEmptyKeyIfExists) { + Write-Log -Message "No property values found for registry key. Return empty registry key object [$key]." -Source ${CmdletName} + $regKeyValue = Get-Item -LiteralPath $key -Force -ErrorAction 'Stop' + } + Else { + Write-Log -Message "No property values found for registry key. Return `$null." -Source ${CmdletName} + $regKeyValue = $null + } + } + } + } + Write-Output -InputObject ($regKeyValue) + } + Catch { + If (-not $Value) { + Write-Log -Message "Failed to read registry key [$key]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read registry key [$key]: $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Failed to read registry key [$key] value [$value]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read registry key [$key] value [$value]: $($_.Exception.Message)" + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-RegistryKey Function Set-RegistryKey { -<# + <# .SYNOPSIS - Creates a registry key name, value, and value data; it sets the same if it already exists. + +Creates a registry key name, value, and value data; it sets the same if it already exists. + .DESCRIPTION - Creates a registry key name, value, and value data; it sets the same if it already exists. + +Creates a registry key name, value, and value data; it sets the same if it already exists. + .PARAMETER Key - The registry key path. + +The registry key path. + .PARAMETER Name - The value name. + +The value name. + .PARAMETER Value - The value data. + +The value data. + .PARAMETER Type - The type of registry value to create or set. Options: 'Binary','DWord','ExpandString','MultiString','None','QWord','String','Unknown'. Default: String. - Dword should be specified as a decimal. + +The type of registry value to create or set. Options: 'Binary','DWord','ExpandString','MultiString','None','QWord','String','Unknown'. Default: String. + +DWord should be specified as a decimal. + .PARAMETER SID - The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. - Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Set-RegistryKey -Key $blockedAppPath -Name 'Debugger' -Value $blockedAppDebuggerValue + +Set-RegistryKey -Key $blockedAppPath -Name 'Debugger' -Value $blockedAppDebuggerValue + .EXAMPLE - Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE' -Name 'Application' -Type 'Dword' -Value '1' + +Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE' -Name 'Application' -Type 'DWord' -Value '1' + .EXAMPLE - Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce' -Name 'Debugger' -Value $blockedAppDebuggerValue -Type String + +Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce' -Name 'Debugger' -Value $blockedAppDebuggerValue -Type String + .EXAMPLE - Set-RegistryKey -Key 'HKCU\Software\Microsoft\Example' -Name 'Data' -Value (0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x02,0x02,0x02) -Type 'Binary' + +Set-RegistryKey -Key 'HKCU\Software\Microsoft\Example' -Name 'Data' -Value (0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x02,0x02,0x02) -Type 'Binary' + .EXAMPLE - Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Value '(Default)' + +Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Name '(Default)' -Value "Text" + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Key, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - $Value, - [Parameter(Mandatory=$false)] - [ValidateSet('Binary','DWord','ExpandString','MultiString','None','QWord','String','Unknown')] - [Microsoft.Win32.RegistryValueKind]$Type = 'String', - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$SID, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - [string]$RegistryValueWriteAction = 'set' - - ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID - If ($PSBoundParameters.ContainsKey('SID')) { - [string]$key = Convert-RegistryPath -Key $key -SID $SID - } - Else { - [string]$key = Convert-RegistryPath -Key $key - } - - ## Create registry key if it doesn't exist - If (-not (Test-Path -LiteralPath $key -ErrorAction 'Stop')) { - Try { - Write-Log -Message "Create registry key [$key]." -Source ${CmdletName} - # No forward slash found in Key. Use New-Item cmdlet to create registry key - If ((($Key -split '/').Count - 1) -eq 0) - { - $null = New-Item -Path $key -ItemType 'Registry' -Force -ErrorAction 'Stop' - } - # Forward slash was found in Key. Use REG.exe ADD to create registry key - Else - { - [string]$CreateRegkeyResult = & reg.exe Add "$($Key.Substring($Key.IndexOf('::') + 2))" - If ($global:LastExitCode -ne 0) - { - Throw "Failed to create registry key [$Key]" - } - } - } - Catch { - Throw - } - } - - If ($Name) { - ## Set registry value if it doesn't exist - If (-not (Get-ItemProperty -LiteralPath $key -Name $Name -ErrorAction 'SilentlyContinue')) { - Write-Log -Message "Set registry key value: [$key] [$name = $value]." -Source ${CmdletName} - $null = New-ItemProperty -LiteralPath $key -Name $name -Value $value -PropertyType $Type -ErrorAction 'Stop' - } - ## Update registry value if it does exist - Else { - [string]$RegistryValueWriteAction = 'update' - If ($Name -eq '(Default)') { - ## Set Default registry key value with the following workaround, because Set-ItemProperty contains a bug and cannot set Default registry key value - $null = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').OpenSubKey('','ReadWriteSubTree').SetValue($null,$value) - } - Else { - Write-Log -Message "Update registry key value: [$key] [$name = $value]." -Source ${CmdletName} - $null = Set-ItemProperty -LiteralPath $key -Name $name -Value $value -ErrorAction 'Stop' - } - } - } - } - Catch { - If ($Name) { - Write-Log -Message "Failed to $RegistryValueWriteAction value [$value] for registry key [$key] [$name]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to $RegistryValueWriteAction value [$value] for registry key [$key] [$name]: $($_.Exception.Message)" - } - } - Else { - Write-Log -Message "Failed to set registry key [$key]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to set registry key [$key]: $($_.Exception.Message)" - } - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + $Value, + [Parameter(Mandatory = $false)] + [ValidateSet('Binary', 'DWord', 'ExpandString', 'MultiString', 'None', 'QWord', 'String', 'Unknown')] + [Microsoft.Win32.RegistryValueKind]$Type = 'String', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + [String]$RegistryValueWriteAction = 'set' + + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$key = Convert-RegistryPath -Key $key -SID $SID + } + Else { + [String]$key = Convert-RegistryPath -Key $key + } + + ## Create registry key if it doesn't exist + If (-not (Test-Path -LiteralPath $key -ErrorAction 'Stop')) { + Try { + Write-Log -Message "Creating registry key [$key]." -Source ${CmdletName} + # No forward slash found in Key. Use New-Item cmdlet to create registry key + If ((($Key -split '/').Count - 1) -eq 0) { + $null = New-Item -Path $key -ItemType 'Registry' -Force -ErrorAction 'Stop' + } + # Forward slash was found in Key. Use REG.exe ADD to create registry key + Else { + [String]$CreateRegkeyResult = & "$envWinDir\System32\reg.exe" Add "$($Key.Substring($Key.IndexOf('::') + 2))" + If ($global:LastExitCode -ne 0) { + Throw "Failed to create registry key [$Key]" + } + } + } + Catch { + Throw + } + } + + If ($Name) { + ## Set registry value if it doesn't exist + If (-not (Get-ItemProperty -LiteralPath $key -Name $Name -ErrorAction 'SilentlyContinue')) { + Write-Log -Message "Setting registry key value: [$key] [$name = $value]." -Source ${CmdletName} + $null = New-ItemProperty -LiteralPath $key -Name $name -Value $value -PropertyType $Type -ErrorAction 'Stop' + } + ## Update registry value if it does exist + Else { + [String]$RegistryValueWriteAction = 'update' + If ($Name -eq '(Default)') { + ## Set Default registry key value with the following workaround, because Set-ItemProperty contains a bug and cannot set Default registry key value + $null = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').OpenSubKey('', 'ReadWriteSubTree').SetValue($null, $value) + } + Else { + Write-Log -Message "Updating registry key value: [$key] [$name = $value]." -Source ${CmdletName} + $null = Set-ItemProperty -LiteralPath $key -Name $name -Value $value -ErrorAction 'Stop' + } + } + } + } + Catch { + If ($Name) { + Write-Log -Message "Failed to $RegistryValueWriteAction value [$value] for registry key [$key] [$name]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to $RegistryValueWriteAction value [$value] for registry key [$key] [$name]: $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Failed to set registry key [$key]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to set registry key [$key]: $($_.Exception.Message)" + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Remove-RegistryKey Function Remove-RegistryKey { -<# + <# .SYNOPSIS - Deletes the specified registry key or value. + +Deletes the specified registry key or value. + .DESCRIPTION - Deletes the specified registry key or value. + +Deletes the specified registry key or value. + .PARAMETER Key - Path of the registry key to delete. + +Path of the registry key to delete. + .PARAMETER Name - Name of the registry value to delete. + +Name of the registry value to delete. + .PARAMETER Recurse - Delete registry key recursively. + +Delete registry key recursively. + .PARAMETER SID - The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. - Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Remove-RegistryKey -Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce' + +Remove-RegistryKey -Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce' + .EXAMPLE - Remove-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name 'RunAppInstall' + +Remove-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name 'RunAppInstall' + +.EXAMPLE + +Remove-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Name '(Default)' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Key, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [switch]$Recurse, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$SID, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID - If ($PSBoundParameters.ContainsKey('SID')) { - [string]$Key = Convert-RegistryPath -Key $Key -SID $SID - } - Else { - [string]$Key = Convert-RegistryPath -Key $Key - } - - If (-not ($Name)) { - If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { - If ($Recurse) { - Write-Log -Message "Delete registry key recursively [$Key]." -Source ${CmdletName} - $null = Remove-Item -LiteralPath $Key -Force -Recurse -ErrorAction 'Stop' - } - Else { - If ($null -eq (Get-ChildItem -LiteralPath $Key -ErrorAction 'Stop')){ - ## Check if there are subkeys of $Key, if so, executing Remove-Item will hang. Avoiding this with Get-ChildItem. - Write-Log -Message "Delete registry key [$Key]." -Source ${CmdletName} - $null = Remove-Item -LiteralPath $Key -Force -ErrorAction 'Stop' - } - Else { - Throw "Unable to delete child key(s) of [$Key] without [-Recurse] switch." - } - } - } - Else { - Write-Log -Message "Unable to delete registry key [$Key] because it does not exist." -Severity 2 -Source ${CmdletName} - } - } - Else { - If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { - Write-Log -Message "Delete registry value [$Key] [$Name]." -Source ${CmdletName} - - If ($Name -eq '(Default)') { - ## Remove (Default) registry key value with the following workaround because Remove-ItemProperty cannot remove the (Default) registry key value - $null = (Get-Item -LiteralPath $Key -ErrorAction 'Stop').OpenSubKey('','ReadWriteSubTree').DeleteValue('') - } - Else { - $null = Remove-ItemProperty -LiteralPath $Key -Name $Name -Force -ErrorAction 'Stop' - } - } - Else { - Write-Log -Message "Unable to delete registry value [$Key] [$Name] because registry key does not exist." -Severity 2 -Source ${CmdletName} - } - } - } - Catch [System.Management.Automation.PSArgumentException] { - Write-Log -Message "Unable to delete registry value [$Key] [$Name] because it does not exist." -Severity 2 -Source ${CmdletName} - } - Catch { - If (-not ($Name)) { - Write-Log -Message "Failed to delete registry key [$Key]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to delete registry key [$Key]: $($_.Exception.Message)" - } - } - Else { - Write-Log -Message "Failed to delete registry value [$Key] [$Name]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to delete registry value [$Key] [$Name]: $($_.Exception.Message)" - } - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [Switch]$Recurse, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$Key = Convert-RegistryPath -Key $Key -SID $SID + } + Else { + [String]$Key = Convert-RegistryPath -Key $Key + } + + If (-not $Name) { + If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { + If ($Recurse) { + Write-Log -Message "Deleting registry key recursively [$Key]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $Key -Force -Recurse -ErrorAction 'Stop' + } + Else { + If ($null -eq (Get-ChildItem -LiteralPath $Key -ErrorAction 'Stop')) { + ## Check if there are subkeys of $Key, if so, executing Remove-Item will hang. Avoiding this with Get-ChildItem. + Write-Log -Message "Deleting registry key [$Key]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $Key -Force -ErrorAction 'Stop' + } + Else { + Throw "Unable to delete child key(s) of [$Key] without [-Recurse] switch." + } + } + } + Else { + Write-Log -Message "Unable to delete registry key [$Key] because it does not exist." -Severity 2 -Source ${CmdletName} + } + } + Else { + If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { + Write-Log -Message "Deleting registry value [$Key] [$Name]." -Source ${CmdletName} + + If ($Name -eq '(Default)') { + ## Remove (Default) registry key value with the following workaround because Remove-ItemProperty cannot remove the (Default) registry key value + $null = (Get-Item -LiteralPath $Key -ErrorAction 'Stop').OpenSubKey('', 'ReadWriteSubTree').DeleteValue('') + } + Else { + $null = Remove-ItemProperty -LiteralPath $Key -Name $Name -Force -ErrorAction 'Stop' + } + } + Else { + Write-Log -Message "Unable to delete registry value [$Key] [$Name] because registry key does not exist." -Severity 2 -Source ${CmdletName} + } + } + } + Catch [System.Management.Automation.PSArgumentException] { + Write-Log -Message "Unable to delete registry value [$Key] [$Name] because it does not exist." -Severity 2 -Source ${CmdletName} + } + Catch { + If (-not $Name) { + Write-Log -Message "Failed to delete registry key [$Key]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete registry key [$Key]: $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Failed to delete registry value [$Key] [$Name]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete registry value [$Key] [$Name]: $($_.Exception.Message)" + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Invoke-HKCURegistrySettingsForAllUsers Function Invoke-HKCURegistrySettingsForAllUsers { -<# + <# .SYNOPSIS - Set current user registry settings for all current users and any new users in the future. + +Set current user registry settings for all current users and any new users in the future. + .DESCRIPTION - Set HKCU registry settings for all current and future users by loading their NTUSER.dat registry hive file, and making the modifications. - This function will modify HKCU settings for all users even when executed under the SYSTEM account. - To ensure new users in the future get the registry edits, the Default User registry hive used to provision the registry for new users is modified. - This function can be used as an alternative to using ActiveSetup for registry settings. - The advantage of using this function over ActiveSetup is that a user does not have to log off and log back on before the changes take effect. + +Set HKCU registry settings for all current and future users by loading their NTUSER.dat registry hive file, and making the modifications. + +This function will modify HKCU settings for all users even when executed under the SYSTEM account. + +To ensure new users in the future get the registry edits, the Default User registry hive used to provision the registry for new users is modified. + +This function can be used as an alternative to using ActiveSetup for registry settings. + +The advantage of using this function over ActiveSetup is that a user does not have to log off and log back on before the changes take effect. + .PARAMETER RegistrySettings - Script block which contains HKCU registry settings which should be modified for all users on the system. Must specify the -SID parameter for all HKCU settings. + +Script block which contains HKCU registry settings which should be modified for all users on the system. Must specify the -SID parameter for all HKCU settings. + .PARAMETER UserProfiles - Specify the user profiles to modify HKCU registry settings for. Default is all user profiles except for system profiles. + +Specify the user profiles to modify HKCU registry settings for. Default is all user profiles except for system profiles. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - [scriptblock]$HKCURegistrySettings = { - Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID - Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID - } - Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings + +[ScriptBlock]$HKCURegistrySettings = { + +Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID + +Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID + +} + +Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [scriptblock]$RegistrySettings, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [psobject[]]$UserProfiles = (Get-UserProfiles) - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ForEach ($UserProfile in $UserProfiles) { - Try { - # Set the path to the user's registry hive when it is loaded - [string]$UserRegistryPath = "Registry::HKEY_USERS\$($UserProfile.SID)" - - # Set the path to the user's registry hive file - [string]$UserRegistryHiveFile = Join-Path -Path $UserProfile.ProfilePath -ChildPath 'NTUSER.DAT' - - # Load the User profile registry hive if it is not already loaded because the User is logged in - [boolean]$ManuallyLoadedRegHive = $false - If (-not (Test-Path -LiteralPath $UserRegistryPath)) { - # Load the User registry hive if the registry hive file exists - If (Test-Path -LiteralPath $UserRegistryHiveFile -PathType 'Leaf') { - Write-Log -Message "Load the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} - [string]$HiveLoadResult = & reg.exe load "`"HKEY_USERS\$($UserProfile.SID)`"" "`"$UserRegistryHiveFile`"" - - If ($global:LastExitCode -ne 0) { - Throw "Failed to load the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. Failure message [$HiveLoadResult]. Continue..." - } - - [boolean]$ManuallyLoadedRegHive = $true - } - Else { - Throw "Failed to find the registry hive file [$UserRegistryHiveFile] for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. Continue..." - } - } - Else { - Write-Log -Message "The User [$($UserProfile.NTAccount)] registry hive is already loaded in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} - } - - ## Execute ScriptBlock which contains code to manipulate HKCU registry. - # Make sure read/write calls to the HKCU registry hive specify the -SID parameter or settings will not be changed for all users. - # Example: Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID - Write-Log -Message 'Execute ScriptBlock to modify HKCU registry settings for all users.' -Source ${CmdletName} - & $RegistrySettings - } - Catch { - Write-Log -Message "Failed to modify the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)] `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - Finally { - If ($ManuallyLoadedRegHive) { - Try { - Write-Log -Message "Unload the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} - [string]$HiveLoadResult = & reg.exe unload "`"HKEY_USERS\$($UserProfile.SID)`"" - - If ($global:LastExitCode -ne 0) { - Write-Log -Message "REG.exe failed to unload the registry hive and exited with exit code [$($global:LastExitCode)]. Performing manual garbage collection to ensure successful unloading of registry hive." -Severity 2 -Source ${CmdletName} - [GC]::Collect() - [GC]::WaitForPendingFinalizers() - Start-Sleep -Seconds 5 - - Write-Log -Message "Unload the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} - [string]$HiveLoadResult = & reg.exe unload "`"HKEY_USERS\$($UserProfile.SID)`"" - If ($global:LastExitCode -ne 0) { Throw "REG.exe failed with exit code [$($global:LastExitCode)] and result [$HiveLoadResult]." } - } - } - Catch { - Write-Log -Message "Failed to unload the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [ScriptBlock]$RegistrySettings, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [PSObject[]]$UserProfiles = (Get-UserProfiles) + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ForEach ($UserProfile in $UserProfiles) { + Try { + # Set the path to the user's registry hive when it is loaded + [String]$UserRegistryPath = "Registry::HKEY_USERS\$($UserProfile.SID)" + + # Set the path to the user's registry hive file + [String]$UserRegistryHiveFile = Join-Path -Path $UserProfile.ProfilePath -ChildPath 'NTUSER.DAT' + + # Load the User profile registry hive if it is not already loaded because the User is logged in + [Boolean]$ManuallyLoadedRegHive = $false + If (-not (Test-Path -LiteralPath $UserRegistryPath)) { + # Load the User registry hive if the registry hive file exists + If (Test-Path -LiteralPath $UserRegistryHiveFile -PathType 'Leaf') { + Write-Log -Message "Loading the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + [String]$HiveLoadResult = & "$envWinDir\System32\reg.exe" load "`"HKEY_USERS\$($UserProfile.SID)`"" "`"$UserRegistryHiveFile`"" + + If ($global:LastExitCode -ne 0) { + Throw "Failed to load the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. Failure message [$HiveLoadResult]. Continue..." + } + + [Boolean]$ManuallyLoadedRegHive = $true + } + Else { + Throw "Failed to find the registry hive file [$UserRegistryHiveFile] for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. Continue..." + } + } + Else { + Write-Log -Message "The user [$($UserProfile.NTAccount)] registry hive is already loaded in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + } + + ## Execute ScriptBlock which contains code to manipulate HKCU registry. + # Make sure read/write calls to the HKCU registry hive specify the -SID parameter or settings will not be changed for all users. + # Example: Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID + Write-Log -Message 'Executing ScriptBlock to modify HKCU registry settings for all users.' -Source ${CmdletName} + & $RegistrySettings + } + Catch { + Write-Log -Message "Failed to modify the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)] `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + Finally { + If ($ManuallyLoadedRegHive) { + Try { + Write-Log -Message "Unload the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + [String]$HiveLoadResult = & "$envWinDir\System32\reg.exe" unload "`"HKEY_USERS\$($UserProfile.SID)`"" + + If ($global:LastExitCode -ne 0) { + Write-Log -Message "REG.exe failed to unload the registry hive and exited with exit code [$($global:LastExitCode)]. Performing manual garbage collection to ensure successful unloading of registry hive." -Severity 2 -Source ${CmdletName} + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Start-Sleep -Seconds 5 + + Write-Log -Message "Unload the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + [String]$HiveLoadResult = & "$envWinDir\System32\reg.exe" unload "`"HKEY_USERS\$($UserProfile.SID)`"" + If ($global:LastExitCode -ne 0) { + Throw "REG.exe failed with exit code [$($global:LastExitCode)] and result [$HiveLoadResult]." + } + } + } + Catch { + Write-Log -Message "Failed to unload the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function ConvertTo-NTAccountOrSID Function ConvertTo-NTAccountOrSID { -<# + <# .SYNOPSIS - Convert between NT Account names and their security identifiers (SIDs). + +Convert between NT Account names and their security identifiers (SIDs). + .DESCRIPTION - Specify either the NT Account name or the SID and get the other. Can also convert well known sid types. + +Specify either the NT Account name or the SID and get the other. Can also convert well known sid types. + .PARAMETER AccountName - The Windows NT Account name specified in \ format. - Use fully qualified account names (e.g., \) instead of isolated names (e.g, ) because they are unambiguous and provide better performance. + +The Windows NT Account name specified in \ format. +Use fully qualified account names (e.g., \) instead of isolated names (e.g, ) because they are unambiguous and provide better performance. + .PARAMETER SID - The Windows NT Account SID. + +The Windows NT Account SID. + .PARAMETER WellKnownSIDName - Specify the Well Known SID name translate to the actual SID (e.g., LocalServiceSid). - To get all well known SIDs available on system: [enum]::GetNames([Security.Principal.WellKnownSidType]) + +Specify the Well Known SID name translate to the actual SID (e.g., LocalServiceSid). + +To get all well known SIDs available on system: [Enum]::GetNames([Security.Principal.WellKnownSidType]) + .PARAMETER WellKnownToNTAccount - Convert the Well Known SID to an NTAccount name + +Convert the Well Known SID to an NTAccount name + +.INPUTS + +System.String + +Accepts a string containing the NT Account name or SID. + +.OUTPUTS + +System.String + +Returns the NT Account name or SID. + .EXAMPLE - ConvertTo-NTAccountOrSID -AccountName 'CONTOSO\User1' - Converts a Windows NT Account name to the corresponding SID + +ConvertTo-NTAccountOrSID -AccountName 'CONTOSO\User1' + +Converts a Windows NT Account name to the corresponding SID + .EXAMPLE - ConvertTo-NTAccountOrSID -SID 'S-1-5-21-1220945662-2111687655-725345543-14012660' - Converts a Windows NT Account SID to the corresponding NT Account Name + +ConvertTo-NTAccountOrSID -SID 'S-1-5-21-1220945662-2111687655-725345543-14012660' + +Converts a Windows NT Account SID to the corresponding NT Account Name + .EXAMPLE - ConvertTo-NTAccountOrSID -WellKnownSIDName 'NetworkServiceSid' - Converts a Well Known SID name to a SID + +ConvertTo-NTAccountOrSID -WellKnownSIDName 'NetworkServiceSid' + +Converts a Well Known SID name to a SID + .NOTES - This is an internal script function and should typically not be called directly. - The conversion can return an empty result if the user account does not exist anymore or if translation fails. - http://blogs.technet.com/b/askds/archive/2011/07/28/troubleshooting-sid-translation-failures-from-the-obvious-to-the-not-so-obvious.aspx + +This is an internal script function and should typically not be called directly. + +The conversion can return an empty result if the user account does not exist anymore or if translation fails. + +http://blogs.technet.com/b/askds/archive/2011/07/28/troubleshooting-sid-translation-failures-from-the-obvious-to-the-not-so-obvious.aspx + +.LINK + +https://psappdeploytoolkit.com + .LINK - http://psappdeploytoolkit.com - List of Well Known SIDs: http://msdn.microsoft.com/en-us/library/system.security.principal.wellknownsidtype(v=vs.110).aspx + +http://msdn.microsoft.com/en-us/library/system.security.principal.wellknownsidtype(v=vs.110).aspx + #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,ParameterSetName='NTAccountToSID',ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()] - [string]$AccountName, - [Parameter(Mandatory=$true,ParameterSetName='SIDToNTAccount',ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()] - [string]$SID, - [Parameter(Mandatory=$true,ParameterSetName='WellKnownName',ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()] - [string]$WellKnownSIDName, - [Parameter(Mandatory=$false,ParameterSetName='WellKnownName')] - [ValidateNotNullOrEmpty()] - [switch]$WellKnownToNTAccount - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Switch ($PSCmdlet.ParameterSetName) { - 'SIDToNTAccount' { - [string]$msg = "the SID [$SID] to an NT Account name" - Write-Log -Message "Convert $msg." -Source ${CmdletName} - - $NTAccountSID = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList $SID - $NTAccount = $NTAccountSID.Translate([Security.Principal.NTAccount]) - Write-Output -InputObject $NTAccount - } - 'NTAccountToSID' { - [string]$msg = "the NT Account [$AccountName] to a SID" - Write-Log -Message "Convert $msg." -Source ${CmdletName} - - $NTAccount = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList $AccountName - $NTAccountSID = $NTAccount.Translate([Security.Principal.SecurityIdentifier]) - Write-Output -InputObject $NTAccountSID - } - 'WellKnownName' { - If ($WellKnownToNTAccount) { - [string]$ConversionType = 'NTAccount' - } - Else { - [string]$ConversionType = 'SID' - } - [string]$msg = "the Well Known SID Name [$WellKnownSIDName] to a $ConversionType" - Write-Log -Message "Convert $msg." -Source ${CmdletName} - - # Get the SID for the root domain - Try { - $MachineRootDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'Stop').Domain.ToLower() - $ADDomainObj = New-Object -TypeName 'System.DirectoryServices.DirectoryEntry' -ArgumentList "LDAP://$MachineRootDomain" - $DomainSidInBinary = $ADDomainObj.ObjectSid - $DomainSid = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($DomainSidInBinary[0], 0) - } - Catch { - Write-Log -Message 'Unable to get Domain SID from Active Directory. Setting Domain SID to $null.' -Severity 2 -Source ${CmdletName} - $DomainSid = $null - } - - # Get the SID for the well known SID name - $WellKnownSidType = [Security.Principal.WellKnownSidType]::$WellKnownSIDName - $NTAccountSID = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($WellKnownSidType, $DomainSid) - - If ($WellKnownToNTAccount) { - $NTAccount = $NTAccountSID.Translate([Security.Principal.NTAccount]) - Write-Output -InputObject $NTAccount - } - Else { - Write-Output -InputObject $NTAccountSID - } - } - } - } - Catch { - Write-Log -Message "Failed to convert $msg. It may not be a valid account anymore or there is some other problem. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'NTAccountToSID', ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$AccountName, + [Parameter(Mandatory = $true, ParameterSetName = 'SIDToNTAccount', ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$SID, + [Parameter(Mandatory = $true, ParameterSetName = 'WellKnownName', ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$WellKnownSIDName, + [Parameter(Mandatory = $false, ParameterSetName = 'WellKnownName')] + [ValidateNotNullOrEmpty()] + [Switch]$WellKnownToNTAccount + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Switch ($PSCmdlet.ParameterSetName) { + 'SIDToNTAccount' { + [String]$msg = "the SID [$SID] to an NT Account name" + Write-Log -Message "Converting $msg." -Source ${CmdletName} + + $NTAccountSID = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($SID) + $NTAccount = $NTAccountSID.Translate([Security.Principal.NTAccount]) + Write-Output -InputObject ($NTAccount) + } + 'NTAccountToSID' { + [String]$msg = "the NT Account [$AccountName] to a SID" + Write-Log -Message "Converting $msg." -Source ${CmdletName} + + $NTAccount = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList ($AccountName) + $NTAccountSID = $NTAccount.Translate([Security.Principal.SecurityIdentifier]) + Write-Output -InputObject ($NTAccountSID) + } + 'WellKnownName' { + If ($WellKnownToNTAccount) { + [String]$ConversionType = 'NTAccount' + } + Else { + [String]$ConversionType = 'SID' + } + [String]$msg = "the Well Known SID Name [$WellKnownSIDName] to a $ConversionType" + Write-Log -Message "Converting $msg." -Source ${CmdletName} + + # Get the SID for the root domain + Try { + $MachineRootDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'Stop').Domain.ToLower() + $ADDomainObj = New-Object -TypeName 'System.DirectoryServices.DirectoryEntry' -ArgumentList ("LDAP://$MachineRootDomain") + $DomainSidInBinary = $ADDomainObj.ObjectSid + $DomainSid = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($DomainSidInBinary[0], 0) + } + Catch { + Write-Log -Message 'Unable to get Domain SID from Active Directory. Setting Domain SID to $null.' -Severity 2 -Source ${CmdletName} + $DomainSid = $null + } + + # Get the SID for the well known SID name + $WellKnownSidType = [Security.Principal.WellKnownSidType]::$WellKnownSIDName + $NTAccountSID = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($WellKnownSidType, $DomainSid) + + If ($WellKnownToNTAccount) { + $NTAccount = $NTAccountSID.Translate([Security.Principal.NTAccount]) + Write-Output -InputObject ($NTAccount) + } + Else { + Write-Output -InputObject ($NTAccountSID) + } + } + } + } + Catch { + Write-Log -Message "Failed to convert $msg. It may not be a valid account anymore or there is some other problem. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-UserProfiles Function Get-UserProfiles { -<# + <# .SYNOPSIS - Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine and also the Default User (which does not log on). + +Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine and also the Default User (which does not log on). + .DESCRIPTION - Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine and also the Default User (which does not log on). - Please note that the NTAccount property may be empty for some user profiles but the SID and ProfilePath properties will always be populated. + +Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine and also the Default User (which does not log on). + +Please note that the NTAccount property may be empty for some user profiles but the SID and ProfilePath properties will always be populated. + .PARAMETER ExcludeNTAccount - Specify NT account names in Domain\Username format to exclude from the list of user profiles. + +Specify NT account names in Domain\Username format to exclude from the list of user profiles. + .PARAMETER ExcludeSystemProfiles - Exclude system profiles: SYSTEM, LOCAL SERVICE, NETWORK SERVICE. Default is: $true. + +Exclude system profiles: SYSTEM, LOCAL SERVICE, NETWORK SERVICE. Default is: $true. + .PARAMETER ExcludeDefaultUser - Exclude the Default User. Default is: $false. + +Exclude the Default User. Default is: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject. Returns a PSObject with the following properties: NTAccount, SID, ProfilePath + .EXAMPLE - Get-UserProfiles - Returns the following properties for each user profile on the system: NTAccount, SID, ProfilePath + +Get-UserProfiles + +Returns the following properties for each user profile on the system: NTAccount, SID, ProfilePath + +.EXAMPLE + +Get-UserProfiles -ExcludeNTAccount 'CONTOSO\Robot','CONTOSO\ntadmin' + .EXAMPLE - Get-UserProfiles -ExcludeNTAccount 'CONTOSO\Robot','CONTOSO\ntadmin' + +[String[]]$ProfilePaths = Get-UserProfiles | Select-Object -ExpandProperty 'ProfilePath' + +Returns the user profile path for each user on the system. This information can then be used to make modifications under the user profile on the filesystem. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String[]]$ExcludeNTAccount, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ExcludeSystemProfiles = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$ExcludeDefaultUser = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Getting the User Profile Path, User Account SID, and the User Account Name for all users that log onto the machine.' -Source ${CmdletName} + + ## Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine + [String]$UserProfileListRegKey = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' + [PSObject[]]$UserProfiles = Get-ChildItem -LiteralPath $UserProfileListRegKey -ErrorAction 'Stop' | + ForEach-Object { + Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction 'Stop' | Where-Object { ($_.ProfileImagePath) } | + Select-Object @{ Label = 'NTAccount'; Expression = { $(ConvertTo-NTAccountOrSID -SID $_.PSChildName).Value } }, @{ Label = 'SID'; Expression = { $_.PSChildName } }, @{ Label = 'ProfilePath'; Expression = { $_.ProfileImagePath } } + } | + Where-Object { $_.NTAccount } # This removes the "defaultuser0" account, which is a Windows 10 bug + If ($ExcludeSystemProfiles) { + [String[]]$SystemProfiles = 'S-1-5-18', 'S-1-5-19', 'S-1-5-20' + [PSObject[]]$UserProfiles = $UserProfiles | Where-Object { $SystemProfiles -notcontains $_.SID } + } + If ($ExcludeNTAccount) { + [PSObject[]]$UserProfiles = $UserProfiles | Where-Object { $ExcludeNTAccount -notcontains $_.NTAccount } + } + + ## Find the path to the Default User profile + If (-not $ExcludeDefaultUser) { + [String]$UserProfilesDirectory = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'ProfilesDirectory' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'ProfilesDirectory' + + # On Windows Vista or higher + If (([Version]$envOSVersion).Major -gt 5) { + # Path to Default User Profile directory on Windows Vista or higher: By default, C:\Users\Default + [string]$DefaultUserProfileDirectory = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'Default' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Default' + } + # On Windows XP or lower + Else { + # Default User Profile Name: By default, 'Default User' + [string]$DefaultUserProfileName = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'DefaultUserProfile' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'DefaultUserProfile' + + # Path to Default User Profile directory: By default, C:\Documents and Settings\Default User + [String]$DefaultUserProfileDirectory = Join-Path -Path $UserProfilesDirectory -ChildPath $DefaultUserProfileName + } + + ## Create a custom object for the Default User profile. + # Since the Default User is not an actual User account, it does not have a username or a SID. + # We will make up a SID and add it to the custom object so that we have a location to load the default registry hive into later on. + [PSObject]$DefaultUserProfile = New-Object -TypeName 'PSObject' -Property @{ + NTAccount = 'Default User' + SID = 'S-1-5-21-Default-User' + ProfilePath = $DefaultUserProfileDirectory + } + + ## Add the Default User custom object to the User Profile list. + $UserProfiles += $DefaultUserProfile + } + + Write-Output -InputObject ($UserProfiles) + } + Catch { + Write-Log -Message "Failed to create a custom object representing all user profiles on the machine. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-FileVersion +Function Get-FileVersion { + <# +.SYNOPSIS + +Gets the version of the specified file + +.DESCRIPTION + +Gets the version of the specified file + +.PARAMETER File + +Path of the file + +.PARAMETER ProductVersion + +Switch that makes the command return ProductVersion instead of FileVersion + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + .EXAMPLE - [string[]]$ProfilePaths = Get-UserProfiles | Select-Object -ExpandProperty 'ProfilePath' - Returns the user profile path for each user on the system. This information can then be used to make modifications under the user profile on the filesystem. + +Get-FileVersion -File "$envProgramFilesX86\Adobe\Reader 11.0\Reader\AcroRd32.exe" + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string[]]$ExcludeNTAccount, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ExcludeSystemProfiles = $true, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$ExcludeDefaultUser = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Get the User Profile Path, User Account SID, and the User Account Name for all users that log onto the machine.' -Source ${CmdletName} - - ## Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine - [string]$UserProfileListRegKey = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' - [psobject[]]$UserProfiles = Get-ChildItem -LiteralPath $UserProfileListRegKey -ErrorAction 'Stop' | - ForEach-Object { - Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction 'Stop' | Where-Object { ($_.ProfileImagePath) } | - Select-Object @{ Label = 'NTAccount'; Expression = { $(ConvertTo-NTAccountOrSID -SID $_.PSChildName).Value } }, @{ Label = 'SID'; Expression = { $_.PSChildName } }, @{ Label = 'ProfilePath'; Expression = { $_.ProfileImagePath } } - } - If ($ExcludeSystemProfiles) { - [string[]]$SystemProfiles = 'S-1-5-18', 'S-1-5-19', 'S-1-5-20' - [psobject[]]$UserProfiles = $UserProfiles | Where-Object { $SystemProfiles -notcontains $_.SID } - } - If ($ExcludeNTAccount) { - [psobject[]]$UserProfiles = $UserProfiles | Where-Object { $ExcludeNTAccount -notcontains $_.NTAccount } - } - - ## Find the path to the Default User profile - If (-not $ExcludeDefaultUser) { - [string]$UserProfilesDirectory = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'ProfilesDirectory' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'ProfilesDirectory' - - # On Windows Vista or higher - If (([version]$envOSVersion).Major -gt 5) { - # Path to Default User Profile directory on Windows Vista or higher: By default, C:\Users\Default - [string]$DefaultUserProfileDirectory = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'Default' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Default' - } - # On Windows XP or lower - Else { - # Default User Profile Name: By default, 'Default User' - [string]$DefaultUserProfileName = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'DefaultUserProfile' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'DefaultUserProfile' - - # Path to Default User Profile directory: By default, C:\Documents and Settings\Default User - [string]$DefaultUserProfileDirectory = Join-Path -Path $UserProfilesDirectory -ChildPath $DefaultUserProfileName - } - - ## Create a custom object for the Default User profile. - # Since the Default User is not an actual User account, it does not have a username or a SID. - # We will make up a SID and add it to the custom object so that we have a location to load the default registry hive into later on. - [psobject]$DefaultUserProfile = New-Object -TypeName 'PSObject' -Property @{ - NTAccount = 'Default User' - SID = 'S-1-5-21-Default-User' - ProfilePath = $DefaultUserProfileDirectory - } - - ## Add the Default User custom object to the User Profile list. - $UserProfiles += $DefaultUserProfile - } - - Write-Output -InputObject $UserProfiles - } - Catch { - Write-Log -Message "Failed to create a custom object representing all user profiles on the machine. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$File, + [Parameter(Mandatory = $false)] + [Switch]$ProductVersion, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Getting version info for file [$file]." -Source ${CmdletName} + + If (Test-Path -LiteralPath $File -PathType 'Leaf') { + $fileVersionInfo = (Get-Command -Name $file -ErrorAction 'Stop').FileVersionInfo + If ($ProductVersion) { + $fileVersion = $fileVersionInfo.ProductVersion + } + Else { + $fileVersion = $fileVersionInfo.FileVersion + } + + If ($fileVersion) { + If ($ProductVersion) { + Write-Log -Message "Product version is [$fileVersion]." -Source ${CmdletName} + } + Else { + Write-Log -Message "File version is [$fileVersion]." -Source ${CmdletName} + } + + Write-Output -InputObject ($fileVersion) + } + Else { + Write-Log -Message 'No version information found.' -Source ${CmdletName} + } + } + Else { + Throw "File path [$file] does not exist." + } + } + Catch { + Write-Log -Message "Failed to get version info. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to get version info: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion -#region Function Get-FileVersion -Function Get-FileVersion { -<# -.SYNOPSIS - Gets the version of the specified file -.DESCRIPTION - Gets the version of the specified file -.PARAMETER File - Path of the file +#region Function New-Shortcut +Function New-Shortcut { + <# +.SYNOPSIS + +Creates a new .lnk or .url type shortcut + +.DESCRIPTION + +Creates a new shortcut .lnk or .url file, with configurable options + +.PARAMETER Path + +Path to save the shortcut + +.PARAMETER TargetPath + +Target path or URL that the shortcut launches + +.PARAMETER Arguments + +Arguments to be passed to the target path + +.PARAMETER IconLocation + +Location of the icon used for the shortcut + +.PARAMETER IconIndex + +The index of the icon. Executables, DLLs, ICO files with multiple icons need the icon index to be specified. This parameter is an Integer. The first index is 0. + +.PARAMETER Description + +Description of the shortcut + +.PARAMETER WorkingDirectory + +Working Directory to be used for the target path + +.PARAMETER WindowStyle + +Windows style of the application. Options: Normal, Maximized, Minimized. Default is: Normal. + +.PARAMETER RunAsAdmin + +Set shortcut to run program as administrator. This option will prompt user to elevate when executing shortcut. + +.PARAMETER Hotkey + +Create a Hotkey to launch the shortcut, e.g. "CTRL+SHIFT+F" + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return any output. + +.EXAMPLE + +New-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" -TargetPath "$envWinDir\System32\notepad.exe" -IconLocation "$envWinDir\System32\notepad.exe" -Description 'Notepad' -WorkingDirectory "$envHomeDrive\$envHomePath" + +.NOTES + +Url shortcuts only support TargetPath, IconLocation and IconIndex. Other parameters are ignored. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$TargetPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Arguments, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IconLocation, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$IconIndex, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Description, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateSet('Normal', 'Maximized', 'Minimized')] + [String]$WindowStyle, + [Parameter(Mandatory = $false)] + [Switch]$RunAsAdmin, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Hotkey, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If (-not $Shell) { + [__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' + } + } + Process { + Try { + $extension = [IO.Path]::GetExtension($Path).ToLower() + If ((-not $extension) -or (($extension -ne '.lnk') -and ($extension -ne '.url'))) { + Write-Log -Message "Specified file [$Path] does not have a valid shortcut extension: .url .lnk" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + Try { + # Make sure Net framework current dir is synced with powershell cwd + [IO.Directory]::SetCurrentDirectory((Get-Location -PSProvider 'FileSystem').ProviderPath) + # Get full path + [String]$FullPath = [IO.Path]::GetFullPath($Path) + } + Catch { + Write-Log -Message "Specified path [$Path] is not valid." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + + Try { + [String]$PathDirectory = [IO.Path]::GetDirectoryName($FullPath) + If (-not $PathDirectory) { + # The path is root or no filename supplied + If (-not [IO.Path]::GetFileNameWithoutExtension($FullPath)) { + # No filename supplied + If (-not $ContinueOnError) { + Throw + } + Return + } + # Continue without creating a folder because the path is root + } + ElseIf (-not (Test-Path -LiteralPath $PathDirectory -PathType 'Container' -ErrorAction 'Stop')) { + Write-Log -Message "Creating shortcut directory [$PathDirectory]." -Source ${CmdletName} + $null = New-Item -Path $PathDirectory -ItemType 'Directory' -Force -ErrorAction 'Stop' + } + } + Catch { + Write-Log -Message "Failed to create shortcut directory [$PathDirectory]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Throw + } + + If (Test-Path -Path $FullPath -PathType 'Leaf') { + Write-Log -Message "The shortcut [$FullPath] already exists. Deleting the file..." -Source ${CmdletName} + Remove-File -Path $FullPath + } + + Write-Log -Message "Creating shortcut [$FullPath]." -Source ${CmdletName} + If ($extension -eq '.url') { + [String[]]$URLFile = '[InternetShortcut]' + $URLFile += "URL=$targetPath" + If ($null -ne $IconIndex) { + $URLFile += "IconIndex=$IconIndex" + } + If ($IconLocation) { + $URLFile += "IconFile=$IconLocation" + } + [IO.File]::WriteAllLines($FullPath, $URLFile, (New-Object -TypeName 'Text.UTF8Encoding' -ArgumentList ($false))) + } + Else { + $shortcut = $shell.CreateShortcut($FullPath) + ## TargetPath + $shortcut.TargetPath = $targetPath + ## Arguments + If ($arguments) { + $shortcut.Arguments = $arguments + } + ## Description + If ($description) { + $shortcut.Description = $description + } + ## Working directory + If ($workingDirectory) { + $shortcut.WorkingDirectory = $workingDirectory + } + ## Window Style + Switch ($windowStyle) { + 'Normal' { + $windowStyleInt = 1 + } + 'Maximized' { + $windowStyleInt = 3 + } + 'Minimized' { + $windowStyleInt = 7 + } + Default { + $windowStyleInt = 1 + } + } + $shortcut.WindowStyle = $windowStyleInt + ## Hotkey + If ($Hotkey) { + $shortcut.Hotkey = $Hotkey + } + ## Icon + If ($null -eq $IconIndex) { + $IconIndex = 0 + } + If ($IconLocation) { + $shortcut.IconLocation = $IconLocation + ",$IconIndex" + } + ## Save the changes + $shortcut.Save() + + ## Set shortcut to run program as administrator + If ($RunAsAdmin) { + Write-Log -Message 'Setting shortcut to run program as administrator.' -Source ${CmdletName} + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($FullPath) + $filebytes[21] = $filebytes[21] -bor 32 + [IO.FIle]::WriteAllBytes($FullPath, $filebytes) + } + } + } + Catch { + Write-Log -Message "Failed to create shortcut [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create shortcut [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + +#region Function Set-Shortcut +Function Set-Shortcut { + <# +.SYNOPSIS + +Modifies a .lnk or .url type shortcut + +.DESCRIPTION + +Modifies a shortcut - .lnk or .url file, with configurable options. + +Only specify the parameters that you want to change. + +.PARAMETER Path + +Path to the shortcut to be changed + +.PARAMETER TargetPath + +Changes target path or URL that the shortcut launches + +.PARAMETER Arguments + +Changes Arguments to be passed to the target path + +.PARAMETER IconLocation + +Changes location of the icon used for the shortcut + +.PARAMETER IconIndex + +Change the index of the icon. Executables, DLLs, ICO files with multiple icons need the icon index to be specified. This parameter is an Integer. The first index is 0. + +.PARAMETER Description + +Changes description of the shortcut + +.PARAMETER WorkingDirectory + +Changes Working Directory to be used for the target path + +.PARAMETER WindowStyle + +Changes the Windows style of the application. Options: Normal, Maximized, Minimized, DontChange. Default is: DontChange. + +.PARAMETER RunAsAdmin + +Set shortcut to run program as administrator. This option will prompt user to elevate when executing shortcut. If not specified or set to $null, the flag will not be changed. + +.PARAMETER Hotkey + +Changes the Hotkey to launch the shortcut, e.g. "CTRL+SHIFT+F" + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +PSOjbect + +Path to the shortcut to be changed or a hashtable of parameters to be changed + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Get-FileVersion -File "$envProgramFilesX86\Adobe\Reader 11.0\Reader\AcroRd32.exe" + +Set-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" -TargetPath "$envWinDir\System32\notepad.exe" -IconLocation "$envWinDir\System32\notepad.exe" -IconIndex 0 -Description 'Notepad' -WorkingDirectory "$envHomeDrive\$envHomePath" + .NOTES + +Url shortcuts only support TargetPath, IconLocation and IconIndex. Other parameters are ignored. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$File, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Get file version info for file [$file]." -Source ${CmdletName} - - If (Test-Path -LiteralPath $File -PathType 'Leaf') { - $fileVersion = (Get-Command -Name $file -ErrorAction 'Stop').FileVersionInfo.FileVersion - If ($fileVersion) { - ## Remove product information to leave only the file version - $fileVersion = ($fileVersion -split ' ' | Select-Object -First 1) - - Write-Log -Message "File version is [$fileVersion]." -Source ${CmdletName} - Write-Output -InputObject $fileVersion - } - Else { - Write-Log -Message 'No file version information found.' -Source ${CmdletName} - } - } - Else { - Throw "File path [$file] does not exist." - } - } - Catch { - Write-Log -Message "Failed to get file version info. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to get file version info: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding(DefaultParameterSetName = 'Default')] + Param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0, ParameterSetName = 'Default')] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0, ParameterSetName = 'Pipeline')] + [ValidateNotNullorEmpty()] + [Hashtable]$PathHash, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$TargetPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Arguments, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IconLocation, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IconIndex, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Description, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateSet('Normal', 'Maximized', 'Minimized', 'DontChange')] + [String]$WindowStyle = 'DontChange', + [Parameter(Mandatory = $false)] + [System.Nullable[Boolean]]$RunAsAdmin, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Hotkey, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If (-not $Shell) { + [__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' + } + } + Process { + Try { + If ($PsCmdlet.ParameterSetName -eq 'Pipeline') { + $Path = $PathHash.Path + } + + If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { + Write-Log -Message "Failed to find the file [$Path]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + $extension = [IO.Path]::GetExtension($Path).ToLower() + If ((-not $extension) -or (($extension -ne '.lnk') -and ($extension -ne '.url'))) { + Write-Log -Message "Specified file [$Path] is not a valid shortcut." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + # Make sure Net framework current dir is synced with powershell cwd + [IO.Directory]::SetCurrentDirectory((Get-Location -PSProvider 'FileSystem').ProviderPath) + Write-Log -Message "Changing shortcut [$Path]." -Source ${CmdletName} + If ($extension -eq '.url') { + [String[]]$URLFile = [IO.File]::ReadAllLines($Path) + For ($i = 0; $i -lt $URLFile.Length; $i++) { + $URLFile[$i] = $URLFile[$i].TrimStart() + If ($URLFile[$i].StartsWith('URL=') -and $targetPath) { + $URLFile[$i] = "URL=$targetPath" + } + ElseIf ($URLFile[$i].StartsWith('IconIndex=') -and ($null -ne $IconIndex)) { + $URLFile[$i] = "IconIndex=$IconIndex" + } + ElseIf ($URLFile[$i].StartsWith('IconFile=') -and $IconLocation) { + $URLFile[$i] = "IconFile=$IconLocation" + } + } + [IO.File]::WriteAllLines($Path, $URLFile, (New-Object -TypeName 'Text.UTF8Encoding' -ArgumentList ($false))) + } + Else { + $shortcut = $shell.CreateShortcut($Path) + ## TargetPath + If ($targetPath) { + $shortcut.TargetPath = $targetPath + } + ## Arguments + If ($arguments) { + $shortcut.Arguments = $arguments + } + ## Description + If ($description) { + $shortcut.Description = $description + } + ## Working directory + If ($workingDirectory) { + $shortcut.WorkingDirectory = $workingDirectory + } + ## Window Style + Switch ($windowStyle) { + 'Normal' { + $windowStyleInt = 1 + } + 'Maximized' { + $windowStyleInt = 3 + } + 'Minimized' { + $windowStyleInt = 7 + } + 'DontChange' { + $windowStyleInt = 0 + } + Default { + $windowStyleInt = 1 + } + } + If ($windowStyleInt -ne 0) { + $shortcut.WindowStyle = $windowStyleInt + } + ## Hotkey + If ($Hotkey) { + $shortcut.Hotkey = $Hotkey + } + ## Icon + # Retrieve previous value and split the path from the index + [String[]]$Split = $shortcut.IconLocation.Split(',') + $TempIconLocation = $Split[0] + $TempIconIndex = $Split[1] + # Check whether a new icon path was specified + If ($IconLocation) { + # New icon path was specified. Check whether new icon index was also specified + If ($null -ne $IconIndex) { + # Create new icon path from new icon path and new icon index + $IconLocation = $IconLocation + ",$IconIndex" + } + Else { + # No new icon index was specified as a parameter. We will keep the old one + $IconLocation = $IconLocation + ",$TempIconIndex" + } + } + ElseIf ($null -ne $IconIndex) { + # New icon index was specified, but not the icon location. Append it to the icon path from the shortcut + $IconLocation = $TempIconLocation + ",$IconIndex" + } + If ($IconLocation) { + $shortcut.IconLocation = $IconLocation + } + ## Save the changes + $shortcut.Save() + + ## Set shortcut to run program as administrator + If ($RunAsAdmin -eq $true) { + Write-Log -Message 'Setting shortcut to run program as administrator.' -Source ${CmdletName} + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($Path) + $filebytes[21] = $filebytes[21] -bor 32 + [IO.FIle]::WriteAllBytes($Path, $filebytes) + } + ElseIf ($RunAsAdmin -eq $false) { + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($Path) + Write-Log -Message 'Setting shortcut to not run program as administrator.' -Source ${CmdletName} + $filebytes[21] = $filebytes[21] -band (-bnot 32) + [IO.FIle]::WriteAllBytes($Path, $filebytes) + } + } + } + Catch { + Write-Log -Message "Failed to change the shortcut [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to change the shortcut [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion - -#region Function New-Shortcut -Function New-Shortcut { -<# +#region Function Get-Shortcut +Function Get-Shortcut { + <# .SYNOPSIS - Creates a new .lnk or .url type shortcut + +Get information from a new .lnk or .url type shortcut + .DESCRIPTION - Creates a new shortcut .lnk or .url file, with configurable options + +Get information from a new .lnk or .url type shortcut. Returns a hashtable. + .PARAMETER Path - Path to save the shortcut -.PARAMETER TargetPath - Target path or URL that the shortcut launches -.PARAMETER Arguments - Arguments to be passed to the target path -.PARAMETER IconLocation - Location of the icon used for the shortcut -.PARAMETER IconIndex - Executables, DLLs, ICO files with multiple icons need the icon index to be specified -.PARAMETER Description - Description of the shortcut -.PARAMETER WorkingDirectory - Working Directory to be used for the target path -.PARAMETER WindowStyle - Windows style of the application. Options: Normal, Maximized, Minimized. Default is: Normal. -.PARAMETER RunAsAdmin - Set shortcut to run program as administrator. This option will prompt user to elevate when executing shortcut. -.PARAMETER Hotkey - Create a Hotkey to launch the shortcut, e.g. "CTRL+SHIFT+F" + +Path to the shortcut to get information from + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Collections.Hashtable. + +Returns a hashtable with the following keys +- TargetPath +- Arguments +- Description +- WorkingDirectory +- WindowStyle +- Hotkey +- IconLocation +- IconIndex +- RunAsAdmin + .EXAMPLE - New-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" -TargetPath "$envWinDir\system32\notepad.exe" -IconLocation "$envWinDir\system32\notepad.exe" -Description 'Notepad' -WorkingDirectory "$envHomeDrive\$envHomePath" + +Get-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" + .NOTES + +Url shortcuts only support TargetPath, IconLocation and IconIndex. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Path, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$TargetPath, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$Arguments, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$IconLocation, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$IconIndex, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$Description, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$WorkingDirectory, - [Parameter(Mandatory=$false)] - [ValidateSet('Normal','Maximized','Minimized')] - [string]$WindowStyle, - [Parameter(Mandatory=$false)] - [switch]$RunAsAdmin, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Hotkey, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - If (-not $Shell) { [__comobject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' } - } - Process { - Try { - Try { - [IO.FileInfo]$Path = [IO.FileInfo]$Path - [string]$PathDirectory = $Path.DirectoryName - - If (-not (Test-Path -LiteralPath $PathDirectory -PathType 'Container' -ErrorAction 'Stop')) { - Write-Log -Message "Create shortcut directory [$PathDirectory]." -Source ${CmdletName} - $null = New-Item -Path $PathDirectory -ItemType 'Directory' -Force -ErrorAction 'Stop' - } - } - Catch { - Write-Log -Message "Failed to create shortcut directory [$PathDirectory]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - Throw - } - - Write-Log -Message "Create shortcut [$($path.FullName)]." -Source ${CmdletName} - If (($path.FullName).ToLower().EndsWith('.url')) { - [string[]]$URLFile = '[InternetShortcut]' - $URLFile += "URL=$targetPath" - If ($iconIndex) { $URLFile += "IconIndex=$iconIndex" } - If ($IconLocation) { $URLFile += "IconFile=$iconLocation" } - $URLFile | Out-File -FilePath $path.FullName -Force -Encoding 'default' -ErrorAction 'Stop' - } - ElseIf (($path.FullName).ToLower().EndsWith('.lnk')) { - If (($iconLocation -and $iconIndex) -and (-not ($iconLocation.Contains(',')))) { - $iconLocation = $iconLocation + ",$iconIndex" - } - Switch ($windowStyle) { - 'Normal' { $windowStyleInt = 1 } - 'Maximized' { $windowStyleInt = 3 } - 'Minimized' { $windowStyleInt = 7 } - Default { $windowStyleInt = 1 } - } - $shortcut = $shell.CreateShortcut($path.FullName) - $shortcut.TargetPath = $targetPath - $shortcut.Arguments = $arguments - $shortcut.Description = $description - $shortcut.WorkingDirectory = $workingDirectory - $shortcut.WindowStyle = $windowStyleInt - If ($hotkey) {$shortcut.Hotkey = $hotkey} - If ($iconLocation) { $shortcut.IconLocation = $iconLocation } - $shortcut.Save() - - ## Set shortcut to run program as administrator - If ($RunAsAdmin) { - Write-Log -Message 'Set shortcut to run program as administrator.' -Source ${CmdletName} - $TempFileName = [IO.Path]::GetRandomFileName() - $TempFile = [IO.FileInfo][IO.Path]::Combine($Path.Directory, $TempFileName) - $Writer = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($TempFile, ([IO.FileMode]::Create)) -ErrorAction 'Stop' - $Reader = $Path.OpenRead() - While ($Reader.Position -lt $Reader.Length) { - $Byte = $Reader.ReadByte() - If ($Reader.Position -eq 22) { $Byte = 34 } - $Writer.WriteByte($Byte) - } - $Reader.Close() - $Writer.Close() - $Path.Delete() - $null = Rename-Item -Path $TempFile -NewName $Path.Name -Force -ErrorAction 'Stop' - } - } - } - Catch { - Write-Log -Message "Failed to create shortcut [$($path.FullName)]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to create shortcut [$($path.FullName)]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If (-not $Shell) { + [__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' + } + } + Process { + Try { + $extension = [IO.Path]::GetExtension($Path).ToLower() + If ((-not $extension) -or (($extension -ne '.lnk') -and ($extension -ne '.url'))) { + Write-Log -Message "Specified file [$Path] does not have a valid shortcut extension: .url .lnk" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + Try { + # Make sure Net framework current dir is synced with powershell cwd + [IO.Directory]::SetCurrentDirectory((Get-Location -PSProvider 'FileSystem').ProviderPath) + # Get full path + [String]$FullPath = [IO.Path]::GetFullPath($Path) + } + Catch { + Write-Log -Message "Specified path [$Path] is not valid." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + + $Output = @{ Path = $FullPath } + If ($extension -eq '.url') { + [String[]]$URLFile = [IO.File]::ReadAllLines($Path) + For ($i = 0; $i -lt $URLFile.Length; $i++) { + $URLFile[$i] = $URLFile[$i].TrimStart() + If ($URLFile[$i].StartsWith('URL=')) { + $Output.TargetPath = $URLFile[$i].Replace('URL=', '') + } + ElseIf ($URLFile[$i].StartsWith('IconIndex=')) { + $Output.IconIndex = $URLFile[$i].Replace('IconIndex=', '') + } + ElseIf ($URLFile[$i].StartsWith('IconFile=')) { + $Output.IconLocation = $URLFile[$i].Replace('IconFile=', '') + } + } + } + Else { + $shortcut = $shell.CreateShortcut($FullPath) + ## TargetPath + $Output.TargetPath = $shortcut.TargetPath + ## Arguments + $Output.Arguments = $shortcut.Arguments + ## Description + $Output.Description = $shortcut.Description + ## Working directory + $Output.WorkingDirectory = $shortcut.WorkingDirectory + ## Window Style + Switch ($shortcut.WindowStyle) { + 1 { + $Output.WindowStyle = 'Normal' + } + 3 { + $Output.WindowStyle = 'Maximized' + } + 7 { + $Output.WindowStyle = 'Minimized' + } + Default { + $Output.WindowStyle = 'Normal' + } + } + ## Hotkey + $Output.Hotkey = $shortcut.Hotkey + ## Icon + [String[]]$Split = $shortcut.IconLocation.Split(',') + $Output.IconLocation = $Split[0] + $Output.IconIndex = $Split[1] + ## Remove the variable + $shortcut = $null + ## Run as admin + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($FullPath) + If ($filebytes[21] -band 32) { + $Output.RunAsAdmin = $true + } + Else { + $Output.RunAsAdmin = $false + } + } + Write-Output -InputObject ($Output) + } + Catch { + Write-Log -Message "Failed to read the shortcut [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read the shortcut [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion - #region Function Execute-ProcessAsUser Function Execute-ProcessAsUser { -<# + <# .SYNOPSIS - Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context. + +Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context. + .DESCRIPTION - Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context. + +Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context. + .PARAMETER UserName - Logged in Username under which to run the process from. Default is: The active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user. + +Logged in Username under which to run the process from. Default is: The active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user. + .PARAMETER Path - Path to the file being executed. + +Path to the file being executed. + +.PARAMETER TempPath + +Path to the temporary directory used to store the script to be executed as user. If using a user writable directory, ensure you select -RunLevel 'LeastPrivilege'. + .PARAMETER Parameters - Arguments to be passed to the file being executed. + +Arguments to be passed to the file being executed. + .PARAMETER SecureParameters - Hides all parameters passed to the executable from the Toolkit log file. + +Hides all parameters passed to the executable from the Toolkit log file. + .PARAMETER RunLevel - Specifies the level of user rights that Task Scheduler uses to run the task. The acceptable values for this parameter are: - - HighestAvailable: Tasks run by using the highest available privileges (Admin privileges for Administrators). Default Value. - - LeastPrivilege: Tasks run by using the least-privileged user account (LUA) privileges. + +Specifies the level of user rights that Task Scheduler uses to run the task. The acceptable values for this parameter are: + +- HighestAvailable: Tasks run by using the highest available privileges (Admin privileges for Administrators). Default Value. + +- LeastPrivilege: Tasks run by using the least-privileged user account (LUA) privileges. + .PARAMETER Wait - Wait for the process, launched by the scheduled task, to complete execution before accepting more input. Default is $false. + +Wait for the process, launched by the scheduled task, to complete execution before accepting more input. Default is $false. + .PARAMETER PassThru - Returns the exit code from this function or the process launched by the scheduled task. + +Returns the exit code from this function or the process launched by the scheduled task. + +.PARAMETER WorkingDirectory + +Set working directory for the process. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is $true. + +Continue if an error is encountered. Default is $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Int32. + +Returns the exit code from this function or the process launched by the scheduled task. + .EXAMPLE - Execute-ProcessAsUser -UserName 'CONTOSO\User' -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait - Execute process under a user account by specifying a username under which to execute it. + +Execute-ProcessAsUser -UserName 'CONTOSO\User' -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait + +Execute process under a user account by specifying a username under which to execute it. + .EXAMPLE - Execute-ProcessAsUser -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait - Execute process under a user account by using the default active logged in user that was detected when the toolkit was launched. + +Execute-ProcessAsUser -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait + +Execute process under a user account by using the default active logged in user that was detected when the toolkit was launched. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$UserName = $RunAsActiveUser.NTAccount, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Path, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Parameters = '', - [Parameter(Mandatory=$false)] - [switch]$SecureParameters = $false, - [Parameter(Mandatory=$false)] - [ValidateSet('HighestAvailable','LeastPrivilege')] - [string]$RunLevel = 'HighestAvailable', - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$Wait = $false, - [Parameter(Mandatory=$false)] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Initialize exit code variable - [int32]$executeProcessAsUserExitCode = 0 - - ## Confirm that the username field is not empty - If (-not $UserName) { - [int32]$executeProcessAsUserExitCode = 60009 - Write-Log -Message "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched." -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched." - } - Else { - Return - } - } - - ## Confirm if the toolkit is running with administrator privileges - If (($RunLevel -eq 'HighestAvailable') -and (-not $IsAdmin)) { - [int32]$executeProcessAsUserExitCode = 60003 - Write-Log -Message "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'." -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'." - } - Else { - Return - } - } - - ## Build the scheduled task XML name - [string]$schTaskName = "$appDeployToolkitName-ExecuteAsUser" - - ## Create the temporary App Deploy Toolkit files folder if it doesn't already exist - If (-not (Test-Path -LiteralPath $dirAppDeployTemp -PathType 'Container')) { - New-Item -Path $dirAppDeployTemp -ItemType 'Directory' -Force -ErrorAction 'Stop' - } - - ## If PowerShell.exe is being launched, then create a VBScript to launch PowerShell so that we can suppress the console window that flashes otherwise - If (($Path -eq 'PowerShell.exe') -or ((Split-Path -Path $Path -Leaf) -eq 'PowerShell.exe')) { - # Permit inclusion of double quotes in parameters - If ($($Parameters.Substring($Parameters.Length - 1)) -eq '"') { - [string]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$', '') + ' & chr(34)' } - Else { - [string]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$','') + '"' } - [string[]]$executeProcessAsUserScript = "strCommand = $executeProcessAsUserParametersVBS" - $executeProcessAsUserScript += 'set oWShell = CreateObject("WScript.Shell")' - $executeProcessAsUserScript += 'intReturn = oWShell.Run(strCommand, 0, true)' - $executeProcessAsUserScript += 'WScript.Quit intReturn' - $executeProcessAsUserScript | Out-File -FilePath "$dirAppDeployTemp\$($schTaskName).vbs" -Force -Encoding 'default' -ErrorAction 'SilentlyContinue' - $Path = 'wscript.exe' - $Parameters = "`"$dirAppDeployTemp\$($schTaskName).vbs`"" - } - - ## Specify the scheduled task configuration in XML format - [string]$xmlSchTask = @" + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$UserName = $RunAsActiveUser.NTAccount, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$TempPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Parameters = '', + [Parameter(Mandatory = $false)] + [Switch]$SecureParameters = $false, + [Parameter(Mandatory = $false)] + [ValidateSet('HighestAvailable', 'LeastPrivilege')] + [String]$RunLevel = 'HighestAvailable', + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$Wait = $false, + [Parameter(Mandatory = $false)] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If ((![string]::IsNullOrEmpty($tempPath))) { + $executeAsUserTempPath = $tempPath + If (($tempPath -eq $loggedOnUserTempPath) -and ($RunLevel -eq "HighestPrivilege")) { + Write-Log -Message "WARNING: Using [${CmdletName}] with a user writable directory using the HighestPrivilege creates a security vulnerability. Please use -RunLevel 'LeastPrivilege' when using a user writable directoy." -Severity 'Warning' + } + } + Else { + [String]$executeAsUserTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'ExecuteAsUser' + } + } + Process { + ## Initialize exit code variable + [Int32]$executeProcessAsUserExitCode = 0 + + ## Confirm that the username field is not empty + If (-not $UserName) { + [Int32]$executeProcessAsUserExitCode = 60009 + Write-Log -Message "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched." + } + Return + } + + ## Confirm if the toolkit is running with administrator privileges + If (($RunLevel -eq 'HighestAvailable') -and (-not $IsAdmin)) { + [Int32]$executeProcessAsUserExitCode = 60003 + Write-Log -Message "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'." + } + Return + } + + ## Check whether the specified Working Directory exists + If ($WorkingDirectory -and (-not (Test-Path -LiteralPath $WorkingDirectory -PathType 'Container'))) { + Write-Log -Message 'The specified working directory does not exist or is not a directory. The scheduled task might not work as expected.' -Severity 2 -Source ${CmdletName} + } + + ## Build the scheduled task XML name + [String]$schTaskName = (("$appDeployToolkitName-ExecuteAsUser" -replace ' ', '').Trim('_') -replace '[_]+', '_') + + ## Remove and recreate the temporary folder + If (Test-Path -LiteralPath $executeAsUserTempPath -PathType 'Container') { + Write-Log -Message "Previous [$executeAsUserTempPath] found. Attempting removal." -Source ${CmdletName} + Remove-Folder -Path $executeAsUserTempPath + } + Write-Log -Message "Creating [$executeAsUserTempPath]." -Source ${CmdletName} + Try { + $null = New-Item -Path $executeAsUserTempPath -ItemType 'Directory' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Unable to create [$executeAsUserTempPath]. Possible attempt to gain elevated rights." -Source ${CmdletName} -Severity 2 + } + + ## Escape XML characters + $EscapedPath = [System.Security.SecurityElement]::Escape($Path) + $EscapedParameters = [System.Security.SecurityElement]::Escape($Parameters) + + ## If PowerShell.exe is being launched, then create a VBScript to launch PowerShell so that we can suppress the console window that flashes otherwise + If (((Split-Path -Path $Path -Leaf) -like 'PowerShell*') -or ((Split-Path -Path $Path -Leaf) -like 'cmd*')) { + If ($SecureParameters) { + Write-Log -Message "Preparing a VBScript that will start [$Path] (Parameters Hidden) as the logged-on user [$userName] and suppress the console window..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Preparing a VBScript that will start [$Path $Parameters] as the logged-on user [$userName] and suppress the console window..." -Source ${CmdletName} + } + + # Permit inclusion of double quotes in parameters + $QuotesIndex = $Parameters.Length - 1 + If ($QuotesIndex -lt 0) { + $QuotesIndex = 0 + } + + If ($($Parameters.Substring($QuotesIndex)) -eq '"') { + [String]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace "`r`r`n", ';' -replace "`r`n", ';' -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$', '') + ' & chr(34)' + } + Else { + [String]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace "`r`r`n", ';' -replace "`r`n", ';' -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$', '') + '"' + } + + [String[]]$executeProcessAsUserScript = "strCommand = $executeProcessAsUserParametersVBS" + $executeProcessAsUserScript += 'set oWShell = CreateObject("WScript.Shell")' + $executeProcessAsUserScript += 'intReturn = oWShell.Run(strCommand, 0, true)' + $executeProcessAsUserScript += 'WScript.Quit intReturn' + $executeProcessAsUserScript | Out-File -FilePath "$executeAsUserTempPath\$($schTaskName).vbs" -Force -Encoding 'Default' -ErrorAction 'SilentlyContinue' + $Path = "$envWinDir\System32\wscript.exe" + $Parameters = "/e:vbscript `"$executeAsUserTempPath\$($schTaskName).vbs`"" + $EscapedPath = [System.Security.SecurityElement]::Escape($Path) + $EscapedParameters = [System.Security.SecurityElement]::Escape($Parameters) + + Try { + Set-ItemPermission -Path "$executeAsUserTempPath\$schTaskName.vbs" -User $UserName -Permission 'Read' + } + Catch { + Write-Log -Message "Failed to set read permissions on path [$executeAsUserTempPath\$schTaskName.vbs]. The function might not be able to work correctly." -Source ${CmdletName} -Severity 2 + } + } + + ## Prepare working directory insert + [String]$WorkingDirectoryInsert = '' + If ($WorkingDirectory) { + $WorkingDirectoryInsert = "`r`n $WorkingDirectory" + } + + ## Specify the scheduled task configuration in XML format + [String]$xmlSchTask = @" - StopExisting - false - false - true - false - false - - false - false - - true - true - false - false - false - PT72H - 7 + StopExisting + false + false + true + false + false + + false + false + + true + true + false + false + false + PT72H + 7 - - $Path - $Parameters - + + $EscapedPath + $EscapedParameters$WorkingDirectoryInsert + - - $UserName - InteractiveToken - $RunLevel - + + $UserName + InteractiveToken + $RunLevel + "@ - ## Export the XML to file - Try { - # Specify the filename to export the XML to - [string]$xmlSchTaskFilePath = "$dirAppDeployTemp\$schTaskName.xml" - [string]$xmlSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop' - } - Catch { - [int32]$executeProcessAsUserExitCode = 60007 - Write-Log -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]: $($_.Exception.Message)" - } - Else { - Return - } - } - - ## Create Scheduled Task to run the process with a logged-on user account - If ($Parameters) { - If ($SecureParameters) { - Write-Log -Message "Create scheduled task to run the process [$Path] (Parameters Hidden) as the logged-on user [$userName]..." -Source ${CmdletName} - } - Else { - Write-Log -Message "Create scheduled task to run the process [$Path $Parameters] as the logged-on user [$userName]..." -Source ${CmdletName} - } - } - Else { - Write-Log -Message "Create scheduled task to run the process [$Path] as the logged-on user [$userName]..." -Source ${CmdletName} - } - [psobject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/create /f /tn $schTaskName /xml `"$xmlSchTaskFilePath`"" -WindowStyle 'Hidden' -CreateNoWindow -PassThru - If ($schTaskResult.ExitCode -ne 0) { - [int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode - Write-Log -Message "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]." -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]." - } - Else { - Return - } - } - - ## Trigger the Scheduled Task - If ($Parameters) { - If ($SecureParameters) { - Write-Log -Message "Trigger execution of scheduled task with command [$Path] (Parameters Hidden) as the logged-on user [$userName]..." -Source ${CmdletName} - } - Else { - Write-Log -Message "Trigger execution of scheduled task with command [$Path $Parameters] as the logged-on user [$userName]..." -Source ${CmdletName} - } - } - Else { - Write-Log -Message "Trigger execution of scheduled task with command [$Path] as the logged-on user [$userName]..." -Source ${CmdletName} - } - [psobject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/run /i /tn $schTaskName" -WindowStyle 'Hidden' -CreateNoWindow -Passthru - If ($schTaskResult.ExitCode -ne 0) { - [int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode - Write-Log -Message "Failed to trigger scheduled task [$schTaskName]." -Severity 3 -Source ${CmdletName} - # Delete Scheduled Task - Write-Log -Message 'Delete the scheduled task which did not trigger.' -Source ${CmdletName} - Execute-Process -Path $exeSchTasks -Parameters "/delete /tn $schTaskName /f" -WindowStyle 'Hidden' -CreateNoWindow -ContinueOnError $true - If (-not $ContinueOnError) { - Throw "Failed to trigger scheduled task [$schTaskName]." - } - Else { - Return - } - } - - ## Wait for the process launched by the scheduled task to complete execution - If ($Wait) { - Write-Log -Message "Waiting for the process launched by the scheduled task [$schTaskName] to complete execution (this may take some time)..." -Source ${CmdletName} - Start-Sleep -Seconds 1 - #If on Windows Vista or higer, Windows Task Scheduler 2.0 is supported. 'Schedule.Service' ComObject output is UI language independent - If (([version]$envOSVersion).Major -gt 5) { - Try { - [__comobject]$ScheduleService = New-Object -ComObject 'Schedule.Service' -ErrorAction Stop - $ScheduleService.Connect() - $RootFolder = $ScheduleService.GetFolder('\') - $Task = $RootFolder.GetTask("$schTaskName") - # Task State(Status) 4 = 'Running' - While ($Task.State -eq 4) { - Start-Sleep -Seconds 5 - } - # Get the exit code from the process launched by the scheduled task - [int32]$executeProcessAsUserExitCode = $Task.LastTaskResult - } - Catch { - Write-Log -Message "Failed to retrieve information from Task Scheduler. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - Finally { - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($ScheduleService) } Catch { } - } - } - #Windows Task Scheduler 1.0 - Else { - While ((($exeSchTasksResult = & $exeSchTasks /query /TN $schTaskName /V /FO CSV) | ConvertFrom-CSV | Select-Object -ExpandProperty 'Status' | Select-Object -First 1) -eq 'Running') { - Start-Sleep -Seconds 5 - } - # Get the exit code from the process launched by the scheduled task - [int32]$executeProcessAsUserExitCode = ($exeSchTasksResult = & $exeSchTasks /query /TN $schTaskName /V /FO CSV) | ConvertFrom-CSV | Select-Object -ExpandProperty 'Last Result' | Select-Object -First 1 - } - Write-Log -Message "Exit code from process launched by scheduled task [$executeProcessAsUserExitCode]." -Source ${CmdletName} - } - Else { - Start-Sleep -Seconds 1 - } - - ## Delete scheduled task - Try { - Write-Log -Message "Delete scheduled task [$schTaskName]." -Source ${CmdletName} - Execute-Process -Path $exeSchTasks -Parameters "/delete /tn $schTaskName /f" -WindowStyle 'Hidden' -CreateNoWindow -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to delete scheduled task [$schTaskName]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - If ($PassThru) { Write-Output -InputObject $executeProcessAsUserExitCode } - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + ## Export the XML to file + Try { + # Specify the filename to export the XML to + [String]$xmlSchTaskFilePath = "$dirAppDeployTemp\$schTaskName.xml" + [String]$xmlSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop' + Set-ItemPermission -Path $xmlSchTaskFilePath -User $UserName -Permission 'Read' + } + Catch { + [Int32]$executeProcessAsUserExitCode = 60007 + Write-Log -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]: $($_.Exception.Message)" + } + Return + } + + ## Create Scheduled Task to run the process with a logged-on user account + If ($Parameters) { + If ($SecureParameters) { + Write-Log -Message "Creating scheduled task to run the process [$Path] (Parameters Hidden) as the logged-on user [$userName]..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Creating scheduled task to run the process [$Path $Parameters] as the logged-on user [$userName]..." -Source ${CmdletName} + } + } + Else { + Write-Log -Message "Creating scheduled task to run the process [$Path] as the logged-on user [$userName]..." -Source ${CmdletName} + } + [PSObject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/create /f /tn $schTaskName /xml `"$xmlSchTaskFilePath`"" -WindowStyle 'Hidden' -CreateNoWindow -PassThru -ExitOnProcessFailure $false + If ($schTaskResult.ExitCode -ne 0) { + [Int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode + Write-Log -Message "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]." + } + Return + } + + ## Trigger the Scheduled Task + If ($Parameters) { + If ($SecureParameters) { + Write-Log -Message "Triggering execution of scheduled task with command [$Path] (Parameters Hidden) as the logged-on user [$userName]..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Triggering execution of scheduled task with command [$Path $Parameters] as the logged-on user [$userName]..." -Source ${CmdletName} + } + } + Else { + Write-Log -Message "Triggering execution of scheduled task with command [$Path] as the logged-on user [$userName]..." -Source ${CmdletName} + } + [PSObject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/run /i /tn $schTaskName" -WindowStyle 'Hidden' -CreateNoWindow -Passthru -ExitOnProcessFailure $false + If ($schTaskResult.ExitCode -ne 0) { + [Int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode + Write-Log -Message "Failed to trigger scheduled task [$schTaskName]." -Severity 3 -Source ${CmdletName} + # Delete Scheduled Task + Write-Log -Message 'Deleting the scheduled task which did not trigger.' -Source ${CmdletName} + Execute-Process -Path $exeSchTasks -Parameters "/delete /tn $schTaskName /f" -WindowStyle 'Hidden' -CreateNoWindow -ExitOnProcessFailure $false + If (-not $ContinueOnError) { + Throw "Failed to trigger scheduled task [$schTaskName]." + } + Return + } + + ## Wait for the process launched by the scheduled task to complete execution + If ($Wait) { + Write-Log -Message "Waiting for the process launched by the scheduled task [$schTaskName] to complete execution (this may take some time)..." -Source ${CmdletName} + Start-Sleep -Seconds 1 + #If on Windows Vista or higer, Windows Task Scheduler 2.0 is supported. 'Schedule.Service' ComObject output is UI language independent + If (([Version]$envOSVersion).Major -gt 5) { + Try { + [__ComObject]$ScheduleService = New-Object -ComObject 'Schedule.Service' -ErrorAction 'Stop' + $ScheduleService.Connect() + $RootFolder = $ScheduleService.GetFolder('\') + $Task = $RootFolder.GetTask("$schTaskName") + # Task State(Status) 4 = 'Running' + While ($Task.State -eq 4) { + Start-Sleep -Seconds 5 + } + # Get the exit code from the process launched by the scheduled task + [Int32]$executeProcessAsUserExitCode = $Task.LastTaskResult + } + Catch { + Write-Log -Message "Failed to retrieve information from Task Scheduler. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + Finally { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($ScheduleService) + } + Catch { + } + } + } + #Windows Task Scheduler 1.0 + Else { + While ((($exeSchTasksResult = & $exeSchTasks /query /TN $schTaskName /V /FO CSV) | ConvertFrom-Csv | Select-Object -ExpandProperty 'Status' -First 1) -eq 'Running') { + Start-Sleep -Seconds 5 + } + # Get the exit code from the process launched by the scheduled task + [Int32]$executeProcessAsUserExitCode = ($exeSchTasksResult = & $exeSchTasks /query /TN $schTaskName /V /FO CSV) | ConvertFrom-Csv | Select-Object -ExpandProperty 'Last Result' -First 1 + } + Write-Log -Message "Exit code from process launched by scheduled task [$executeProcessAsUserExitCode]." -Source ${CmdletName} + } + Else { + Start-Sleep -Seconds 1 + } + + ## Delete scheduled task + Try { + Write-Log -Message "Deleting scheduled task [$schTaskName]." -Source ${CmdletName} + Execute-Process -Path $exeSchTasks -Parameters "/delete /tn $schTaskName /f" -WindowStyle 'Hidden' -CreateNoWindow -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to delete scheduled task [$schTaskName]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Remove the XML scheduled task file + If (Test-Path -LiteralPath $xmlSchTaskFilePath -PathType 'Leaf') { + Remove-File -Path $xmlSchTaskFilePath + } + + ## Remove the temporary folder + If (Test-Path -LiteralPath $executeAsUserTempPath -PathType 'Container') { + Remove-Folder -Path $executeAsUserTempPath + } + } + End { + If ($PassThru) { + Write-Output -InputObject ($executeProcessAsUserExitCode) + } + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Update-Desktop Function Update-Desktop { -<# + <# .SYNOPSIS - Refresh the Windows Explorer Shell, which causes the desktop icons and the environment variables to be reloaded. + +Refresh the Windows Explorer Shell, which causes the desktop icons and the environment variables to be reloaded. + .DESCRIPTION - Refresh the Windows Explorer Shell, which causes the desktop icons and the environment variables to be reloaded. + +Refresh the Windows Explorer Shell, which causes the desktop icons and the environment variables to be reloaded. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return objects. + .EXAMPLE - Update-Desktop + +Update-Desktop + .NOTES + +This function has an alias: Refresh-Desktop + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Refresh the Desktop and the Windows Explorer environment process block.' -Source ${CmdletName} - [PSADT.Explorer]::RefreshDesktopAndEnvironmentVariables() - } - Catch { - Write-Log -Message "Failed to refresh the Desktop and the Windows Explorer environment process block. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to refresh the Desktop and the Windows Explorer environment process block: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Refreshing the Desktop and the Windows Explorer environment process block.' -Source ${CmdletName} + [PSADT.Explorer]::RefreshDesktopAndEnvironmentVariables() + } + Catch { + Write-Log -Message "Failed to refresh the Desktop and the Windows Explorer environment process block. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to refresh the Desktop and the Windows Explorer environment process block: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } Set-Alias -Name 'Refresh-Desktop' -Value 'Update-Desktop' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' #endregion @@ -4977,2828 +7798,4017 @@ Set-Alias -Name 'Refresh-Desktop' -Value 'Update-Desktop' -Scope 'Script' -Force #region Function Update-SessionEnvironmentVariables Function Update-SessionEnvironmentVariables { -<# + <# .SYNOPSIS - Updates the environment variables for the current PowerShell session with any environment variable changes that may have occurred during script execution. + +Updates the environment variables for the current PowerShell session with any environment variable changes that may have occurred during script execution. + .DESCRIPTION - Environment variable changes that take place during script execution are not visible to the current PowerShell session. - Use this function to refresh the current PowerShell session with all environment variable settings. + +Environment variable changes that take place during script execution are not visible to the current PowerShell session. + +Use this function to refresh the current PowerShell session with all environment variable settings. + .PARAMETER LoadLoggedOnUserEnvironmentVariables - If script is running in SYSTEM context, this option allows loading environment variables from the active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user. + +If script is running in SYSTEM context, this option allows loading environment variables from the active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return objects. + .EXAMPLE - Update-SessionEnvironmentVariables + +Update-SessionEnvironmentVariables + .NOTES + +This function has an alias: Refresh-SessionEnvironmentVariables + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$LoadLoggedOnUserEnvironmentVariables = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - [scriptblock]$GetEnvironmentVar = { - Param ( - $Key, - $Scope - ) - [Environment]::GetEnvironmentVariable($Key, $Scope) - } - } - Process { - Try { - Write-Log -Message 'Refresh the environment variables for this PowerShell session.' -Source ${CmdletName} - - If ($LoadLoggedOnUserEnvironmentVariables -and $RunAsActiveUser) { - [string]$CurrentUserEnvironmentSID = $RunAsActiveUser.SID - } - Else { - [string]$CurrentUserEnvironmentSID = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value - } - [string]$MachineEnvironmentVars = 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' - [string]$UserEnvironmentVars = "Registry::HKEY_USERS\$CurrentUserEnvironmentSID\Environment" - - ## Update all session environment variables. Ordering is important here: $UserEnvironmentVars comes second so that we can override $MachineEnvironmentVars. - $MachineEnvironmentVars, $UserEnvironmentVars | Get-Item | Where-Object { $_ } | ForEach-Object { $envRegPath = $_.PSPath; $_ | Select-Object -ExpandProperty 'Property' | ForEach-Object { Set-Item -LiteralPath "env:$($_)" -Value (Get-ItemProperty -LiteralPath $envRegPath -Name $_).$_ } } - - ## Set PATH environment variable separately because it is a combination of the user and machine environment variables - [string[]]$PathFolders = 'Machine', 'User' | ForEach-Object { (& $GetEnvironmentVar -Key 'PATH' -Scope $_) } | Where-Object { $_ } | ForEach-Object { $_.Trim(';') } | ForEach-Object { $_.Split(';') } | ForEach-Object { $_.Trim() } | ForEach-Object { $_.Trim('"') } | Select-Object -Unique - $env:PATH = $PathFolders -join ';' - } - Catch { - Write-Log -Message "Failed to refresh the environment variables for this PowerShell session. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to refresh the environment variables for this PowerShell session: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$LoadLoggedOnUserEnvironmentVariables = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [ScriptBlock]$GetEnvironmentVar = { + Param ( + $Key, + $Scope + ) + [Environment]::GetEnvironmentVariable($Key, $Scope) + } + } + Process { + Try { + Write-Log -Message 'Refreshing the environment variables for this PowerShell session.' -Source ${CmdletName} + + If ($LoadLoggedOnUserEnvironmentVariables -and $RunAsActiveUser) { + [String]$CurrentUserEnvironmentSID = $RunAsActiveUser.SID + } + Else { + [String]$CurrentUserEnvironmentSID = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value + } + [String]$MachineEnvironmentVars = 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' + [String]$UserEnvironmentVars = "Registry::HKEY_USERS\$CurrentUserEnvironmentSID\Environment" + + ## Update all session environment variables. Ordering is important here: $UserEnvironmentVars comes second so that we can override $MachineEnvironmentVars. + $MachineEnvironmentVars, $UserEnvironmentVars | Get-Item | Where-Object { $_ } | ForEach-Object { $envRegPath = $_.PSPath; $_ | Select-Object -ExpandProperty 'Property' | ForEach-Object { Set-Item -LiteralPath "env:$($_)" -Value (Get-ItemProperty -LiteralPath $envRegPath -Name $_).$_ } } + + ## Set PATH environment variable separately because it is a combination of the user and machine environment variables + [String[]]$PathFolders = 'Machine', 'User' | ForEach-Object { (& $GetEnvironmentVar -Key 'PATH' -Scope $_) } | Where-Object { $_ } | ForEach-Object { $_.Trim(';').Split(';').Trim().Trim('"') } | Select-Object -Unique + $env:PATH = $PathFolders -join ';' + } + Catch { + Write-Log -Message "Failed to refresh the environment variables for this PowerShell session. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to refresh the environment variables for this PowerShell session: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } Set-Alias -Name 'Refresh-SessionEnvironmentVariables' -Value 'Update-SessionEnvironmentVariables' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' #endregion -#region Function Get-ScheduledTask -Function Get-ScheduledTask { -<# +#region Function Get-SchedulerTask +Function Get-SchedulerTask { + <# .SYNOPSIS - Retrieve all details for scheduled tasks on the local computer. + +Retrieve all details for scheduled tasks on the local computer. + .DESCRIPTION - Retrieve all details for scheduled tasks on the local computer using schtasks.exe. All property names have spaces and colons removed. + +Retrieve all details for scheduled tasks on the local computer using schtasks.exe. All property names have spaces and colons removed. + .PARAMETER TaskName - Specify the name of the scheduled task to retrieve details for. Uses regex match to find scheduled task. + +Specify the name of the scheduled task to retrieve details for. Uses regex match to find scheduled task. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default: $true. + +Continue if an error is encountered. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSOjbect. This function returns a PSObject with all scheduled task properties. + .EXAMPLE - Get-ScheduledTask - To display a list of all scheduled task properties. + +Get-SchedulerTask + +To display a list of all scheduled task properties. + .EXAMPLE - Get-ScheduledTask | Out-GridView - To display a grid view of all scheduled task properties. + +Get-SchedulerTask | Out-GridView + +To display a grid view of all scheduled task properties. + .EXAMPLE - Get-ScheduledTask | Select-Object -Property TaskName - To display a list of all scheduled task names. + +Get-SchedulerTask | Select-Object -Property TaskName + +To display a list of all scheduled task names. + .NOTES + +This function has an alias: Get-ScheduledTask if Get-ScheduledTask is not defined + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$TaskName, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - If (-not $exeSchTasks) { [string]$exeSchTasks = "$env:WINDIR\system32\schtasks.exe" } - [psobject[]]$ScheduledTasks = @() - } - Process { - Try { - Write-Log -Message 'Retrieve Scheduled Tasks...' -Source ${CmdletName} - [string[]]$exeSchtasksResults = & $exeSchTasks /Query /V /FO CSV - If ($global:LastExitCode -ne 0) { Throw "Failed to retrieve scheduled tasks using [$exeSchTasks]." } - [psobject[]]$SchtasksResults = $exeSchtasksResults | ConvertFrom-CSV -Header 'HostName', 'TaskName', 'Next Run Time', 'Status', 'Logon Mode', 'Last Run Time', 'Last Result', 'Author', 'Task To Run', 'Start In', 'Comment', 'Scheduled Task State', 'Idle Time', 'Power Management', 'Run As User', 'Delete Task If Not Rescheduled', 'Stop Task If Runs X Hours and X Mins', 'Schedule', 'Schedule Type', 'Start Time', 'Start Date', 'End Date', 'Days', 'Months', 'Repeat: Every', 'Repeat: Until: Time', 'Repeat: Until: Duration', 'Repeat: Stop If Still Running' -ErrorAction 'Stop' - - If ($SchtasksResults) { - ForEach ($SchtasksResult in $SchtasksResults) { - If ($SchtasksResult.TaskName -match $TaskName) { - $SchtasksResult | Get-Member -MemberType 'Properties' | - ForEach -Begin { - [hashtable]$Task = @{} - } -Process { - ## Remove spaces and colons in property names. Do not set property value if line being processed is a column header (this will only work on English language machines). - ($Task.($($_.Name).Replace(' ','').Replace(':',''))) = If ($_.Name -ne $SchtasksResult.($_.Name)) { $SchtasksResult.($_.Name) } - } -End { - ## Only add task to the custom object if all property values are not empty - If (($Task.Values | Select-Object -Unique | Measure-Object).Count) { - $ScheduledTasks += New-Object -TypeName 'PSObject' -Property $Task - } - } - } - } - } - } - Catch { - Write-Log -Message "Failed to retrieve scheduled tasks. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to retrieve scheduled tasks: $($_.Exception.Message)" - } - } - } - End { - Write-Output -InputObject $ScheduledTasks - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$TaskName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [PSObject[]]$ScheduledTasks = @() + } + Process { + Try { + Write-Log -Message 'Retrieving Scheduled Tasks...' -Source ${CmdletName} + [String[]]$exeSchtasksResults = & $exeSchTasks /Query /V /FO CSV + If ($global:LastExitCode -ne 0) { + Throw "Failed to retrieve scheduled tasks using [$exeSchTasks]." + } + [PSObject[]]$SchtasksResults = $exeSchtasksResults | ConvertFrom-Csv -Header 'HostName', 'TaskName', 'Next Run Time', 'Status', 'Logon Mode', 'Last Run Time', 'Last Result', 'Author', 'Task To Run', 'Start In', 'Comment', 'Scheduled Task State', 'Idle Time', 'Power Management', 'Run As User', 'Delete Task If Not Rescheduled', 'Stop Task If Runs X Hours and X Mins', 'Schedule', 'Schedule Type', 'Start Time', 'Start Date', 'End Date', 'Days', 'Months', 'Repeat: Every', 'Repeat: Until: Time', 'Repeat: Until: Duration', 'Repeat: Stop If Still Running' -ErrorAction 'Stop' + + If ($SchtasksResults) { + ForEach ($SchtasksResult in $SchtasksResults) { + If ($SchtasksResult.TaskName -match $TaskName) { + $SchtasksResult | Get-Member -MemberType 'Properties' | + ForEach-Object -Begin { + [Hashtable]$Task = @{} + } -Process { + ## Remove spaces and colons in property names. Do not set property value if line being processed is a column header (this will only work on English language machines). + ($Task.($($_.Name).Replace(' ', '').Replace(':', ''))) = If ($_.Name -ne $SchtasksResult.($_.Name)) { + $SchtasksResult.($_.Name) + } + } -End { + ## Only add task to the custom object if all property values are not empty + If (($Task.Values | Select-Object -Unique | Measure-Object).Count) { + $ScheduledTasks += New-Object -TypeName 'PSObject' -Property $Task + } + } + } + } + } + } + Catch { + Write-Log -Message "Failed to retrieve scheduled tasks. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to retrieve scheduled tasks: $($_.Exception.Message)" + } + } + } + End { + Write-Output -InputObject ($ScheduledTasks) + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +# If Get-ScheduledTask doesn't exist, add alias Get-ScheduledTask +If (-not (Get-Command -Name 'Get-ScheduledTask' -ErrorAction 'SilentlyContinue')) { + New-Alias -Name 'Get-ScheduledTask' -Value 'Get-SchedulerTask' } #endregion #region Function Block-AppExecution Function Block-AppExecution { -<# + <# .SYNOPSIS - Block the execution of an application(s) + +Block the execution of an application(s) + .DESCRIPTION - This function is called when you pass the -BlockExecution parameter to the Stop-RunningApplications function. It does the following: - 1. Makes a copy of this script in a temporary directory on the local machine. - 2. Checks for an existing scheduled task from previous failed installation attempt where apps were blocked and if found, calls the Unblock-AppExecution function to restore the original IFEO registry keys. - This is to prevent the function from overriding the backup of the original IFEO options. - 3. Creates a scheduled task to restore the IFEO registry key values in case the script is terminated uncleanly by calling the local temporary copy of this script with the parameter -CleanupBlockedApps. - 4. Modifies the "Image File Execution Options" registry key for the specified process(s) to call this script with the parameter -ShowBlockedAppDialog. - 5. When the script is called with those parameters, it will display a custom message to the user to indicate that execution of the application has been blocked while the installation is in progress. - The text of this message can be customized in the XML configuration file. + +This function is called when you pass the -BlockExecution parameter to the Stop-RunningApplications function. It does the following: + +1. Makes a copy of this script in a temporary directory on the local machine. +2. Checks for an existing scheduled task from previous failed installation attempt where apps were blocked and if found, calls the Unblock-AppExecution function to restore the original IFEO registry keys. + This is to prevent the function from overriding the backup of the original IFEO options. +3. Creates a scheduled task to restore the IFEO registry key values in case the script is terminated uncleanly by calling the local temporary copy of this script with the parameter -CleanupBlockedApps. +4. Modifies the "Image File Execution Options" registry key for the specified process(s) to call this script with the parameter -ShowBlockedAppDialog. +5. When the script is called with those parameters, it will display a custom message to the user to indicate that execution of the application has been blocked while the installation is in progress. + The text of this message can be customized in the XML configuration file. + .PARAMETER ProcessName - Name of the process or processes separated by commas + +Name of the process or processes separated by commas + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Block-AppExecution -ProcessName ('winword','excel') + +Block-AppExecution -ProcessName ('winword','excel') + .NOTES - This is an internal script function and should typically not be called directly. - It is used when the -BlockExecution parameter is specified with the Show-InstallationWelcome function to block applications. + +This is an internal script function and should typically not be called directly. + +It is used when the -BlockExecution parameter is specified with the Show-InstallationWelcome function to block applications. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ## Specify process names separated by commas - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string[]]$ProcessName - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## Remove illegal characters from the scheduled task arguments string - [char[]]$invalidScheduledTaskChars = '$', '!', '''', '"', '(', ')', ';', '\', '`', '*', '?', '{', '}', '[', ']', '<', '>', '|', '&', '%', '#', '~', '@', ' ' - [string]$SchInstallName = $installName - ForEach ($invalidChar in $invalidScheduledTaskChars) { [string]$SchInstallName = $SchInstallName -replace [regex]::Escape($invalidChar),'' } - [string]$schTaskUnblockAppsCommand += "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `"$dirAppDeployTemp\$scriptFileName`" -CleanupBlockedApps -ReferredInstallName `"$SchInstallName`" -ReferredInstallTitle `"$installTitle`" -ReferredLogName `"$logName`" -AsyncToolkitLaunch" - ## Specify the scheduled task configuration in XML format - [string]$xmlUnblockAppsSchTask = @" + [CmdletBinding()] + Param ( + ## Specify process names separated by commas + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String[]]$ProcessName + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Remove illegal characters from the scheduled task arguments string + [char[]]$invalidScheduledTaskChars = '$', '!', '''', '"', '(', ')', ';', '\', '`', '*', '?', '{', '}', '[', ']', '<', '>', '|', '&', '%', '#', '~', '@', ' ' + [string]$SchInstallName = $installName + ForEach ($invalidChar in $invalidScheduledTaskChars) { + [string]$SchInstallName = $SchInstallName -replace [regex]::Escape($invalidChar),'' + } + [string]$blockExecutionTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'BlockExecution' + [string]$schTaskUnblockAppsCommand += "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `"$blockExecutionTempPath\$scriptFileName`" -CleanupBlockedApps -ReferredInstallName `"$SchInstallName`" -ReferredInstallTitle `"$installTitle`" -ReferredLogName `"$logName`" -AsyncToolkitLaunch" + ## Specify the scheduled task configuration in XML format + [string]$xmlUnblockAppsSchTask = @" - - - - true - - - - - S-1-5-18 - - - - IgnoreNew - false - false - true - false - false - - false - false - - true - true - false - false - false - PT1H - 7 - - - - powershell.exe - $schTaskUnblockAppsCommand - - + + + + true + + + + + S-1-5-18 + + + + IgnoreNew + false + false + true + false + false + + false + false + + true + true + false + false + false + PT1H + 7 + + + + $PSHome\powershell.exe + $schTaskUnblockAppsCommand + + "@ - } - Process { - ## Bypass if in NonInteractive mode - If ($deployModeNonInteractive) { - Write-Log -Message "Bypassing Function [${CmdletName}] [Mode: $deployMode]." -Source ${CmdletName} - Return - } - - [string]$schTaskBlockedAppsName = $installName + '_BlockedApps' - - ## Delete this file if it exists as it can cause failures (it is a bug from an older version of the toolkit) - If (Test-Path -LiteralPath "$configToolkitTempPath\PSAppDeployToolkit" -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { - $null = Remove-Item -LiteralPath "$configToolkitTempPath\PSAppDeployToolkit" -Force -ErrorAction 'SilentlyContinue' - } - ## Create Temporary directory (if required) and copy Toolkit so it can be called by scheduled task later if required - If (-not (Test-Path -LiteralPath $dirAppDeployTemp -PathType 'Container' -ErrorAction 'SilentlyContinue')) { - $null = New-Item -Path $dirAppDeployTemp -ItemType 'Directory' -ErrorAction 'SilentlyContinue' - } - - Copy-Item -Path "$scriptRoot\*.*" -Destination $dirAppDeployTemp -Exclude 'thumbs.db' -Force -Recurse -ErrorAction 'SilentlyContinue' - - ## Build the debugger block value script - [string]$debuggerBlockMessageCmd = "`"powershell.exe -ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `" & chr(34) & `"$dirAppDeployTemp\$scriptFileName`" & chr(34) & `" -ShowBlockedAppDialog -AsyncToolkitLaunch -ReferredInstallTitle `" & chr(34) & `"$installTitle`" & chr(34)" - [string[]]$debuggerBlockScript = "strCommand = $debuggerBlockMessageCmd" - $debuggerBlockScript += 'set oWShell = CreateObject("WScript.Shell")' - $debuggerBlockScript += 'oWShell.Run strCommand, 0, false' - $debuggerBlockScript | Out-File -FilePath "$dirAppDeployTemp\AppDeployToolkit_BlockAppExecutionMessage.vbs" -Force -Encoding 'default' -ErrorAction 'SilentlyContinue' - [string]$debuggerBlockValue = "wscript.exe `"$dirAppDeployTemp\AppDeployToolkit_BlockAppExecutionMessage.vbs`"" - - ## Create a scheduled task to run on startup to call this script and clean up blocked applications in case the installation is interrupted, e.g. user shuts down during installation" - Write-Log -Message 'Create scheduled task to cleanup blocked applications in case installation is interrupted.' -Source ${CmdletName} - If (Get-ScheduledTask -ContinueOnError $true | Select-Object -Property 'TaskName' | Where-Object { $_.TaskName -eq "\$schTaskBlockedAppsName" }) { - Write-Log -Message "Scheduled task [$schTaskBlockedAppsName] already exists." -Source ${CmdletName} - } - Else { - ## Export the scheduled task XML to file - Try { - # Specify the filename to export the XML to - [string]$xmlSchTaskFilePath = "$dirAppDeployTemp\SchTaskUnBlockApps.xml" - [string]$xmlUnblockAppsSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - Return - } - - ## Import the Scheduled Task XML file to create the Scheduled Task - [psobject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/create /f /tn $schTaskBlockedAppsName /xml `"$xmlSchTaskFilePath`"" -WindowStyle 'Hidden' -CreateNoWindow -PassThru - If ($schTaskResult.ExitCode -ne 0) { - Write-Log -Message "Failed to create the scheduled task [$schTaskBlockedAppsName] by importing the scheduled task XML file [$xmlSchTaskFilePath]." -Severity 3 -Source ${CmdletName} - Return - } - } - - [string[]]$blockProcessName = $processName - ## Append .exe to match registry keys - [string[]]$blockProcessName = $blockProcessName | ForEach-Object { $_ + '.exe' } -ErrorAction 'SilentlyContinue' - - ## Enumerate each process and set the debugger value to block application execution - ForEach ($blockProcess in $blockProcessName) { - Write-Log -Message "Set the Image File Execution Option registry key to block execution of [$blockProcess]." -Source ${CmdletName} - Set-RegistryKey -Key (Join-Path -Path $regKeyAppExecution -ChildPath $blockProcess) -Name 'Debugger' -Value $debuggerBlockValue -ContinueOnError $true - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + } + Process { + ## Bypass if no Admin rights + If ($configToolkitRequireAdmin -eq $false) { + Write-Log -Message "Bypassing Function [${CmdletName}], because [Require Admin: $configToolkitRequireAdmin]." -Source ${CmdletName} + Return + } + + [String]$schTaskBlockedAppsName = $installName + '_BlockedApps' + + ## Delete this file if it exists as it can cause failures (it is a bug from an older version of the toolkit) + If (Test-Path -LiteralPath "$configToolkitTempPath\PSAppDeployToolkit" -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { + $null = Remove-Item -LiteralPath "$configToolkitTempPath\PSAppDeployToolkit" -Force -ErrorAction 'SilentlyContinue' + } + + If (Test-Path -LiteralPath $blockExecutionTempPath -PathType 'Container') { + Remove-Folder -Path $blockExecutionTempPath + } + + Try { + $null = New-Item -Path $blockExecutionTempPath -ItemType 'Directory' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Unable to create [$blockExecutionTempPath]. Possible attempt to gain elevated rights." -Source ${CmdletName} + } + + Copy-Item -Path "$scriptRoot\*.*" -Destination $blockExecutionTempPath -Exclude 'thumbs.db' -Force -Recurse -ErrorAction 'SilentlyContinue' + + ## Build the debugger block value script + [String[]]$debuggerBlockScript = "strCommand = `"$PSHome\powershell.exe -ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `" & chr(34) & `"$blockExecutionTempPath\$scriptFileName`" & chr(34) & `" -ShowBlockedAppDialog -AsyncToolkitLaunch -ReferredInstallTitle `" & chr(34) & `"$installTitle`" & chr(34)" + $debuggerBlockScript += 'set oWShell = CreateObject("WScript.Shell")' + $debuggerBlockScript += 'oWShell.Run strCommand, 0, false' + $debuggerBlockScript | Out-File -FilePath "$blockExecutionTempPath\AppDeployToolkit_BlockAppExecutionMessage.vbs" -Force -Encoding 'Default' -ErrorAction 'SilentlyContinue' + [String]$debuggerBlockValue = "$envWinDir\System32\wscript.exe `"$blockExecutionTempPath\AppDeployToolkit_BlockAppExecutionMessage.vbs`"" + + ## Set contents to be readable for all users (BUILTIN\USERS) + Try { + $Users = ConvertTo-NTAccountOrSID -SID 'S-1-5-32-545' + Set-ItemPermission -Path $blockExecutionTempPath -User $Users -Permission 'Read' -Inheritance ('ObjectInherit', 'ContainerInherit') + } + Catch { + Write-Log -Message "Failed to set read permissions on path [$blockExecutionTempPath]. The function might not be able to work correctly." -Source ${CmdletName} -Severity 2 + } + + ## Create a scheduled task to run on startup to call this script and clean up blocked applications in case the installation is interrupted, e.g. user shuts down during installation" + Write-Log -Message 'Creating scheduled task to cleanup blocked applications in case the installation is interrupted.' -Source ${CmdletName} + If (Get-SchedulerTask -ContinueOnError $true | Select-Object -Property 'TaskName' | Where-Object { $_.TaskName -eq "\$schTaskBlockedAppsName" }) { + Write-Log -Message "Scheduled task [$schTaskBlockedAppsName] already exists." -Source ${CmdletName} + } + Else { + ## Export the scheduled task XML to file + Try { + ## Specify the filename to export the XML to + ## XML does not need to be user readable to stays in protected TEMP folder + [String]$xmlSchTaskFilePath = "$dirAppDeployTemp\SchTaskUnBlockApps.xml" + [String]$xmlUnblockAppsSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Return + } + + ## Import the Scheduled Task XML file to create the Scheduled Task + [PSObject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/create /f /tn $schTaskBlockedAppsName /xml `"$xmlSchTaskFilePath`"" -WindowStyle 'Hidden' -CreateNoWindow -PassThru -ExitOnProcessFailure $false + If ($schTaskResult.ExitCode -ne 0) { + Write-Log -Message "Failed to create the scheduled task [$schTaskBlockedAppsName] by importing the scheduled task XML file [$xmlSchTaskFilePath]." -Severity 3 -Source ${CmdletName} + Return + } + } + + [String[]]$blockProcessName = $processName + ## Append .exe to match registry keys + [String[]]$blockProcessName = $blockProcessName | ForEach-Object { $_ + '.exe' } -ErrorAction 'SilentlyContinue' + + ## Enumerate each process and set the debugger value to block application execution + ForEach ($blockProcess in $blockProcessName) { + Write-Log -Message "Setting the Image File Execution Option registry key to block execution of [$blockProcess]." -Source ${CmdletName} + Set-RegistryKey -Key (Join-Path -Path $regKeyAppExecution -ChildPath $blockProcess) -Name 'Debugger' -Value $debuggerBlockValue -ContinueOnError $true + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Unblock-AppExecution Function Unblock-AppExecution { -<# + <# .SYNOPSIS - Unblocks the execution of applications performed by the Block-AppExecution function + +Unblocks the execution of applications performed by the Block-AppExecution function + .DESCRIPTION - This function is called by the Exit-Script function or when the script itself is called with the parameters -CleanupBlockedApps + +This function is called by the Exit-Script function or when the script itself is called with the parameters -CleanupBlockedApps + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Unblock-AppExecution + +Unblock-AppExecution + .NOTES - This is an internal script function and should typically not be called directly. - It is used when the -BlockExecution parameter is specified with the Show-InstallationWelcome function to undo the actions performed by Block-AppExecution. + +This is an internal script function and should typically not be called directly. + +It is used when the -BlockExecution parameter is specified with the Show-InstallationWelcome function to undo the actions performed by Block-AppExecution. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Bypass if in NonInteractive mode - If ($deployModeNonInteractive) { - Write-Log -Message "Bypassing Function [${CmdletName}] [Mode: $deployMode]." -Source ${CmdletName} - Return - } - - ## Remove Debugger values to unblock processes - [psobject[]]$unblockProcesses = $null - [psobject[]]$unblockProcesses += (Get-ChildItem -LiteralPath $regKeyAppExecution -Recurse -ErrorAction 'SilentlyContinue' | ForEach-Object { Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction 'SilentlyContinue'}) - ForEach ($unblockProcess in ($unblockProcesses | Where-Object { $_.Debugger -like '*AppDeployToolkit_BlockAppExecutionMessage*' })) { - Write-Log -Message "Remove the Image File Execution Options registry key to unblock execution of [$($unblockProcess.PSChildName)]." -Source ${CmdletName} - $unblockProcess | Remove-ItemProperty -Name 'Debugger' -ErrorAction 'SilentlyContinue' - } - - ## If block execution variable is $true, set it to $false - If ($BlockExecution) { - # Make this variable globally available so we can check whether we need to call Unblock-AppExecution - Set-Variable -Name 'BlockExecution' -Value $false -Scope 'Script' - } - - ## Remove the scheduled task if it exists - [string]$schTaskBlockedAppsName = $installName + '_BlockedApps' - Try { - If (Get-ScheduledTask -ContinueOnError $true | Select-Object -Property 'TaskName' | Where-Object { $_.TaskName -eq "\$schTaskBlockedAppsName" }) { - Write-Log -Message "Delete Scheduled Task [$schTaskBlockedAppsName]." -Source ${CmdletName} - Execute-Process -Path $exeSchTasks -Parameters "/Delete /TN $schTaskBlockedAppsName /F" - } - } - Catch { - Write-Log -Message "Error retrieving/deleting Scheduled Task.`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Bypass if no Admin rights + If ($configToolkitRequireAdmin -eq $false) { + Write-Log -Message "Bypassing Function [${CmdletName}], because [Require Admin: $configToolkitRequireAdmin]." -Source ${CmdletName} + Return + } + + ## Remove Debugger values to unblock processes + [PSObject[]]$unblockProcesses = $null + [PSObject[]]$unblockProcesses += (Get-ChildItem -LiteralPath $regKeyAppExecution -Recurse -ErrorAction 'SilentlyContinue' | ForEach-Object { Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction 'SilentlyContinue' }) + ForEach ($unblockProcess in ($unblockProcesses | Where-Object { $_.Debugger -like '*AppDeployToolkit_BlockAppExecutionMessage*' })) { + Write-Log -Message "Removing the Image File Execution Options registry key to unblock execution of [$($unblockProcess.PSChildName)]." -Source ${CmdletName} + $unblockProcess | Remove-ItemProperty -Name 'Debugger' -ErrorAction 'SilentlyContinue' + } + + ## If block execution variable is $true, set it to $false + If ($BlockExecution) { + # Make this variable globally available so we can check whether we need to call Unblock-AppExecution + Set-Variable -Name 'BlockExecution' -Value $false -Scope 'Script' + } + + ## Remove the scheduled task if it exists + [String]$schTaskBlockedAppsName = $installName + '_BlockedApps' + Try { + If (Get-SchedulerTask -ContinueOnError $true | Select-Object -Property 'TaskName' | Where-Object { $_.TaskName -eq "\$schTaskBlockedAppsName" }) { + Write-Log -Message "Deleting Scheduled Task [$schTaskBlockedAppsName]." -Source ${CmdletName} + Execute-Process -Path $exeSchTasks -Parameters "/Delete /TN $schTaskBlockedAppsName /F" + } + } + Catch { + Write-Log -Message "Error retrieving/deleting Scheduled Task.`r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Remove BlockAppExecution Schedule Task XML file + [String]$xmlSchTaskFilePath = "$dirAppDeployTemp\SchTaskUnBlockApps.xml" + If (Test-Path -LiteralPath $xmlSchTaskFilePath) { + $null = Remove-Item -LiteralPath $xmlSchTaskFilePath -Force -ErrorAction 'SilentlyContinue' + } + + ## Remove BlockAppExection Temporary directory + [String]$blockExecutionTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'BlockExecution' + If (Test-Path -LiteralPath $blockExecutionTempPath -PathType 'Container') { + Remove-Folder -Path $blockExecutionTempPath + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-DeferHistory Function Get-DeferHistory { -<# + <# .SYNOPSIS - Get the history of deferrals from the registry for the current application, if it exists. + +Get the history of deferrals from the registry for the current application, if it exists. + .DESCRIPTION - Get the history of deferrals from the registry for the current application, if it exists. + +Get the history of deferrals from the registry for the current application, if it exists. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the history of deferrals from the registry for the current application, if it exists. + .EXAMPLE - Get-DeferHistory + +Get-DeferHistory + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Write-Log -Message 'Get deferral history...' -Source ${CmdletName} - Get-RegistryKey -Key $regKeyDeferHistory -ContinueOnError $true - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Write-Log -Message 'Getting deferral history...' -Source ${CmdletName} + Get-RegistryKey -Key $regKeyDeferHistory -ContinueOnError $true + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-DeferHistory Function Set-DeferHistory { -<# + <# .SYNOPSIS - Set the history of deferrals in the registry for the current application. + +Set the history of deferrals in the registry for the current application. + .DESCRIPTION - Set the history of deferrals in the registry for the current application. + +Set the history of deferrals in the registry for the current application. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return any objects. + .EXAMPLE - Set-DeferHistory + +Set-DeferHistory + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [string]$deferTimesRemaining, - [Parameter(Mandatory=$false)] - [string]$deferDeadline - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - If ($deferTimesRemaining -and ($deferTimesRemaining -ge 0)) { - Write-Log -Message "Set deferral history: [DeferTimesRemaining = $deferTimesRemaining]." -Source ${CmdletName} - Set-RegistryKey -Key $regKeyDeferHistory -Name 'DeferTimesRemaining' -Value $deferTimesRemaining -ContinueOnError $true - } - If ($deferDeadline) { - Write-Log -Message "Set deferral history: [DeferDeadline = $deferDeadline]." -Source ${CmdletName} - Set-RegistryKey -Key $regKeyDeferHistory -Name 'DeferDeadline' -Value $deferDeadline -ContinueOnError $true - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [String]$deferTimesRemaining, + [Parameter(Mandatory = $false)] + [String]$deferDeadline + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($deferTimesRemaining -and ($deferTimesRemaining -ge 0)) { + Write-Log -Message "Setting deferral history: [DeferTimesRemaining = $deferTimesRemaining]." -Source ${CmdletName} + Set-RegistryKey -Key $regKeyDeferHistory -Name 'DeferTimesRemaining' -Value $deferTimesRemaining -ContinueOnError $true + } + If ($deferDeadline) { + Write-Log -Message "Setting deferral history: [DeferDeadline = $deferDeadline]." -Source ${CmdletName} + Set-RegistryKey -Key $regKeyDeferHistory -Name 'DeferDeadline' -Value $deferDeadline -ContinueOnError $true + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-UniversalDate Function Get-UniversalDate { -<# + <# .SYNOPSIS - Returns the date/time for the local culture in a universal sortable date time pattern. + +Returns the date/time for the local culture in a universal sortable date time pattern. + .DESCRIPTION - Converts the current datetime or a datetime string for the current culture into a universal sortable date time pattern, e.g. 2013-08-22 11:51:52Z + +Converts the current datetime or a datetime string for the current culture into a universal sortable date time pattern, e.g. 2013-08-22 11:51:52Z + .PARAMETER DateTime - Specify the DateTime in the current culture. + +Specify the DateTime in the current culture. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default: $false. + +Continue if an error is encountered. Default: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the date/time for the local culture in a universal sortable date time pattern. + .EXAMPLE - Get-UniversalDate - Returns the current date in a universal sortable date time pattern. + +Get-UniversalDate + +Returns the current date in a universal sortable date time pattern. + .EXAMPLE - Get-UniversalDate -DateTime '25/08/2013' - Returns the date for the current culture in a universal sortable date time pattern. + +Get-UniversalDate -DateTime '25/08/2013' + +Returns the date for the current culture in a universal sortable date time pattern. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - # Get the current date - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$DateTime = ((Get-Date -Format ($culture).DateTimeFormat.FullDateTimePattern).ToString()), - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## If a universal sortable date time pattern was provided, remove the Z, otherwise it could get converted to a different time zone. - If ($DateTime -match 'Z$') { $DateTime = $DateTime -replace 'Z$', '' } - [datetime]$DateTime = [datetime]::Parse($DateTime, $culture) - - ## Convert the date to a universal sortable date time pattern based on the current culture - Write-Log -Message "Convert the date [$DateTime] to a universal sortable date time pattern based on the current culture [$($culture.Name)]." -Source ${CmdletName} - [string]$universalDateTime = (Get-Date -Date $DateTime -Format ($culture).DateTimeFormat.UniversalSortableDateTimePattern -ErrorAction 'Stop').ToString() - Write-Output -InputObject $universalDateTime - } - Catch { - Write-Log -Message "The specified date/time [$DateTime] is not in a format recognized by the current culture [$($culture.Name)]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "The specified date/time [$DateTime] is not in a format recognized by the current culture: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + # Get the current date + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$DateTime = ((Get-Date -Format ($culture).DateTimeFormat.UniversalDateTimePattern).ToString()), + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If a universal sortable date time pattern was provided, remove the Z, otherwise it could get converted to a different time zone. + If ($DateTime -match 'Z$') { + $DateTime = $DateTime -replace 'Z$', '' + } + [DateTime]$DateTime = [DateTime]::Parse($DateTime, $culture) + + ## Convert the date to a universal sortable date time pattern based on the current culture + Write-Log -Message "Converting the date [$DateTime] to a universal sortable date time pattern based on the current culture [$($culture.Name)]." -Source ${CmdletName} + [String]$universalDateTime = (Get-Date -Date $DateTime -Format ($culture).DateTimeFormat.UniversalSortableDateTimePattern -ErrorAction 'Stop').ToString() + Write-Output -InputObject ($universalDateTime) + } + Catch { + Write-Log -Message "The specified date/time [$DateTime] is not in a format recognized by the current culture [$($culture.Name)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "The specified date/time [$DateTime] is not in a format recognized by the current culture: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-RunningProcesses Function Get-RunningProcesses { -<# + <# .SYNOPSIS - Gets the processes that are running from a custom list of process objects and also adds a property called ProcessDescription. + +Gets the processes that are running from a custom list of process objects and also adds a property called ProcessDescription. + .DESCRIPTION - Gets the processes that are running from a custom list of process objects and also adds a property called ProcessDescription. + +Gets the processes that are running from a custom list of process objects and also adds a property called ProcessDescription. + .PARAMETER ProcessObjects - Custom object containing the process objects to search for. + +Custom object containing the process objects to search for. If not supplied, the function just returns $null + +.PARAMETER DisableLogging + +Disables function logging + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +Syste.Boolean. + +Rettuns $true if the process is running, otherwise $false. + .EXAMPLE - Get-RunningProcesses + +Get-RunningProcesses -ProcessObjects $ProcessObjects + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,Position=0)] - [psobject[]]$ProcessObjects, - [Parameter(Mandatory=$false,Position=1)] - [switch]$DisableLogging - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - If ($processObjects) { - [string]$runningAppsCheck = ($processObjects | ForEach-Object { $_.ProcessName }) -join ',' - If (-not($DisableLogging)) { - Write-Log -Message "Check for running application(s) [$runningAppsCheck]..." -Source ${CmdletName} - } - ## Create an array of process names to search for - [string[]]$processNames = $processObjects | ForEach-Object { $_.ProcessName } - - ## Get all running processes and escape special characters. Match against the process names to search for to find running processes. - [Diagnostics.Process[]]$runningProcesses = Get-Process | Where-Object { $processNames -contains $_.ProcessName } - - If ($runningProcesses) { - [string]$runningProcessList = ($runningProcesses | ForEach-Object { $_.ProcessName } | Select-Object -Unique) -join ',' - If (-not($DisableLogging)) { - Write-Log -Message "The following processes are running: [$runningProcessList]." -Source ${CmdletName} - Write-Log -Message 'Resolve process descriptions...' -Source ${CmdletName} - } - ## Resolve the running process names to descriptions - ForEach ($runningProcess in $runningProcesses) { - ForEach ($processObject in $processObjects) { - If ($runningProcess.ProcessName -eq $processObject.ProcessName) { - If ($processObject.ProcessDescription) { - # The description of the process provided as a Parameter to the function, e.g. -ProcessName "winword=Microsoft Office Word". - $runningProcess | Add-Member -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $processObject.ProcessDescription -Force -PassThru -ErrorAction 'SilentlyContinue' - } - ElseIf ($runningProcess.Description) { - # If the process already has a description field specified, then use it - $runningProcess | Add-Member -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $runningProcess.Description -Force -PassThru -ErrorAction 'SilentlyContinue' - } - Else { - # Fall back on the process name if no description is provided by the process or as a parameter to the function - $runningProcess | Add-Member -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $runningProcess.ProcessName -Force -PassThru -ErrorAction 'SilentlyContinue' - } - } - } - } - } - Else { - If (-not($DisableLogging)) { - Write-Log -Message 'Application(s) are not running.' -Source ${CmdletName} - } - } - Write-Output -InputObject $runningProcesses - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false, Position = 0)] + [PSObject[]]$ProcessObjects, + [Parameter(Mandatory = $false, Position = 1)] + [Switch]$DisableLogging + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($processObjects -and $processObjects[0].ProcessName) { + [String]$runningAppsCheck = $processObjects.ProcessName -join ',' + If (-not $DisableLogging) { + Write-Log -Message "Checking for running applications: [$runningAppsCheck]" -Source ${CmdletName} + } + ## Prepare a filter for Where-Object + [ScriptBlock]$whereObjectFilter = { + ForEach ($processObject in $processObjects) { + If ($_.ProcessName -ieq $processObject.ProcessName) { + If ($processObject.ProcessDescription) { + # The description of the process provided as a Parameter to the function, e.g. -ProcessName "winword=Microsoft Office Word". + Add-Member -InputObject $_ -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $processObject.ProcessDescription -Force -PassThru -ErrorAction 'SilentlyContinue' + } + ElseIf ($_.Description) { + # If the process already has a description field specified, then use it + Add-Member -InputObject $_ -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $_.Description -Force -PassThru -ErrorAction 'SilentlyContinue' + } + Else { + # Fall back on the process name if no description is provided by the process or as a parameter to the function + Add-Member -InputObject $_ -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $_.ProcessName -Force -PassThru -ErrorAction 'SilentlyContinue' + } + Write-Output -InputObject ($true) + Return + } + } + + Write-Output -InputObject ($false) + Return + } + ## Get all running processes and escape special characters. Match against the process names to search for to find running processes. + [Diagnostics.Process[]]$runningProcesses = Get-Process | Where-Object -FilterScript $whereObjectFilter | Sort-Object -Property 'ProcessName' + + If (-not $DisableLogging) { + If ($runningProcesses) { + [String]$runningProcessList = ($runningProcesses.ProcessName | Select-Object -Unique) -join ',' + Write-Log -Message "The following processes are running: [$runningProcessList]." -Source ${CmdletName} + } + Else { + Write-Log -Message 'Specified applications are not running.' -Source ${CmdletName} + } + } + Write-Output -InputObject ($runningProcesses) + } + Else { + Write-Output -InputObject ($null) + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Show-InstallationWelcome Function Show-InstallationWelcome { -<# + <# .SYNOPSIS - Show a welcome dialog prompting the user with information about the installation and actions to be performed before the installation can begin. + +Show a welcome dialog prompting the user with information about the installation and actions to be performed before the installation can begin. + .DESCRIPTION - The following prompts can be included in the welcome dialog: - a) Close the specified running applications, or optionally close the applications without showing a prompt (using the -Silent switch). - b) Defer the installation a certain number of times, for a certain number of days or until a deadline is reached. - c) Countdown until applications are automatically closed. - d) Prevent users from launching the specified applications while the installation is in progress. - Notes: - The process descriptions are retrieved from WMI, with a fall back on the process name if no description is available. Alternatively, you can specify the description yourself with a '=' symbol - see examples. - The dialog box will timeout after the timeout specified in the XML configuration file (default 1 hour and 55 minutes) to prevent SCCM installations from timing out and returning a failure code to SCCM. When the dialog times out, the script will exit and return a 1618 code (SCCM fast retry code). + +The following prompts can be included in the welcome dialog: + a) Close the specified running applications, or optionally close the applications without showing a prompt (using the -Silent switch). + b) Defer the installation a certain number of times, for a certain number of days or until a deadline is reached. + c) Countdown until applications are automatically closed. + d) Prevent users from launching the specified applications while the installation is in progress. + +Notes: + The process descriptions are retrieved from WMI, with a fall back on the process name if no description is available. Alternatively, you can specify the description yourself with a '=' symbol - see examples. + The dialog box will timeout after the timeout specified in the XML configuration file (default 1 hour and 55 minutes) to prevent SCCM installations from timing out and returning a failure code to SCCM. When the dialog times out, the script will exit and return a 1618 code (SCCM fast retry code). + .PARAMETER CloseApps - Name of the process to stop (do not include the .exe). Specify multiple processes separated by a comma. Specify custom descriptions like this: "winword=Microsoft Office Word,excel=Microsoft Office Excel" + +Name of the process to stop (do not include the .exe). Specify multiple processes separated by a comma. Specify custom descriptions like this: "winword=Microsoft Office Word,excel=Microsoft Office Excel" + .PARAMETER Silent - Stop processes without prompting the user. + +Stop processes without prompting the user. + .PARAMETER CloseAppsCountdown - Option to provide a countdown in seconds until the specified applications are automatically closed. This only takes effect if deferral is not allowed or has expired. + +Option to provide a countdown in seconds until the specified applications are automatically closed. This only takes effect if deferral is not allowed or has expired. + .PARAMETER ForceCloseAppsCountdown - Option to provide a countdown in seconds until the specified applications are automatically closed regardless of whether deferral is allowed. + +Option to provide a countdown in seconds until the specified applications are automatically closed regardless of whether deferral is allowed. + .PARAMETER PromptToSave - Specify whether to prompt to save working documents when the user chooses to close applications by selecting the "Close Programs" button. Option does not work in SYSTEM context unless toolkit launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + +Specify whether to prompt to save working documents when the user chooses to close applications by selecting the "Close Programs" button. Option does not work in SYSTEM context unless toolkit launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + .PARAMETER PersistPrompt - Specify whether to make the prompt persist in the center of the screen every 10 seconds. The user will have no option but to respond to the prompt. This only takes effect if deferral is not allowed or has expired. + +Specify whether to make the Show-InstallationWelcome prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. The user will have no option but to respond to the prompt. This only takes effect if deferral is not allowed or has expired. + .PARAMETER BlockExecution - Option to prevent the user from launching the process/application during the installation. + +Option to prevent the user from launching processes/applications, specified in -CloseApps, during the installation. + .PARAMETER AllowDefer - Enables an optional defer button to allow the user to defer the installation. + +Enables an optional defer button to allow the user to defer the installation. + .PARAMETER AllowDeferCloseApps - Enables an optional defer button to allow the user to defer the installation only if there are running applications that need to be closed. + +Enables an optional defer button to allow the user to defer the installation only if there are running applications that need to be closed. This parameter automatically enables -AllowDefer + .PARAMETER DeferTimes - Specify the number of times the installation can be deferred. + +Specify the number of times the installation can be deferred. + .PARAMETER DeferDays - Specify the number of days since first run that the installation can be deferred. This is converted to a deadline. + +Specify the number of days since first run that the installation can be deferred. This is converted to a deadline. + .PARAMETER DeferDeadline - Specify the deadline date until which the installation can be deferred. - Specify the date in the local culture if the script is intended for that same culture. - If the script is intended to run on EN-US machines, specify the date in the format: "08/25/2013" or "08-25-2013" or "08-25-2013 18:00:00" - If the script is intended for multiple cultures, specify the date in the universal sortable date/time format: "2013-08-22 11:51:52Z" - The deadline date will be displayed to the user in the format of their culture. + +Specify the deadline date until which the installation can be deferred. + +Specify the date in the local culture if the script is intended for that same culture. + +If the script is intended to run on EN-US machines, specify the date in the format: "08/25/2013" or "08-25-2013" or "08-25-2013 18:00:00" + +If the script is intended for multiple cultures, specify the date in the universal sortable date/time format: "2013-08-22 11:51:52Z" + +The deadline date will be displayed to the user in the format of their culture. + .PARAMETER CheckDiskSpace - Specify whether to check if there is enough disk space for the installation to proceed. - If this parameter is specified without the RequiredDiskSpace parameter, the required disk space is calculated automatically based on the size of the script source and associated files. + +Specify whether to check if there is enough disk space for the installation to proceed. + +If this parameter is specified without the RequiredDiskSpace parameter, the required disk space is calculated automatically based on the size of the script source and associated files. + .PARAMETER RequiredDiskSpace - Specify required disk space in MB, used in combination with CheckDiskSpace. + +Specify required disk space in MB, used in combination with CheckDiskSpace. + .PARAMETER MinimizeWindows - Specifies whether to minimize other windows when displaying prompt. Default: $true. + +Specifies whether to minimize other windows when displaying prompt. Default: $true. + .PARAMETER TopMost - Specifies whether the windows is the topmost window. Default: $true. + +Specifies whether the windows is the topmost window. Default: $true. + .PARAMETER ForceCountdown - Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled. + +Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled. + .PARAMETER CustomText - Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + +Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return objects. + .EXAMPLE - Show-InstallationWelcome -CloseApps 'iexplore,winword,excel' - Prompt the user to close Internet Explorer, Word and Excel. + +Show-InstallationWelcome -CloseApps 'iexplore,winword,excel' + +Prompt the user to close Internet Explorer, Word and Excel. + .EXAMPLE - Show-InstallationWelcome -CloseApps 'winword,excel' -Silent - Close Word and Excel without prompting the user. + +Show-InstallationWelcome -CloseApps 'winword,excel' -Silent + +Close Word and Excel without prompting the user. + .EXAMPLE - Show-InstallationWelcome -CloseApps 'winword,excel' -BlockExecution - Close Word and Excel and prevent the user from launching the applications while the installation is in progress. + +Show-InstallationWelcome -CloseApps 'winword,excel' -BlockExecution + +Close Word and Excel and prevent the user from launching the applications while the installation is in progress. + .EXAMPLE - Show-InstallationWelcome -CloseApps 'winword=Microsoft Office Word,excel=Microsoft Office Excel' -CloseAppsCountdown 600 - Prompt the user to close Word and Excel, with customized descriptions for the applications and automatically close the applications after 10 minutes. + +Show-InstallationWelcome -CloseApps 'winword=Microsoft Office Word,excel=Microsoft Office Excel' -CloseAppsCountdown 600 + +Prompt the user to close Word and Excel, with customized descriptions for the applications and automatically close the applications after 10 minutes. + .EXAMPLE - Show-InstallationWelcome -CloseApps 'winword,msaccess,excel' -PersistPrompt - Prompt the user to close Word, MSAccess and Excel. - By using the PersistPrompt switch, the dialog will return to the center of the screen every 10 seconds so the user cannot ignore it by dragging it aside. + +Show-InstallationWelcome -CloseApps 'winword,msaccess,excel' -PersistPrompt + +Prompt the user to close Word, MSAccess and Excel. + +By using the PersistPrompt switch, the dialog will return to the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml, so the user cannot ignore it by dragging it aside. + .EXAMPLE - Show-InstallationWelcome -AllowDefer -DeferDeadline '25/08/2013' - Allow the user to defer the installation until the deadline is reached. + +Show-InstallationWelcome -AllowDefer -DeferDeadline '25/08/2013' + +Allow the user to defer the installation until the deadline is reached. + .EXAMPLE - Show-InstallationWelcome -CloseApps 'winword,excel' -BlockExecution -AllowDefer -DeferTimes 10 -DeferDeadline '25/08/2013' -CloseAppsCountdown 600 - Close Word and Excel and prevent the user from launching the applications while the installation is in progress. - Allow the user to defer the installation a maximum of 10 times or until the deadline is reached, whichever happens first. - When deferral expires, prompt the user to close the applications and automatically close them after 10 minutes. + +Show-InstallationWelcome -CloseApps 'winword,excel' -BlockExecution -AllowDefer -DeferTimes 10 -DeferDeadline '25/08/2013' -CloseAppsCountdown 600 + +Close Word and Excel and prevent the user from launching the applications while the installation is in progress. + +Allow the user to defer the installation a maximum of 10 times or until the deadline is reached, whichever happens first. + +When deferral expires, prompt the user to close the applications and automatically close them after 10 minutes. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding(DefaultParametersetName='None')] - - Param ( - ## Specify process names separated by commas. Optionally specify a process description with an equals symbol, e.g. "winword=Microsoft Office Word" - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$CloseApps, - ## Specify whether to prompt user or force close the applications - [Parameter(Mandatory=$false)] - [switch]$Silent = $false, - ## Specify a countdown to display before automatically closing applications where deferral is not allowed or has expired - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$CloseAppsCountdown = 0, - ## Specify a countdown to display before automatically closing applications whether or not deferral is allowed - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$ForceCloseAppsCountdown = 0, - ## Specify whether to prompt to save working documents when the user chooses to close applications by selecting the "Close Programs" button - [Parameter(Mandatory=$false)] - [switch]$PromptToSave = $false, - ## Specify whether to make the prompt persist in the center of the screen every 10 seconds. - [Parameter(Mandatory=$false)] - [switch]$PersistPrompt = $false, - ## Specify whether to block execution of the processes during installation - [Parameter(Mandatory=$false)] - [switch]$BlockExecution = $false, - ## Specify whether to enable the optional defer button on the dialog box - [Parameter(Mandatory=$false)] - [switch]$AllowDefer = $false, - ## Specify whether to enable the optional defer button on the dialog box only if an app needs to be closed - [Parameter(Mandatory=$false)] - [switch]$AllowDeferCloseApps = $false, - ## Specify the number of times the deferral is allowed - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$DeferTimes = 0, - ## Specify the number of days since first run that the deferral is allowed - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$DeferDays = 0, - ## Specify the deadline (in format dd/mm/yyyy) for which deferral will expire as an option - [Parameter(Mandatory=$false)] - [string]$DeferDeadline = '', - ## Specify whether to check if there is enough disk space for the installation to proceed. If this parameter is specified without the RequiredDiskSpace parameter, the required disk space is calculated automatically based on the size of the script source and associated files. - [Parameter(ParameterSetName = "CheckDiskSpaceParameterSet",Mandatory=$true)] - [ValidateScript({$_.IsPresent -eq ($true -or $false)})] - [switch]$CheckDiskSpace, - ## Specify required disk space in MB, used in combination with $CheckDiskSpace. - [Parameter(ParameterSetName = "CheckDiskSpaceParameterSet",Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$RequiredDiskSpace = 0, - ## Specify whether to minimize other windows when displaying prompt - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$MinimizeWindows = $true, - ## Specifies whether the window is the topmost window - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$TopMost = $true, - ## Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$ForceCountdown = 0, - ## Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. - [Parameter(Mandatory=$false)] - [switch]$CustomText = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## If running in NonInteractive mode, force the processes to close silently - If ($deployModeNonInteractive) { $Silent = $true } - - ## If using Zero-Config MSI Deployment, append any executables found in the MSI to the CloseApps list - If ($useDefaultMsi) { $CloseApps = "$CloseApps,$defaultMsiExecutablesList" } - - ## Check disk space requirements if specified - If ($CheckDiskSpace) { - Write-Log -Message 'Evaluate disk space requirements.' -Source ${CmdletName} - [double]$freeDiskSpace = Get-FreeDiskSpace - If ($RequiredDiskSpace -eq 0) { - Try { - # Determine the size of the Files folder - $fso = New-Object -ComObject 'Scripting.FileSystemObject' -ErrorAction 'Stop' - $RequiredDiskSpace = [math]::Round((($fso.GetFolder($scriptParentPath).Size) / 1MB)) - } - Catch { - Write-Log -Message "Failed to calculate disk space requirement from source files. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - If ($freeDiskSpace -lt $RequiredDiskSpace) { - Write-Log -Message "Failed to meet minimum disk space requirement. Space Required [$RequiredDiskSpace MB], Space Available [$freeDiskSpace MB]." -Severity 3 -Source ${CmdletName} - If (-not $Silent) { - Show-InstallationPrompt -Message ($configDiskSpaceMessage -f $installTitle, $RequiredDiskSpace, ($freeDiskSpace)) -ButtonRightText 'OK' -Icon 'Error' - } - Exit-Script -ExitCode $configInstallationUIExitCode - } - Else { - Write-Log -Message 'Successfully passed minimum disk space requirement check.' -Source ${CmdletName} - } - } - - If ($CloseApps) { - ## Create a Process object with custom descriptions where they are provided (split on an '=' sign) - [psobject[]]$processObjects = @() - # Split multiple processes on a comma, then split on equal sign, then create custom object with process name and description - ForEach ($process in ($CloseApps -split ',' | Where-Object { $_ })) { - If ($process.Contains('=')) { - [string[]]$ProcessSplit = $process -split '=' - $processObjects += New-Object -TypeName 'PSObject' -Property @{ - ProcessName = $ProcessSplit[0] - ProcessDescription = $ProcessSplit[1] - } - } - Else { - [string]$ProcessInfo = $process - $processObjects += New-Object -TypeName 'PSObject' -Property @{ - ProcessName = $process - ProcessDescription = '' - } - } - } - } - - ## Check Deferral history and calculate remaining deferrals - If (($allowDefer) -or ($AllowDeferCloseApps)) { - # Set $allowDefer to true if $AllowDeferCloseApps is true - $allowDefer = $true - - # Get the deferral history from the registry - $deferHistory = Get-DeferHistory - $deferHistoryTimes = $deferHistory | Select-Object -ExpandProperty 'DeferTimesRemaining' -ErrorAction 'SilentlyContinue' - $deferHistoryDeadline = $deferHistory | Select-Object -ExpandProperty 'DeferDeadline' -ErrorAction 'SilentlyContinue' - - # Reset Switches - $checkDeferDays = $false - $checkDeferDeadline = $false - If ($DeferDays -ne 0) { $checkDeferDays = $true } - If ($DeferDeadline) { $checkDeferDeadline = $true } - If ($DeferTimes -ne 0) { - If ($deferHistoryTimes -ge 0) { - Write-Log -Message "Defer history shows [$($deferHistory.DeferTimesRemaining)] deferrals remaining." -Source ${CmdletName} - $DeferTimes = $deferHistory.DeferTimesRemaining - 1 - } - Else { - $DeferTimes = $DeferTimes - 1 - } - Write-Log -Message "User has [$deferTimes] deferrals remaining." -Source ${CmdletName} - If ($DeferTimes -lt 0) { - Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} - $AllowDefer = $false - } - } - Else { - If (Test-Path -LiteralPath 'variable:deferTimes') { Remove-Variable -Name 'deferTimes' } - $DeferTimes = $null - } - If ($checkDeferDays -and $allowDefer) { - If ($deferHistoryDeadline) { - Write-Log -Message "Defer history shows a deadline date of [$deferHistoryDeadline]." -Source ${CmdletName} - [string]$deferDeadlineUniversal = Get-UniversalDate -DateTime $deferHistoryDeadline - } - Else { - [string]$deferDeadlineUniversal = Get-UniversalDate -DateTime (Get-Date -Date ((Get-Date).AddDays($deferDays)) -Format ($culture).DateTimeFormat.FullDateTimePattern) - } - Write-Log -Message "User has until [$deferDeadlineUniversal] before deferral expires." -Source ${CmdletName} - If ((Get-UniversalDate) -gt $deferDeadlineUniversal) { - Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} - $AllowDefer = $false - } - } - If ($checkDeferDeadline -and $allowDefer) { - # Validate Date - Try { - [string]$deferDeadlineUniversal = Get-UniversalDate -DateTime $deferDeadline -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Date is not in the correct format for the current culture. Type the date in the current locale format, such as 20/08/2014 (Europe) or 08/20/2014 (United States). If the script is intended for multiple cultures, specify the date in the universal sortable date/time format, e.g. '2013-08-22 11:51:52Z'. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - Throw "Date is not in the correct format for the current culture. Type the date in the current locale format, such as 20/08/2014 (Europe) or 08/20/2014 (United States). If the script is intended for multiple cultures, specify the date in the universal sortable date/time format, e.g. '2013-08-22 11:51:52Z': $($_.Exception.Message)" - } - Write-Log -Message "User has until [$deferDeadlineUniversal] remaining." -Source ${CmdletName} - If ((Get-UniversalDate) -gt $deferDeadlineUniversal) { - Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} - $AllowDefer = $false - } - } - } - If (($deferTimes -lt 0) -and (-not ($deferDeadlineUniversal))) { $AllowDefer = $false } - - ## Prompt the user to close running applications and optionally defer if enabled - If (-not ($deployModeSilent) -and (-not ($silent))) { - If ($forceCloseAppsCountdown -gt 0) { - # Keep the same variable for countdown to simplify the code: - $closeAppsCountdown = $forceCloseAppsCountdown - # Change this variable to a boolean now to switch the countdown on even with deferral - [boolean]$forceCloseAppsCountdown = $true - } - ElseIf ($forceCountdown -gt 0){ - # Keep the same variable for countdown to simplify the code: - $closeAppsCountdown = $forceCountdown - # Change this variable to a boolean now to switch the countdown on - [boolean]$forceCountdown = $true - } - Set-Variable -Name 'closeAppsCountdownGlobal' -Value $closeAppsCountdown -Scope 'Script' - - While ((Get-RunningProcesses -ProcessObjects $processObjects -OutVariable 'runningProcesses') -or (($promptResult -ne 'Defer') -and ($promptResult -ne 'Close'))) { - [string]$runningProcessDescriptions = ($runningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Select-Object -Unique | Sort-Object) -join ',' - # Check if we need to prompt the user to defer, to defer and close apps, or not to prompt them at all - If ($allowDefer) { - # If there is deferral and closing apps is allowed but there are no apps to be closed, break the while loop - If ($AllowDeferCloseApps -and (-not $runningProcessDescriptions)) { - Break - } - # Otherwise, as long as the user has not selected to close the apps or the processes are still running and the user has not selected to continue, prompt user to close running processes with deferral - ElseIf (($promptResult -ne 'Close') -or (($runningProcessDescriptions) -and ($promptResult -ne 'Continue'))) { - [string]$promptResult = Show-WelcomePrompt -ProcessDescriptions $runningProcessDescriptions -CloseAppsCountdown $closeAppsCountdownGlobal -ForceCloseAppsCountdown $forceCloseAppsCountdown -ForceCountdown $forceCountdown -PersistPrompt $PersistPrompt -AllowDefer -DeferTimes $deferTimes -DeferDeadline $deferDeadlineUniversal -MinimizeWindows $MinimizeWindows -CustomText:$CustomText -TopMost $TopMost - } - } - # If there is no deferral and processes are running, prompt the user to close running processes with no deferral option - ElseIf (($runningProcessDescriptions) -or ($forceCountdown)) { - [string]$promptResult = Show-WelcomePrompt -ProcessDescriptions $runningProcessDescriptions -CloseAppsCountdown $closeAppsCountdownGlobal -ForceCloseAppsCountdown $forceCloseAppsCountdown -ForceCountdown $forceCountdown -PersistPrompt $PersistPrompt -MinimizeWindows $minimizeWindows -CustomText:$CustomText -TopMost $TopMost - } - # If there is no deferral and no processes running, break the while loop - Else { - Break - } - - # If the user has clicked OK, wait a few seconds for the process to terminate before evaluating the running processes again - If ($promptResult -eq 'Continue') { - Write-Log -Message 'User selected to continue...' -Source ${CmdletName} - Start-Sleep -Seconds 2 - - # Break the while loop if there are no processes to close and the user has clicked OK to continue - If (-not $runningProcesses) { Break } - } - # Force the applications to close - ElseIf ($promptResult -eq 'Close') { - Write-Log -Message 'User selected to force the application(s) to close...' -Source ${CmdletName} - If (($PromptToSave) -and ($SessionZero -and (-not $IsProcessUserInteractive))) { - Write-Log -Message 'Specified [-PromptToSave] option will not be available because current process is running in session zero and is not interactive.' -Severity 2 -Source ${CmdletName} - } - - ForEach ($runningProcess in $runningProcesses) { - [psobject[]]$AllOpenWindowsForRunningProcess = Get-WindowTitle -GetAllWindowTitles -DisableFunctionLogging | Where-Object { $_.ParentProcess -eq $runningProcess.Name } - # If the PromptToSave parameter was specified and the process has a window open, then prompt the user to save work if there is work to be saved when closing window - If (($PromptToSave) -and (-not ($SessionZero -and (-not $IsProcessUserInteractive))) -and ($AllOpenWindowsForRunningProcess) -and ($runningProcess.MainWindowHandle -ne [IntPtr]::Zero)) { - [timespan]$PromptToSaveTimeout = New-TimeSpan -Seconds $configInstallationPromptToSave - [Diagnostics.StopWatch]$PromptToSaveStopWatch = [Diagnostics.StopWatch]::StartNew() - $PromptToSaveStopWatch.Reset() - ForEach ($OpenWindow in $AllOpenWindowsForRunningProcess) { - Try { - Write-Log -Message "Stop process [$($runningProcess.Name)] with window title [$($OpenWindow.WindowTitle)] and prompt to save if there is work to be saved (timeout in [$configInstallationPromptToSave] seconds)..." -Source ${CmdletName} - [boolean]$IsBringWindowToFrontSuccess = [PSADT.UiAutomation]::BringWindowToFront($OpenWindow.WindowHandle) - [boolean]$IsCloseWindowCallSuccess = $runningProcess.CloseMainWindow() - If (-not $IsCloseWindowCallSuccess) { - Write-Log -Message "Failed to call the CloseMainWindow() method on process [$($runningProcess.Name)] with window title [$($OpenWindow.WindowTitle)] because the main window may be disabled due to a modal dialog being shown." -Severity 3 -Source ${CmdletName} - } - Else { - $PromptToSaveStopWatch.Start() - Do { - [boolean]$IsWindowOpen = [boolean](Get-WindowTitle -GetAllWindowTitles -DisableFunctionLogging | Where-Object { $_.WindowHandle -eq $OpenWindow.WindowHandle }) - If (-not $IsWindowOpen) { Break } - Start-Sleep -Seconds 3 - } While (($IsWindowOpen) -and ($PromptToSaveStopWatch.Elapsed -lt $PromptToSaveTimeout)) - $PromptToSaveStopWatch.Reset() - If ($IsWindowOpen) { - Write-Log -Message "Exceeded the [$configInstallationPromptToSave] seconds timeout value for the user to save work associated with process [$($runningProcess.Name)] with window title [$($OpenWindow.WindowTitle)]." -Severity 2 -Source ${CmdletName} - } - Else { - Write-Log -Message "Window [$($OpenWindow.WindowTitle)] for process [$($runningProcess.Name)] was successfully closed." -Source ${CmdletName} - } - } - } - Catch { - Write-Log -Message "Failed to close window [$($OpenWindow.WindowTitle)] for process [$($runningProcess.Name)]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - Continue - } - Finally { - $runningProcess.Refresh() - } - } - } - Else { - Write-Log -Message "Stop process $($runningProcess.Name)..." -Source ${CmdletName} - Stop-Process -Id $runningProcess.Id -Force -ErrorAction 'SilentlyContinue' - } - } - Start-Sleep -Seconds 2 - } - # Stop the script (if not actioned before the timeout value) - ElseIf ($promptResult -eq 'Timeout') { - Write-Log -Message 'Installation not actioned before the timeout value.' -Source ${CmdletName} - $BlockExecution = $false - - If (($deferTimes) -or ($deferDeadlineUniversal)) { - Set-DeferHistory -DeferTimesRemaining $DeferTimes -DeferDeadline $deferDeadlineUniversal - } - ## Dispose the welcome prompt timer here because if we dispose it within the Show-WelcomePrompt function we risk resetting the timer and missing the specified timeout period - If ($script:welcomeTimer) { - Try { - $script:welcomeTimer.Dispose() - $script:welcomeTimer = $null - } - Catch { } - } - - # Restore minimized windows - $null = $shellApp.UndoMinimizeAll() - - Exit-Script -ExitCode $configInstallationUIExitCode - } - # Stop the script (user chose to defer) - ElseIf ($promptResult -eq 'Defer') { - Write-Log -Message 'Installation deferred by the user.' -Source ${CmdletName} - $BlockExecution = $false - - Set-DeferHistory -DeferTimesRemaining $DeferTimes -DeferDeadline $deferDeadlineUniversal - - # Restore minimized windows - $null = $shellApp.UndoMinimizeAll() - - Exit-Script -ExitCode $configInstallationDeferExitCode - } - } - } - - ## Force the processes to close silently, without prompting the user - If (($Silent -or $deployModeSilent) -and $CloseApps) { - [array]$runningProcesses = $null - [array]$runningProcesses = Get-RunningProcesses $processObjects - If ($runningProcesses) { - [string]$runningProcessDescriptions = ($runningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Select-Object -Unique | Sort-Object) -join ',' - Write-Log -Message "Force close application(s) [$($runningProcessDescriptions)] without prompting user." -Source ${CmdletName} - $runningProcesses | Stop-Process -Force -ErrorAction 'SilentlyContinue' - Start-Sleep -Seconds 2 - } - } - - ## Force nsd.exe to stop if Notes is one of the required applications to close - If (($processObjects | Select-Object -ExpandProperty 'ProcessName') -contains 'notes') { - ## Get the path where Notes is installed - [string]$notesPath = Get-Item -LiteralPath $regKeyLotusNotes -ErrorAction 'SilentlyContinue' | Get-ItemProperty | Select-Object -ExpandProperty 'Path' - - ## Ensure we aren't running as a Local System Account and Notes install directory was found - If ((-not $IsLocalSystemAccount) -and ($notesPath)) { - # Get a list of all the executables in the Notes folder - [string[]]$notesPathExes = Get-ChildItem -LiteralPath $notesPath -Filter '*.exe' -Recurse | Select-Object -ExpandProperty 'BaseName' | Sort-Object - ## Check for running Notes executables and run NSD if any are found - $notesPathExes | ForEach-Object { - If ((Get-Process | Select-Object -ExpandProperty 'Name') -contains $_) { - [string]$notesNSDExecutable = Join-Path -Path $notesPath -ChildPath 'NSD.exe' - Try { - If (Test-Path -LiteralPath $notesNSDExecutable -PathType 'Leaf' -ErrorAction 'Stop') { - Write-Log -Message "Execute [$notesNSDExecutable] with the -kill argument..." -Source ${CmdletName} - [Diagnostics.Process]$notesNSDProcess = Start-Process -FilePath $notesNSDExecutable -ArgumentList '-kill' -WindowStyle 'Hidden' -PassThru -ErrorAction 'SilentlyContinue' - - If (-not ($notesNSDProcess.WaitForExit(10000))) { - Write-Log -Message "[$notesNSDExecutable] did not end in a timely manner. Force terminate process." -Source ${CmdletName} - Stop-Process -Name 'NSD' -Force -ErrorAction 'SilentlyContinue' - } - } - } - Catch { - Write-Log -Message "Failed to launch [$notesNSDExecutable]. `n$(Resolve-Error)" -Source ${CmdletName} - } - - Write-Log -Message "[$notesNSDExecutable] returned exit code [$($notesNSDProcess.ExitCode)]." -Source ${CmdletName} - - # Force NSD process to stop in case the previous command was not successful - Stop-Process -Name 'NSD' -Force -ErrorAction 'SilentlyContinue' - } - } - } - - # Strip all Notes processes from the process list except notes.exe, because the other notes processes (e.g. notes2.exe) may be invoked by the Notes installation, so we don't want to block their execution. - If ($notesPathExes) { - [array]$processesIgnoringNotesExceptions = Compare-Object -ReferenceObject ($processObjects | Select-Object -ExpandProperty 'ProcessName' | Sort-Object) -DifferenceObject $notesPathExes -IncludeEqual | Where-Object { ($_.SideIndicator -eq '<=') -or ($_.InputObject -eq 'notes') } | Select-Object -ExpandProperty 'InputObject' - [array]$processObjects = $processObjects | Where-Object { $processesIgnoringNotesExceptions -contains $_.ProcessName } - } - } - - ## If block execution switch is true, call the function to block execution of these processes - If ($BlockExecution) { - # Make this variable globally available so we can check whether we need to call Unblock-AppExecution - Set-Variable -Name 'BlockExecution' -Value $BlockExecution -Scope 'Script' - Write-Log -Message '[-BlockExecution] parameter specified.' -Source ${CmdletName} - Block-AppExecution -ProcessName ($processObjects | Select-Object -ExpandProperty 'ProcessName') - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding(DefaultParametersetName = 'None')] + + Param ( + ## Specify process names separated by commas. Optionally specify a process description with an equals symbol, e.g. "winword=Microsoft Office Word" + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$CloseApps, + ## Specify whether to prompt user or force close the applications + [Parameter(Mandatory = $false)] + [Switch]$Silent = $false, + ## Specify a countdown to display before automatically closing applications where deferral is not allowed or has expired + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$CloseAppsCountdown = 0, + ## Specify a countdown to display before automatically closing applications whether or not deferral is allowed + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ForceCloseAppsCountdown = 0, + ## Specify whether to prompt to save working documents when the user chooses to close applications by selecting the "Close Programs" button + [Parameter(Mandatory = $false)] + [Switch]$PromptToSave = $false, + ## Specify whether to make the prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. + [Parameter(Mandatory = $false)] + [Switch]$PersistPrompt = $false, + ## Specify whether to block execution of the processes during installation + [Parameter(Mandatory = $false)] + [Switch]$BlockExecution = $false, + ## Specify whether to enable the optional defer button on the dialog box + [Parameter(Mandatory = $false)] + [Switch]$AllowDefer = $false, + ## Specify whether to enable the optional defer button on the dialog box only if an app needs to be closed + [Parameter(Mandatory = $false)] + [Switch]$AllowDeferCloseApps = $false, + ## Specify the number of times the deferral is allowed + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$DeferTimes = 0, + ## Specify the number of days since first run that the deferral is allowed + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$DeferDays = 0, + ## Specify the deadline (in format dd/mm/yyyy) for which deferral will expire as an option + [Parameter(Mandatory = $false)] + [String]$DeferDeadline = '', + ## Specify whether to check if there is enough disk space for the installation to proceed. If this parameter is specified without the RequiredDiskSpace parameter, the required disk space is calculated automatically based on the size of the script source and associated files. + [Parameter(ParameterSetName = 'CheckDiskSpaceParameterSet', Mandatory = $true)] + [ValidateScript({ $_.IsPresent -eq ($true -or $false) })] + [Switch]$CheckDiskSpace, + ## Specify required disk space in MB, used in combination with $CheckDiskSpace. + [Parameter(ParameterSetName = 'CheckDiskSpaceParameterSet', Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$RequiredDiskSpace = 0, + ## Specify whether to minimize other windows when displaying prompt + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$MinimizeWindows = $true, + ## Specifies whether the window is the topmost window + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true, + ## Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ForceCountdown = 0, + ## Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + [Parameter(Mandatory = $false)] + [Switch]$CustomText = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If running in NonInteractive mode, force the processes to close silently + If ($deployModeNonInteractive) { + $Silent = $true + } + + ## If using Zero-Config MSI Deployment, append any executables found in the MSI to the CloseApps list + If ($useDefaultMsi) { + $CloseApps = "$CloseApps,$defaultMsiExecutablesList" + } + + ## Check disk space requirements if specified + If ($CheckDiskSpace) { + Write-Log -Message 'Evaluating disk space requirements.' -Source ${CmdletName} + [Double]$freeDiskSpace = Get-FreeDiskSpace + If ($RequiredDiskSpace -eq 0) { + Try { + # Determine the size of the Files folder + $fso = New-Object -ComObject 'Scripting.FileSystemObject' -ErrorAction 'Stop' + $RequiredDiskSpace = [Math]::Round((($fso.GetFolder($scriptParentPath).Size) / 1MB)) + } + Catch { + Write-Log -Message "Failed to calculate disk space requirement from source files. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + Finally { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($fso) + } + Catch { + } + } + } + If ($freeDiskSpace -lt $RequiredDiskSpace) { + Write-Log -Message "Failed to meet minimum disk space requirement. Space Required [$RequiredDiskSpace MB], Space Available [$freeDiskSpace MB]." -Severity 3 -Source ${CmdletName} + If (-not $Silent) { + Show-InstallationPrompt -Message ($configDiskSpaceMessage -f $installTitle, $RequiredDiskSpace, ($freeDiskSpace)) -ButtonRightText 'OK' -Icon 'Error' + } + Exit-Script -ExitCode $configInstallationUIExitCode + } + Else { + Write-Log -Message 'Successfully passed minimum disk space requirement check.' -Source ${CmdletName} + } + } + + If ($CloseApps) { + ## Create a Process object with custom descriptions where they are provided (split on an '=' sign) + [PSObject[]]$processObjects = @() + # Split multiple processes on a comma, then split on equal sign, then create custom object with process name and description + ForEach ($process in ($CloseApps -split ',' | Where-Object { $_ })) { + If ($process.Contains('=')) { + [String[]]$ProcessSplit = $process -split '=' + $processObjects += New-Object -TypeName 'PSObject' -Property @{ + ProcessName = $ProcessSplit[0] + ProcessDescription = $ProcessSplit[1] + } + } + Else { + [String]$ProcessInfo = $process + $processObjects += New-Object -TypeName 'PSObject' -Property @{ + ProcessName = $process + ProcessDescription = '' + } + } + } + } + + ## Check Deferral history and calculate remaining deferrals + If (($allowDefer) -or ($AllowDeferCloseApps)) { + # Set $allowDefer to true if $AllowDeferCloseApps is true + $allowDefer = $true + + # Get the deferral history from the registry + $deferHistory = Get-DeferHistory + $deferHistoryTimes = $deferHistory | Select-Object -ExpandProperty 'DeferTimesRemaining' -ErrorAction 'SilentlyContinue' + $deferHistoryDeadline = $deferHistory | Select-Object -ExpandProperty 'DeferDeadline' -ErrorAction 'SilentlyContinue' + + # Reset Switches + $checkDeferDays = $false + $checkDeferDeadline = $false + If ($DeferDays -ne 0) { + $checkDeferDays = $true + } + If ($DeferDeadline) { + $checkDeferDeadline = $true + } + If ($DeferTimes -ne 0) { + If ($deferHistoryTimes -ge 0) { + Write-Log -Message "Defer history shows [$($deferHistory.DeferTimesRemaining)] deferrals remaining." -Source ${CmdletName} + $DeferTimes = $deferHistory.DeferTimesRemaining - 1 + } + Else { + $DeferTimes = $DeferTimes - 1 + } + Write-Log -Message "The user has [$deferTimes] deferrals remaining." -Source ${CmdletName} + If ($DeferTimes -lt 0) { + Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} + $AllowDefer = $false + } + } + Else { + If (Test-Path -LiteralPath 'variable:deferTimes') { + Remove-Variable -Name 'deferTimes' + } + $DeferTimes = $null + } + If ($checkDeferDays -and $allowDefer) { + If ($deferHistoryDeadline) { + Write-Log -Message "Defer history shows a deadline date of [$deferHistoryDeadline]." -Source ${CmdletName} + [String]$deferDeadlineUniversal = Get-UniversalDate -DateTime $deferHistoryDeadline + } + Else { + [String]$deferDeadlineUniversal = Get-UniversalDate -DateTime (Get-Date -Date ((Get-Date).AddDays($deferDays)) -Format ($culture).DateTimeFormat.UniversalDateTimePattern).ToString() + } + Write-Log -Message "The user has until [$deferDeadlineUniversal] before deferral expires." -Source ${CmdletName} + If ((Get-UniversalDate) -gt $deferDeadlineUniversal) { + Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} + $AllowDefer = $false + } + } + If ($checkDeferDeadline -and $allowDefer) { + # Validate Date + Try { + [String]$deferDeadlineUniversal = Get-UniversalDate -DateTime $deferDeadline -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Date is not in the correct format for the current culture. Type the date in the current locale format, such as 20/08/2014 (Europe) or 08/20/2014 (United States). If the script is intended for multiple cultures, specify the date in the universal sortable date/time format, e.g. '2013-08-22 11:51:52Z'. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Throw "Date is not in the correct format for the current culture. Type the date in the current locale format, such as 20/08/2014 (Europe) or 08/20/2014 (United States). If the script is intended for multiple cultures, specify the date in the universal sortable date/time format, e.g. '2013-08-22 11:51:52Z': $($_.Exception.Message)" + } + Write-Log -Message "The user has until [$deferDeadlineUniversal] remaining." -Source ${CmdletName} + If ((Get-UniversalDate) -gt $deferDeadlineUniversal) { + Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} + $AllowDefer = $false + } + } + } + If (($deferTimes -lt 0) -and (-not $deferDeadlineUniversal)) { + $AllowDefer = $false + } + + ## Prompt the user to close running applications and optionally defer if enabled + If ((-not $deployModeSilent) -and (-not $silent)) { + If ($forceCloseAppsCountdown -gt 0) { + # Keep the same variable for countdown to simplify the code: + $closeAppsCountdown = $forceCloseAppsCountdown + # Change this variable to a boolean now to switch the countdown on even with deferral + [Boolean]$forceCloseAppsCountdown = $true + } + ElseIf ($forceCountdown -gt 0) { + # Keep the same variable for countdown to simplify the code: + $closeAppsCountdown = $forceCountdown + # Change this variable to a boolean now to switch the countdown on + [Boolean]$forceCountdown = $true + } + Set-Variable -Name 'closeAppsCountdownGlobal' -Value $closeAppsCountdown -Scope 'Script' + + While ((Get-RunningProcesses -ProcessObjects $processObjects -OutVariable 'runningProcesses') -or (($promptResult -ne 'Defer') -and ($promptResult -ne 'Close'))) { + [String]$runningProcessDescriptions = ($runningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Sort-Object -Unique) -join ',' + # Check if we need to prompt the user to defer, to defer and close apps, or not to prompt them at all + If ($allowDefer) { + # If there is deferral and closing apps is allowed but there are no apps to be closed, break the while loop + If ($AllowDeferCloseApps -and (-not $runningProcessDescriptions)) { + Break + } + # Otherwise, as long as the user has not selected to close the apps or the processes are still running and the user has not selected to continue, prompt user to close running processes with deferral + ElseIf (($promptResult -ne 'Close') -or (($runningProcessDescriptions) -and ($promptResult -ne 'Continue'))) { + [String]$promptResult = Show-WelcomePrompt -ProcessDescriptions $runningProcessDescriptions -CloseAppsCountdown $closeAppsCountdownGlobal -ForceCloseAppsCountdown $forceCloseAppsCountdown -ForceCountdown $forceCountdown -PersistPrompt $PersistPrompt -AllowDefer -DeferTimes $deferTimes -DeferDeadline $deferDeadlineUniversal -MinimizeWindows $MinimizeWindows -CustomText:$CustomText -TopMost $TopMost + } + } + # If there is no deferral and processes are running, prompt the user to close running processes with no deferral option + ElseIf (($runningProcessDescriptions) -or ($forceCountdown)) { + [String]$promptResult = Show-WelcomePrompt -ProcessDescriptions $runningProcessDescriptions -CloseAppsCountdown $closeAppsCountdownGlobal -ForceCloseAppsCountdown $forceCloseAppsCountdown -ForceCountdown $forceCountdown -PersistPrompt $PersistPrompt -MinimizeWindows $minimizeWindows -CustomText:$CustomText -TopMost $TopMost + } + # If there is no deferral and no processes running, break the while loop + Else { + Break + } + + # If the user has clicked OK, wait a few seconds for the process to terminate before evaluating the running processes again + If ($promptResult -eq 'Continue') { + Write-Log -Message 'The user selected to continue...' -Source ${CmdletName} + Start-Sleep -Seconds 2 + + # Break the while loop if there are no processes to close and the user has clicked OK to continue + If (-not $runningProcesses) { + Break + } + } + # Force the applications to close + ElseIf ($promptResult -eq 'Close') { + Write-Log -Message 'The user selected to force the application(s) to close...' -Source ${CmdletName} + If (($PromptToSave) -and ($SessionZero -and (-not $IsProcessUserInteractive))) { + Write-Log -Message 'Specified [-PromptToSave] option will not be available, because current process is running in session zero and is not interactive.' -Severity 2 -Source ${CmdletName} + } + # Update the process list right before closing, in case it changed + $runningProcesses = Get-RunningProcesses -ProcessObjects $processObjects + # Close running processes + ForEach ($runningProcess in $runningProcesses) { + [PSObject[]]$AllOpenWindowsForRunningProcess = Get-WindowTitle -GetAllWindowTitles -DisableFunctionLogging | Where-Object { $_.ParentProcess -eq $runningProcess.ProcessName } + # If the PromptToSave parameter was specified and the process has a window open, then prompt the user to save work if there is work to be saved when closing window + If (($PromptToSave) -and (-not ($SessionZero -and (-not $IsProcessUserInteractive))) -and ($AllOpenWindowsForRunningProcess) -and ($runningProcess.MainWindowHandle -ne [IntPtr]::Zero)) { + [Timespan]$PromptToSaveTimeout = New-TimeSpan -Seconds $configInstallationPromptToSave + [Diagnostics.StopWatch]$PromptToSaveStopWatch = [Diagnostics.StopWatch]::StartNew() + $PromptToSaveStopWatch.Reset() + ForEach ($OpenWindow in $AllOpenWindowsForRunningProcess) { + Try { + Write-Log -Message "Stopping process [$($runningProcess.ProcessName)] with window title [$($OpenWindow.WindowTitle)] and prompt to save if there is work to be saved (timeout in [$configInstallationPromptToSave] seconds)..." -Source ${CmdletName} + [Boolean]$IsBringWindowToFrontSuccess = [PSADT.UiAutomation]::BringWindowToFront($OpenWindow.WindowHandle) + [Boolean]$IsCloseWindowCallSuccess = $runningProcess.CloseMainWindow() + If (-not $IsCloseWindowCallSuccess) { + Write-Log -Message "Failed to call the CloseMainWindow() method on process [$($runningProcess.ProcessName)] with window title [$($OpenWindow.WindowTitle)] because the main window may be disabled due to a modal dialog being shown." -Severity 3 -Source ${CmdletName} + } + Else { + $PromptToSaveStopWatch.Start() + Do { + [Boolean]$IsWindowOpen = [Boolean](Get-WindowTitle -GetAllWindowTitles -DisableFunctionLogging | Where-Object { $_.WindowHandle -eq $OpenWindow.WindowHandle }) + If (-not $IsWindowOpen) { + Break + } + Start-Sleep -Seconds 3 + } While (($IsWindowOpen) -and ($PromptToSaveStopWatch.Elapsed -lt $PromptToSaveTimeout)) + $PromptToSaveStopWatch.Reset() + If ($IsWindowOpen) { + Write-Log -Message "Exceeded the [$configInstallationPromptToSave] seconds timeout value for the user to save work associated with process [$($runningProcess.ProcessName)] with window title [$($OpenWindow.WindowTitle)]." -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message "Window [$($OpenWindow.WindowTitle)] for process [$($runningProcess.ProcessName)] was successfully closed." -Source ${CmdletName} + } + } + } + Catch { + Write-Log -Message "Failed to close window [$($OpenWindow.WindowTitle)] for process [$($runningProcess.ProcessName)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Continue + } + Finally { + $runningProcess.Refresh() + } + } + } + Else { + Write-Log -Message "Stopping process $($runningProcess.ProcessName)..." -Source ${CmdletName} + Stop-Process -Name $runningProcess.ProcessName -Force -ErrorAction 'SilentlyContinue' + } + } + + If ($runningProcesses = Get-RunningProcesses -ProcessObjects $processObjects -DisableLogging) { + # Apps are still running, give them 2s to close. If they are still running, the Welcome Window will be displayed again + Write-Log -Message 'Sleeping for 2 seconds because the processes are still not closed...' -Source ${CmdletName} + Start-Sleep -Seconds 2 + } + } + # Stop the script (if not actioned before the timeout value) + ElseIf ($promptResult -eq 'Timeout') { + Write-Log -Message 'Installation not actioned before the timeout value.' -Source ${CmdletName} + $BlockExecution = $false + + If (($deferTimes -ge 0) -or ($deferDeadlineUniversal)) { + Set-DeferHistory -DeferTimesRemaining $DeferTimes -DeferDeadline $deferDeadlineUniversal + } + ## Dispose the welcome prompt timer here because if we dispose it within the Show-WelcomePrompt function we risk resetting the timer and missing the specified timeout period + If ($script:welcomeTimer) { + Try { + $script:welcomeTimer.Dispose() + $script:welcomeTimer = $null + } + Catch { + } + } + + # Restore minimized windows + $null = $shellApp.UndoMinimizeAll() + + Exit-Script -ExitCode $configInstallationUIExitCode + } + # Stop the script (user chose to defer) + ElseIf ($promptResult -eq 'Defer') { + Write-Log -Message 'Installation deferred by the user.' -Source ${CmdletName} + $BlockExecution = $false + + Set-DeferHistory -DeferTimesRemaining $DeferTimes -DeferDeadline $deferDeadlineUniversal + + # Restore minimized windows + $null = $shellApp.UndoMinimizeAll() + + Exit-Script -ExitCode $configInstallationDeferExitCode + } + } + } + + ## Force the processes to close silently, without prompting the user + If (($Silent -or $deployModeSilent) -and $CloseApps) { + [Array]$runningProcesses = $null + [Array]$runningProcesses = Get-RunningProcesses $processObjects + If ($runningProcesses) { + [String]$runningProcessDescriptions = ($runningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Sort-Object -Unique) -join ',' + Write-Log -Message "Force closing application(s) [$($runningProcessDescriptions)] without prompting user." -Source ${CmdletName} + $runningProcesses.ProcessName | ForEach-Object -Process { Stop-Process -Name $_ -Force -ErrorAction 'SilentlyContinue' } + Start-Sleep -Seconds 2 + } + } + + ## Force nsd.exe to stop if Notes is one of the required applications to close + If (($processObjects | Select-Object -ExpandProperty 'ProcessName') -contains 'notes') { + ## Get the path where Notes is installed + [String]$notesPath = Get-Item -LiteralPath $regKeyLotusNotes -ErrorAction 'SilentlyContinue' | Get-ItemProperty | Select-Object -ExpandProperty 'Path' + + ## Ensure we aren't running as a Local System Account and Notes install directory was found + If ((-not $IsLocalSystemAccount) -and ($notesPath)) { + # Get a list of all the executables in the Notes folder + [string[]]$notesPathExes = Get-ChildItem -LiteralPath $notesPath -Filter '*.exe' -Recurse | Select-Object -ExpandProperty 'BaseName' | Sort-Object + ## Check for running Notes executables and run NSD if any are found + $notesPathExes | ForEach-Object { + If ((Get-Process | Select-Object -ExpandProperty 'Name') -contains $_) { + [String]$notesNSDExecutable = Join-Path -Path $notesPath -ChildPath 'NSD.exe' + Try { + If (Test-Path -LiteralPath $notesNSDExecutable -PathType 'Leaf' -ErrorAction 'Stop') { + Write-Log -Message "Executing [$notesNSDExecutable] with the -kill argument..." -Source ${CmdletName} + [Diagnostics.Process]$notesNSDProcess = Start-Process -FilePath $notesNSDExecutable -ArgumentList '-kill' -WindowStyle 'Hidden' -PassThru -ErrorAction 'SilentlyContinue' + + If (-not $notesNSDProcess.WaitForExit(10000)) { + Write-Log -Message "[$notesNSDExecutable] did not end in a timely manner. Force terminate process." -Source ${CmdletName} + Stop-Process -Name 'NSD' -Force -ErrorAction 'SilentlyContinue' + } + } + } + Catch { + Write-Log -Message "Failed to launch [$notesNSDExecutable]. `r`n$(Resolve-Error)" -Source ${CmdletName} + } + + Write-Log -Message "[$notesNSDExecutable] returned exit code [$($notesNSDProcess.ExitCode)]." -Source ${CmdletName} + + # Force NSD process to stop in case the previous command was not successful + Stop-Process -Name 'NSD' -Force -ErrorAction 'SilentlyContinue' + } + } + } + + # Strip all Notes processes from the process list except notes.exe, because the other notes processes (e.g. notes2.exe) may be invoked by the Notes installation, so we don't want to block their execution. + If ($notesPathExes) { + [Array]$processesIgnoringNotesExceptions = Compare-Object -ReferenceObject ($processObjects | Select-Object -ExpandProperty 'ProcessName' | Sort-Object) -DifferenceObject $notesPathExes -IncludeEqual | Where-Object { ($_.SideIndicator -eq '<=') -or ($_.InputObject -eq 'notes') } | Select-Object -ExpandProperty 'InputObject' + [Array]$processObjects = $processObjects | Where-Object { $processesIgnoringNotesExceptions -contains $_.ProcessName } + } + } + + ## If block execution switch is true, call the function to block execution of these processes + If ($BlockExecution) { + # Make this variable globally available so we can check whether we need to call Unblock-AppExecution + Set-Variable -Name 'BlockExecution' -Value $BlockExecution -Scope 'Script' + Write-Log -Message '[-BlockExecution] parameter specified.' -Source ${CmdletName} + Block-AppExecution -ProcessName ($processObjects | Select-Object -ExpandProperty 'ProcessName') + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Show-WelcomePrompt Function Show-WelcomePrompt { -<# + <# .SYNOPSIS - Called by Show-InstallationWelcome to prompt the user to optionally do the following: - 1) Close the specified running applications. - 2) Provide an option to defer the installation. - 3) Show a countdown before applications are automatically closed. + +Called by Show-InstallationWelcome to prompt the user to optionally do the following: + 1) Close the specified running applications. + 2) Provide an option to defer the installation. + 3) Show a countdown before applications are automatically closed. + .DESCRIPTION - The user is presented with a Windows Forms dialog box to close the applications themselves and continue or to have the script close the applications for them. - If the -AllowDefer option is set to true, an optional "Defer" button will be shown to the user. If they select this option, the script will exit and return a 1618 code (SCCM fast retry code). - The dialog box will timeout after the timeout specified in the XML configuration file (default 1 hour and 55 minutes) to prevent SCCM installations from timing out and returning a failure code to SCCM. When the dialog times out, the script will exit and return a 1618 code (SCCM fast retry code). + +The user is presented with a Windows Forms dialog box to close the applications themselves and continue or to have the script close the applications for them. +If the -AllowDefer option is set to true, an optional "Defer" button will be shown to the user. If they select this option, the script will exit and return a 1618 code (SCCM fast retry code). +The dialog box will timeout after the timeout specified in the XML configuration file (default 1 hour and 55 minutes) to prevent SCCM installations from timing out and returning a failure code to SCCM. When the dialog times out, the script will exit and return a 1618 code (SCCM fast retry code). + .PARAMETER ProcessDescriptions - The descriptive names of the applications that are running and need to be closed. + +The descriptive names of the applications that are running and need to be closed. + .PARAMETER CloseAppsCountdown - Specify the countdown time in seconds before running applications are automatically closed when deferral is not allowed or expired. + +Specify the countdown time in seconds before running applications are automatically closed when deferral is not allowed or expired. + .PARAMETER ForceCloseAppsCountdown - Specify whether to show the countdown regardless of whether deferral is allowed. + +Specify whether to show the countdown regardless of whether deferral is allowed. + .PARAMETER PersistPrompt - Specify whether to make the prompt persist in the center of the screen every 10 seconds. + +Specify whether to make the prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. + .PARAMETER AllowDefer - Specify whether to provide an option to defer the installation. + +Specify whether to provide an option to defer the installation. + .PARAMETER DeferTimes - Specify the number of times the user is allowed to defer. + +Specify the number of times the user is allowed to defer. + .PARAMETER DeferDeadline - Specify the deadline date before the user is allowed to defer. + +Specify the deadline date before the user is allowed to defer. + .PARAMETER MinimizeWindows - Specifies whether to minimize other windows when displaying prompt. Default: $true. + +Specifies whether to minimize other windows when displaying prompt. Default: $true. + .PARAMETER TopMost - Specifies whether the windows is the topmost window. Default: $true. + +Specifies whether the windows is the topmost window. Default: $true. + .PARAMETER ForceCountdown - Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled. + +Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled. + .PARAMETER CustomText - Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + +Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the user's selection. + .EXAMPLE - Show-WelcomePrompt -ProcessDescriptions 'Lotus Notes, Microsoft Word' -CloseAppsCountdown 600 -AllowDefer -DeferTimes 10 + +Show-WelcomePrompt -ProcessDescriptions 'Lotus Notes, Microsoft Word' -CloseAppsCountdown 600 -AllowDefer -DeferTimes 10 + .NOTES - This is an internal script function and should typically not be called directly. It is used by the Show-InstallationWelcome prompt to display a custom prompt. + +This is an internal script function and should typically not be called directly. It is used by the Show-InstallationWelcome prompt to display a custom prompt. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [string]$ProcessDescriptions, - [Parameter(Mandatory=$false)] - [int32]$CloseAppsCountdown, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ForceCloseAppsCountdown, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$PersistPrompt = $false, - [Parameter(Mandatory=$false)] - [switch]$AllowDefer = $false, - [Parameter(Mandatory=$false)] - [string]$DeferTimes, - [Parameter(Mandatory=$false)] - [string]$DeferDeadline, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$MinimizeWindows = $true, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$TopMost = $true, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$ForceCountdown = 0, - [Parameter(Mandatory=$false)] - [switch]$CustomText = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Reset switches - [boolean]$showCloseApps = $false - [boolean]$showDefer = $false - [boolean]$persistWindow = $false - - ## Reset times - [datetime]$startTime = Get-Date - [datetime]$countdownTime = $startTime - - ## Check if the countdown was specified - If ($CloseAppsCountdown) { - If ($CloseAppsCountdown -gt $configInstallationUITimeout) { - Throw 'The close applications countdown time cannot be longer than the timeout specified in the XML configuration for installation UI dialogs to timeout.' - } - } - - ## Initial form layout: Close Applications / Allow Deferral - If ($processDescriptions) { - Write-Log -Message "Prompt user to close application(s) [$processDescriptions]..." -Source ${CmdletName} - $showCloseApps = $true - } - If (($allowDefer) -and (($deferTimes -ge 0) -or ($deferDeadline))) { - Write-Log -Message 'User has the option to defer.' -Source ${CmdletName} - $showDefer = $true - If ($deferDeadline) { - # Remove the Z from universal sortable date time format, otherwise it could be converted to a different time zone - $deferDeadline = $deferDeadline -replace 'Z','' - # Convert the deadline date to a string - [string]$deferDeadline = (Get-Date -Date $deferDeadline).ToString() - } - } - - ## If deferral is being shown and 'close apps countdown' or 'persist prompt' was specified, enable those features. - If (-not $showDefer) { - If ($closeAppsCountdown -gt 0) { - Write-Log -Message "Close applications countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} - $showCountdown = $true - } - } - If ($showDefer) { - If ($persistPrompt) { $persistWindow = $true } - } - ## If 'force close apps countdown' was specified, enable that feature. - If ($forceCloseAppsCountdown -eq $true) { - Write-Log -Message "Close applications countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} - $showCountdown = $true - } - ## If 'force countdown' was specified, enable that feature. - If ($forceCountdown -eq $true) { - Write-Log -Message "Countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} - $showCountdown = $true - } - - [string[]]$processDescriptions = $processDescriptions -split ',' - [Windows.Forms.Application]::EnableVisualStyles() - - $formWelcome = New-Object -TypeName 'System.Windows.Forms.Form' - $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' - $labelAppName = New-Object -TypeName 'System.Windows.Forms.Label' - $labelCountdown = New-Object -TypeName 'System.Windows.Forms.Label' - $labelDefer = New-Object -TypeName 'System.Windows.Forms.Label' - $listBoxCloseApps = New-Object -TypeName 'System.Windows.Forms.ListBox' - $buttonContinue = New-Object -TypeName 'System.Windows.Forms.Button' - $buttonDefer = New-Object -TypeName 'System.Windows.Forms.Button' - $buttonCloseApps = New-Object -TypeName 'System.Windows.Forms.Button' - $buttonAbort = New-Object -TypeName 'System.Windows.Forms.Button' - $formWelcomeWindowState = New-Object -TypeName 'System.Windows.Forms.FormWindowState' - $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' - $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' - $toolTip = New-Object -TypeName 'System.Windows.Forms.ToolTip' - - ## Remove all event handlers from the controls - [scriptblock]$Form_Cleanup_FormClosed = { - Try { - $labelAppName.remove_Click($handler_labelAppName_Click) - $labelDefer.remove_Click($handler_labelDefer_Click) - $buttonCloseApps.remove_Click($buttonCloseApps_OnClick) - $buttonContinue.remove_Click($buttonContinue_OnClick) - $buttonDefer.remove_Click($buttonDefer_OnClick) - $buttonAbort.remove_Click($buttonAbort_OnClick) - $script:welcomeTimer.remove_Tick($timer_Tick) - $timerPersist.remove_Tick($timerPersist_Tick) - $timerRunningProcesses.remove_Tick($timerRunningProcesses_Tick) - $formWelcome.remove_Load($Form_StateCorrection_Load) - $formWelcome.remove_FormClosed($Form_Cleanup_FormClosed) - } - Catch { } - } - - [scriptblock]$Form_StateCorrection_Load = { - ## Correct the initial state of the form to prevent the .NET maximized form issue - $formWelcome.WindowState = 'Normal' - $formWelcome.AutoSize = $true - $formWelcome.TopMost = $TopMost - $formWelcome.BringToFront() - # Get the start position of the form so we can return the form to this position if PersistPrompt is enabled - Set-Variable -Name 'formWelcomeStartPosition' -Value $formWelcome.Location -Scope 'Script' - - ## Initialize the countdown timer - [datetime]$currentTime = Get-Date - [datetime]$countdownTime = $startTime.AddSeconds($CloseAppsCountdown) - $script:welcomeTimer.Start() - - ## Set up the form - [timespan]$remainingTime = $countdownTime.Subtract($currentTime) - [string]$labelCountdownSeconds = [string]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) - If ($forceCountdown -eq $true) { - If ($deploymentType -ieq 'Install') { $labelCountdown.Text = ($configWelcomePromptCountdownMessage -f $($configDeploymentTypeInstall.ToLower())) + "`n$labelCountdownSeconds" } - Else { $labelCountdown.Text = ($configWelcomePromptCountdownMessage -f $($configDeploymentTypeUninstall.ToLower())) + "`n$labelCountdownSeconds" } - } - Else { $labelCountdown.Text = "$configClosePromptCountdownMessage`n$labelCountdownSeconds" } - } - - ## Add the timer if it doesn't already exist - this avoids the timer being reset if the continue button is clicked - If (-not ($script:welcomeTimer)) { - $script:welcomeTimer = New-Object -TypeName 'System.Windows.Forms.Timer' - } - - If ($showCountdown) { - [scriptblock]$timer_Tick = { - ## Get the time information - [datetime]$currentTime = Get-Date - [datetime]$countdownTime = $startTime.AddSeconds($CloseAppsCountdown) - [timespan]$remainingTime = $countdownTime.Subtract($currentTime) - Set-Variable -Name 'closeAppsCountdownGlobal' -Value $remainingTime.TotalSeconds -Scope 'Script' - - ## If the countdown is complete, close the application(s) or continue - If ($countdownTime -lt $currentTime) { - If ($forceCountdown -eq $true) { - Write-Log -Message 'Countdown timer has elapsed. Force continue.' -Source ${CmdletName} - $buttonContinue.PerformClick() - } - Else { - Write-Log -Message 'Close application(s) countdown timer has elapsed. Force closing application(s).' -Source ${CmdletName} - $buttonCloseApps.PerformClick() - } - } - Else { - # Update the form - [string]$labelCountdownSeconds = [string]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) - If ($forceCountdown -eq $true) { - If ($deploymentType -ieq 'Install') { $labelCountdown.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeInstall) + "`n$labelCountdownSeconds" } - Else { $labelCountdown.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeUninstall) + "`n$labelCountdownSeconds" } - } - Else { $labelCountdown.Text = "$configClosePromptCountdownMessage`n$labelCountdownSeconds" } - [Windows.Forms.Application]::DoEvents() - } - } - } - Else { - $script:welcomeTimer.Interval = ($configInstallationUITimeout * 1000) - [scriptblock]$timer_Tick = { $buttonAbort.PerformClick() } - } - - $script:welcomeTimer.add_Tick($timer_Tick) - - ## Persistence Timer - If ($persistWindow) { - $timerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' - $timerPersist.Interval = ($configInstallationPersistInterval * 1000) - [scriptblock]$timerPersist_Tick = { Update-InstallationWelcome } - $timerPersist.add_Tick($timerPersist_Tick) - $timerPersist.Start() - } - - ## Process Re-Enumeration Timer - If ($configInstallationWelcomePromptDynamicRunningProcessEvaluation) { - $timerRunningProcesses = New-Object -TypeName 'System.Windows.Forms.Timer' - $timerRunningProcesses.Interval = ($configInstallationWelcomePromptDynamicRunningProcessEvaluationInterval * 1000) - [scriptblock]$timerRunningProcesses_Tick = { Get-RunningProcessesDynamically } - $timerRunningProcesses.add_Tick($timerRunningProcesses_Tick) - $timerRunningProcesses.Start() - } - - ## Form - $formWelcome.Controls.Add($pictureBanner) - $formWelcome.Controls.Add($buttonAbort) - - ##---------------------------------------------- - ## Create padding object - $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' - $paddingNone.Top = 0 - $paddingNone.Bottom = 0 - $paddingNone.Left = 0 - $paddingNone.Right = 0 - - ## Generic Button properties - $buttonWidth = 110 - $buttonHeight = 23 - $buttonPadding = 50 - $buttonSize = New-Object -TypeName 'System.Drawing.Size' - $buttonSize.Width = $buttonWidth - $buttonSize.Height = $buttonHeight - $buttonPadding = New-Object -TypeName 'System.Windows.Forms.Padding' - $buttonPadding.Top = 0 - $buttonPadding.Bottom = 5 - $buttonPadding.Left = 50 - $buttonPadding.Right = 0 - - ## Picture Banner - $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 - $pictureBanner.ImageLocation = $appDeployLogoBanner - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 0 - $System_Drawing_Point.Y = 0 - $pictureBanner.Location = $System_Drawing_Point - $pictureBanner.Name = 'pictureBanner' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 50 - $System_Drawing_Size.Width = 450 - $pictureBanner.Size = $System_Drawing_Size - $pictureBanner.SizeMode = 'CenterImage' - $pictureBanner.Margin = $paddingNone - $pictureBanner.TabIndex = 0 - $pictureBanner.TabStop = $false - - ## Label App Name - $labelAppName.DataBindings.DefaultDataSourceUpdateMode = 0 - $labelAppName.Name = 'labelAppName' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - If (-not $showCloseApps) { - $System_Drawing_Size.Height = 40 - } - Else { - $System_Drawing_Size.Height = 65 - } - $System_Drawing_Size.Width = 450 - $labelAppName.Size = $System_Drawing_Size - $System_Drawing_Size.Height = 0 - $labelAppName.MaximumSize = $System_Drawing_Size - $labelAppName.Margin = '0,15,0,15' - $labelAppName.Padding = '20,0,20,0' - $labelAppName.TabIndex = 1 - - ## Initial form layout: Close Applications / Allow Deferral - If ($showCloseApps) { - $labelAppNameText = $configClosePromptMessage - } - ElseIf (($showDefer) -or ($forceCountdown)) { - $labelAppNameText = "$configDeferPromptWelcomeMessage `n$installTitle" - } - If ($CustomText) { - $labelAppNameText = "$labelAppNameText `n`n$configWelcomePromptCustomMessage" - } - $labelAppName.Text = $labelAppNameText - $labelAppName.TextAlign = 'TopCenter' - $labelAppName.Anchor = 'Top' - $labelAppName.AutoSize = $true - $labelAppName.add_Click($handler_labelAppName_Click) - - ## Listbox Close Applications - $listBoxCloseApps.DataBindings.DefaultDataSourceUpdateMode = 0 - $listBoxCloseApps.FormattingEnabled = $true - $listBoxCloseApps.HorizontalScrollbar = $true - $listBoxCloseApps.Name = 'listBoxCloseApps' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 100 - $System_Drawing_Size.Width = 300 - $listBoxCloseApps.Size = $System_Drawing_Size - $listBoxCloseApps.Margin = '75,0,0,0' - $listBoxCloseApps.TabIndex = 3 - $ProcessDescriptions | ForEach-Object { $null = $listboxCloseApps.Items.Add($_) } - - ## Label Defer - $labelDefer.DataBindings.DefaultDataSourceUpdateMode = 0 - $labelDefer.Name = 'labelDefer' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 90 - $System_Drawing_Size.Width = 450 - $labelDefer.Size = $System_Drawing_Size - $System_Drawing_Size.Height = 0 - $labelDefer.MaximumSize = $System_Drawing_Size - $labelDefer.Margin = $paddingNone - $labelDefer.Padding = '40,0,20,0' - $labelDefer.TabIndex = 4 - $deferralText = "$configDeferPromptExpiryMessage`n" - - If ($deferTimes -ge 0) { - $deferralText = "$deferralText `n$configDeferPromptRemainingDeferrals $([int32]$deferTimes + 1)" - } - If ($deferDeadline) { - $deferralText = "$deferralText `n$configDeferPromptDeadline $deferDeadline" - } - If (($deferTimes -lt 0) -and (-not $DeferDeadline)) { - $deferralText = "$deferralText `n$configDeferPromptNoDeadline" - } - $deferralText = "$deferralText `n`n$configDeferPromptWarningMessage" - $labelDefer.Text = $deferralText - $labelDefer.TextAlign = 'MiddleCenter' - $labelDefer.AutoSize = $true - $labelDefer.add_Click($handler_labelDefer_Click) - - ## Label Countdown - $labelCountdown.DataBindings.DefaultDataSourceUpdateMode = 0 - $labelCountdown.Name = 'labelCountdown' - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 40 - $System_Drawing_Size.Width = 450 - $labelCountdown.Size = $System_Drawing_Size - $System_Drawing_Size.Height = 0 - $labelCountdown.MaximumSize = $System_Drawing_Size - $labelCountdown.Margin = $paddingNone - $labelCountdown.Padding = '40,0,20,0' - $labelCountdown.TabIndex = 4 - $labelCountdown.Font = 'Microsoft Sans Serif, 9pt, style=Bold' - $labelCountdown.Text = '00:00:00' - $labelCountdown.TextAlign = 'MiddleCenter' - $labelCountdown.AutoSize = $true - $labelCountdown.add_Click($handler_labelDefer_Click) - - ## Panel Flow Layout - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 0 - $System_Drawing_Point.Y = 50 - $flowLayoutPanel.Location = $System_Drawing_Point - $flowLayoutPanel.AutoSize = $true - $flowLayoutPanel.Anchor = 'Top' - $flowLayoutPanel.FlowDirection = 'TopDown' - $flowLayoutPanel.WrapContents = $true - $flowLayoutPanel.Controls.Add($labelAppName) - If ($showCloseApps) { $flowLayoutPanel.Controls.Add($listBoxCloseApps) } - If ($showDefer) { - $flowLayoutPanel.Controls.Add($labelDefer) - } - If ($showCountdown) { - $flowLayoutPanel.Controls.Add($labelCountdown) - } - - ## Button Close For Me - $buttonCloseApps.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonCloseApps.Location = '15,0' - $buttonCloseApps.Name = 'buttonCloseApps' - $buttonCloseApps.Size = $buttonSize - $buttonCloseApps.TabIndex = 5 - $buttonCloseApps.Text = $configClosePromptButtonClose - $buttonCloseApps.DialogResult = 'Yes' - $buttonCloseApps.AutoSize = $true - $buttonCloseApps.UseVisualStyleBackColor = $true - $buttonCloseApps.add_Click($buttonCloseApps_OnClick) - - ## Button Defer - $buttonDefer.DataBindings.DefaultDataSourceUpdateMode = 0 - If (-not $showCloseApps) { - $buttonDefer.Location = '15,0' - } - Else { - $buttonDefer.Location = '170,0' - } - $buttonDefer.Name = 'buttonDefer' - $buttonDefer.Size = $buttonSize - $buttonDefer.TabIndex = 6 - $buttonDefer.Text = $configClosePromptButtonDefer - $buttonDefer.DialogResult = 'No' - $buttonDefer.AutoSize = $true - $buttonDefer.UseVisualStyleBackColor = $true - $buttonDefer.add_Click($buttonDefer_OnClick) - - ## Button Continue - $buttonContinue.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonContinue.Location = '325,0' - $buttonContinue.Name = 'buttonContinue' - $buttonContinue.Size = $buttonSize - $buttonContinue.TabIndex = 7 - $buttonContinue.Text = $configClosePromptButtonContinue - $buttonContinue.DialogResult = 'OK' - $buttonContinue.AutoSize = $true - $buttonContinue.UseVisualStyleBackColor = $true - $buttonContinue.add_Click($buttonContinue_OnClick) - If ($showCloseApps) { - # Add tooltip to Continue button - $toolTip.BackColor = [Drawing.Color]::LightGoldenrodYellow - $toolTip.IsBalloon = $false - $toolTip.InitialDelay = 100 - $toolTip.ReshowDelay = 100 - $toolTip.SetToolTip($buttonContinue, $configClosePromptButtonContinueTooltip) - } - - ## Button Abort (Hidden) - $buttonAbort.DataBindings.DefaultDataSourceUpdateMode = 0 - $buttonAbort.Name = 'buttonAbort' - $buttonAbort.Size = '1,1' - $buttonAbort.TabStop = $false - $buttonAbort.DialogResult = 'Abort' - $buttonAbort.TabIndex = 5 - $buttonAbort.UseVisualStyleBackColor = $true - $buttonAbort.add_Click($buttonAbort_OnClick) - - ## Form Welcome - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 0 - $System_Drawing_Size.Width = 0 - $formWelcome.Size = $System_Drawing_Size - $formWelcome.Padding = $paddingNone - $formWelcome.Margin = $paddingNone - $formWelcome.DataBindings.DefaultDataSourceUpdateMode = 0 - $formWelcome.Name = 'WelcomeForm' - $formWelcome.Text = $installTitle - $formWelcome.StartPosition = 'CenterScreen' - $formWelcome.FormBorderStyle = 'FixedDialog' - $formWelcome.MaximizeBox = $false - $formWelcome.MinimizeBox = $false - $formWelcome.TopMost = $TopMost - $formWelcome.TopLevel = $true - $formWelcome.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon - $formWelcome.AutoSize = $true - $formWelcome.Controls.Add($pictureBanner) - $formWelcome.Controls.Add($flowLayoutPanel) - - ## Panel Button - $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' - $System_Drawing_Point.X = 0 - # Calculate the position of the panel relative to the size of the form - $System_Drawing_Point.Y = (($formWelcome.Size | Select-Object -ExpandProperty 'Height') - 10) - $panelButtons.Location = $System_Drawing_Point - $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' - $System_Drawing_Size.Height = 40 - $System_Drawing_Size.Width = 450 - $panelButtons.Size = $System_Drawing_Size - $panelButtons.AutoSize = $true - $panelButtons.Anchor = 'Top' - $padding = New-Object -TypeName 'System.Windows.Forms.Padding' - $padding.Top = 0 - $padding.Bottom = 0 - $padding.Left = 0 - $padding.Right = 0 - $panelButtons.Margin = $padding - If ($showCloseApps) { $panelButtons.Controls.Add($buttonCloseApps) } - If ($showDefer) { $panelButtons.Controls.Add($buttonDefer) } - $panelButtons.Controls.Add($buttonContinue) - - ## Add the Buttons Panel to the form - $formWelcome.Controls.Add($panelButtons) - - ## Save the initial state of the form - $formWelcomeWindowState = $formWelcome.WindowState - # Init the OnLoad event to correct the initial state of the form - $formWelcome.add_Load($Form_StateCorrection_Load) - # Clean up the control events - $formWelcome.add_FormClosed($Form_Cleanup_FormClosed) - - Function Update-InstallationWelcome { - $formWelcome.BringToFront() - $formWelcome.Location = "$($formWelcomeStartPosition.X),$($formWelcomeStartPosition.Y)" - $formWelcome.Refresh() - } - - # Function invoked by a timer to periodically check running processes dynamically whilst showing the welcome prompt - Function Get-RunningProcessesDynamically { - $dynamicRunningProcesses = $null - Get-RunningProcesses -ProcessObjects $processObjects -DisableLogging -OutVariable 'dynamicRunningProcesses' - [string]$dynamicRunningProcessDescriptions = ($dynamicRunningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Select-Object -Unique | Sort-Object) -join ',' - If ($dynamicRunningProcessDescriptions -ne $script:runningProcessDescriptions) { - # Update the runningProcessDescriptions variable for the next time this function runs - Set-Variable -Name 'runningProcessDescriptions' -Value $dynamicRunningProcessDescriptions -Force -Scope 'Script' - If ($dynamicrunningProcesses) { - Write-Log -Message "The running processes have changed. Updating the apps to close: [$script:runningProcessDescriptions]..." -Source ${CmdletName} - } - # Update the list box with the processes to close - $listboxCloseApps.Items.Clear() - $script:runningProcessDescriptions -split "," | ForEach-Object { $null = $listboxCloseApps.Items.Add($_) } - } - # If CloseApps processes were running when the prompt was shown, and they are subsequently detected to be closed while the form is showing, then close the form. The deferral and CloseApps conditions will be re-evaluated. - If ($ProcessDescriptions) { - If (-not ($dynamicRunningProcesses)) { - Write-Log -Message 'Previously detected running processes are no longer running.' -Source ${CmdletName} - $formWelcome.Dispose() - } - } - # If CloseApps processes were not running when the prompt was shown, and they are subsequently detected to be running while the form is showing, then close the form for relaunch. The deferral and CloseApps conditions will be re-evaluated. - ElseIf (-not $ProcessDescriptions) { - If ($dynamicRunningProcesses) { - Write-Log -Message 'New running processes detected. Updating the form to prompt to close the running applications.' -Source ${CmdletName} - $formWelcome.Dispose() - } - } - } - - ## Minimize all other windows - If ($minimizeWindows) { $null = $shellApp.MinimizeAll() } - - ## Show the form - $result = $formWelcome.ShowDialog() - $formWelcome.Dispose() - - Switch ($result) { - OK { $result = 'Continue' } - No { $result = 'Defer' } - Yes { $result = 'Close' } - Abort { $result = 'Timeout' } - } - - Write-Output -InputObject $result - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [String]$ProcessDescriptions, + [Parameter(Mandatory = $false)] + [Int32]$CloseAppsCountdown, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ForceCloseAppsCountdown, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$PersistPrompt = $false, + [Parameter(Mandatory = $false)] + [Switch]$AllowDefer = $false, + [Parameter(Mandatory = $false)] + [String]$DeferTimes, + [Parameter(Mandatory = $false)] + [String]$DeferDeadline, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$MinimizeWindows = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ForceCountdown = 0, + [Parameter(Mandatory = $false)] + [Switch]$CustomText = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Reset switches + [Boolean]$showCloseApps = $false + [Boolean]$showDefer = $false + [Boolean]$persistWindow = $false + + ## Reset times + [DateTime]$startTime = Get-Date + [DateTime]$countdownTime = $startTime + + ## Check if the countdown was specified + If ($CloseAppsCountdown -and ($CloseAppsCountdown -gt $configInstallationUITimeout)) { + Throw 'The close applications countdown time cannot be longer than the timeout specified in the XML configuration for installation UI dialogs to timeout.' + } + + ## Initial form layout: Close Applications / Allow Deferral + If ($processDescriptions) { + Write-Log -Message "Prompting the user to close application(s) [$processDescriptions]..." -Source ${CmdletName} + $showCloseApps = $true + } + If (($allowDefer) -and (($deferTimes -ge 0) -or ($deferDeadline))) { + Write-Log -Message 'The user has the option to defer.' -Source ${CmdletName} + $showDefer = $true + If ($deferDeadline) { + # Remove the Z from universal sortable date time format, otherwise it could be converted to a different time zone + $deferDeadline = $deferDeadline -replace 'Z', '' + # Convert the deadline date to a string + [String]$deferDeadline = (Get-Date -Date $deferDeadline).ToString() + } + } + + ## If deferral is being shown and 'close apps countdown' or 'persist prompt' was specified, enable those features. + If (-not $showDefer) { + If ($closeAppsCountdown -gt 0) { + Write-Log -Message "Close applications countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} + $showCountdown = $true + } + } + Else { + If ($persistPrompt) { + $persistWindow = $true + } + } + ## If 'force close apps countdown' was specified, enable that feature. + If ($forceCloseAppsCountdown -eq $true) { + Write-Log -Message "Close applications countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} + $showCountdown = $true + } + ## If 'force countdown' was specified, enable that feature. + If ($forceCountdown -eq $true) { + Write-Log -Message "Countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} + $showCountdown = $true + } + + [String[]]$processDescriptions = $processDescriptions -split ',' + [Windows.Forms.Application]::EnableVisualStyles() + + $formWelcome = New-Object -TypeName 'System.Windows.Forms.Form' + $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' + $labelWelcomeMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelAppName = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCustomMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCloseAppsMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCountdownMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCountdown = New-Object -TypeName 'System.Windows.Forms.Label' + $labelDefer = New-Object -TypeName 'System.Windows.Forms.Label' + $listBoxCloseApps = New-Object -TypeName 'System.Windows.Forms.ListBox' + $buttonContinue = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonDefer = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonCloseApps = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonAbort = New-Object -TypeName 'System.Windows.Forms.Button' + $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' + $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' + $toolTip = New-Object -TypeName 'System.Windows.Forms.ToolTip' + + ## Remove all event handlers from the controls + [ScriptBlock]$Welcome_Form_Cleanup_FormClosed = { + Try { + $labelWelcomeMessage.remove_Click($handler_labelWelcomeMessage_Click) + $labelAppName.remove_Click($handler_labelAppName_Click) + $labelCustomMessage.remove_Click($handler_labelCustomMessage_Click) + $labelCloseAppsMessage.remove_Click($handler_labelCloseAppsMessage_Click) + $labelDefer.remove_Click($handler_labelDefer_Click) + $labelCountdownMessage.remove_Click($handler_labelCountdownMessage_Click) + $buttonCloseApps.remove_Click($buttonCloseApps_OnClick) + $buttonContinue.remove_Click($buttonContinue_OnClick) + $buttonDefer.remove_Click($buttonDefer_OnClick) + $buttonAbort.remove_Click($buttonAbort_OnClick) + $script:welcomeTimer.remove_Tick($welcomeTimer_Tick) + $welcomeTimerPersist.remove_Tick($welcomeTimerPersist_Tick) + $timerRunningProcesses.remove_Tick($timerRunningProcesses_Tick) + $formWelcome.remove_Load($Welcome_Form_StateCorrection_Load) + $formWelcome.remove_FormClosed($Welcome_Form_Cleanup_FormClosed) + } + Catch { + } + } + + [ScriptBlock]$Welcome_Form_StateCorrection_Load = { + # Disable the X button + Try { + $windowHandle = $formWelcome.Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the button. Just disable the Control Box instead + Write-Log 'Failed to disable the Close button. Disabling the Control Box instead.' -Severity 2 -Source ${CmdletName} + $formWelcome.ControlBox = $false + } + ## Correct the initial state of the form to prevent the .NET maximized form issue + $formWelcome.WindowState = 'Normal' + $formWelcome.AutoSize = $true + $formWelcome.AutoScaleMode = 'Font' + $formWelcome.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formWelcome.TopMost = $TopMost + $formWelcome.BringToFront() + # Get the start position of the form so we can return the form to this position if PersistPrompt is enabled + Set-Variable -Name 'formWelcomeStartPosition' -Value $formWelcome.Location -Scope 'Script' + + ## Initialize the countdown timer + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($CloseAppsCountdown) + $script:welcomeTimer.Start() + + ## Set up the form + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + } + + ## Add the timer if it doesn't already exist - this avoids the timer being reset if the continue button is clicked + If (-not $script:welcomeTimer) { + $script:welcomeTimer = New-Object -TypeName 'System.Windows.Forms.Timer' + } + + If ($showCountdown) { + [ScriptBlock]$welcomeTimer_Tick = { + ## Get the time information + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($CloseAppsCountdown) + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + Set-Variable -Name 'closeAppsCountdownGlobal' -Value $remainingTime.TotalSeconds -Scope 'Script' + + ## If the countdown is complete, close the application(s) or continue + If ($countdownTime -le $currentTime) { + If ($forceCountdown -eq $true) { + Write-Log -Message 'Countdown timer has elapsed. Force continue.' -Source ${CmdletName} + $buttonContinue.PerformClick() + } + Else { + Write-Log -Message 'Close application(s) countdown timer has elapsed. Force closing application(s).' -Source ${CmdletName} + If ($buttonCloseApps.CanFocus) { + $buttonCloseApps.PerformClick() + } + Else { + $buttonContinue.PerformClick() + } + } + } + Else { + # Update the form + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + } + } + } + Else { + $script:welcomeTimer.Interval = ($configInstallationUITimeout * 1000) + [ScriptBlock]$welcomeTimer_Tick = { $buttonAbort.PerformClick() } + } + + $script:welcomeTimer.add_Tick($welcomeTimer_Tick) + + ## Persistence Timer + If ($persistWindow) { + $welcomeTimerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' + $welcomeTimerPersist.Interval = ($configInstallationPersistInterval * 1000) + [ScriptBlock]$welcomeTimerPersist_Tick = { + $formWelcome.WindowState = 'Normal' + $formWelcome.TopMost = $TopMost + $formWelcome.BringToFront() + $formWelcome.Location = "$($formWelcomeStartPosition.X),$($formWelcomeStartPosition.Y)" + } + $welcomeTimerPersist.add_Tick($welcomeTimerPersist_Tick) + $welcomeTimerPersist.Start() + } + + ## Process Re-Enumeration Timer + If ($configInstallationWelcomePromptDynamicRunningProcessEvaluation) { + $timerRunningProcesses = New-Object -TypeName 'System.Windows.Forms.Timer' + $timerRunningProcesses.Interval = ($configInstallationWelcomePromptDynamicRunningProcessEvaluationInterval * 1000) + [ScriptBlock]$timerRunningProcesses_Tick = { + Try { + $dynamicRunningProcesses = $null + $dynamicRunningProcesses = Get-RunningProcesses -ProcessObjects $processObjects -DisableLogging + [String]$dynamicRunningProcessDescriptions = ($dynamicRunningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Sort-Object -Unique) -join ',' + If ($dynamicRunningProcessDescriptions -ne $script:runningProcessDescriptions) { + # Update the runningProcessDescriptions variable for the next time this function runs + Set-Variable -Name 'runningProcessDescriptions' -Value $dynamicRunningProcessDescriptions -Force -Scope 'Script' + If ($dynamicRunningProcesses) { + Write-Log -Message "The running processes have changed. Updating the apps to close: [$script:runningProcessDescriptions]..." -Source ${CmdletName} + } + # Update the list box with the processes to close + $listboxCloseApps.Items.Clear() + $script:runningProcessDescriptions -split ',' | ForEach-Object { $null = $listboxCloseApps.Items.Add($_) } + } + # If CloseApps processes were running when the prompt was shown, and they are subsequently detected to be closed while the form is showing, then close the form. The deferral and CloseApps conditions will be re-evaluated. + If ($ProcessDescriptions) { + If (-not $dynamicRunningProcesses) { + Write-Log -Message 'Previously detected running processes are no longer running.' -Source ${CmdletName} + $formWelcome.Dispose() + } + } + # If CloseApps processes were not running when the prompt was shown, and they are subsequently detected to be running while the form is showing, then close the form for relaunch. The deferral and CloseApps conditions will be re-evaluated. + Else { + If ($dynamicRunningProcesses) { + Write-Log -Message 'New running processes detected. Updating the form to prompt to close the running applications.' -Source ${CmdletName} + $formWelcome.Dispose() + } + } + } + Catch { + } + } + $timerRunningProcesses.add_Tick($timerRunningProcesses_Tick) + $timerRunningProcesses.Start() + } + + ## Form + + ##---------------------------------------------- + ## Create zero px padding object + $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 0) + ## Create basic control size + $defaultControlSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 0) + + ## Generic Button properties + $buttonSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (130, 24) + + ## Picture Banner + $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureBanner.ImageLocation = $appDeployLogoBanner + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + $pictureBanner.Location = $System_Drawing_Point + $pictureBanner.Name = 'pictureBanner' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, $appDeployLogoBannerHeight) + $pictureBanner.Size = $System_Drawing_Size + $pictureBanner.SizeMode = 'CenterImage' + $pictureBanner.Margin = $paddingNone + $pictureBanner.TabStop = $false + + ## Label Welcome Message + $labelWelcomeMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelWelcomeMessage.Font = $defaultFont + $labelWelcomeMessage.Name = 'labelWelcomeMessage' + $labelWelcomeMessage.Size = $defaultControlSize + $labelWelcomeMessage.MinimumSize = $defaultControlSize + $labelWelcomeMessage.MaximumSize = $defaultControlSize + $labelWelcomeMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 0) + $labelWelcomeMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelWelcomeMessage.TabStop = $false + $labelWelcomeMessage.Text = $configDeferPromptWelcomeMessage + $labelWelcomeMessage.TextAlign = 'MiddleCenter' + $labelWelcomeMessage.Anchor = 'Top' + $labelWelcomeMessage.AutoSize = $true + $labelWelcomeMessage.add_Click($handler_labelWelcomeMessage_Click) + + ## Label App Name + $labelAppName.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelAppName.Font = "$($defaultFont.Name), $($defaultFont.Size + 2), style=Bold" + $labelAppName.Name = 'labelAppName' + $labelAppName.Size = $defaultControlSize + $labelAppName.MinimumSize = $defaultControlSize + $labelAppName.MaximumSize = $defaultControlSize + $labelAppName.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 5, 0, 5) + $labelAppName.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelAppName.TabStop = $false + $labelAppName.Text = $installTitle + $labelAppName.TextAlign = 'MiddleCenter' + $labelAppName.Anchor = 'Top' + $labelAppName.AutoSize = $true + $labelAppName.add_Click($handler_labelAppName_Click) + + ## Label CustomMessage + $labelCustomMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCustomMessage.Font = $defaultFont + $labelCustomMessage.Name = 'labelCustomMessage' + $labelCustomMessage.Size = $defaultControlSize + $labelCustomMessage.MinimumSize = $defaultControlSize + $labelCustomMessage.MaximumSize = $defaultControlSize + $labelCustomMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 5) + $labelCustomMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCustomMessage.TabStop = $false + $labelCustomMessage.Text = $configClosePromptMessage + $labelCustomMessage.TextAlign = 'MiddleCenter' + $labelCustomMessage.Anchor = 'Top' + $labelCustomMessage.AutoSize = $true + $labelCustomMessage.add_Click($handler_labelCustomMessage_Click) + + ## Label CloseAppsMessage + $labelCloseAppsMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCloseAppsMessage.Font = $defaultFont + $labelCloseAppsMessage.Name = 'labelCloseAppsMessage' + $labelCloseAppsMessage.Size = $defaultControlSize + $labelCloseAppsMessage.MinimumSize = $defaultControlSize + $labelCloseAppsMessage.MaximumSize = $defaultControlSize + $labelCloseAppsMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 5) + $labelCloseAppsMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCloseAppsMessage.TabStop = $false + $labelCloseAppsMessage.Text = $configClosePromptMessage + $labelCloseAppsMessage.TextAlign = 'MiddleCenter' + $labelCloseAppsMessage.Anchor = 'Top' + $labelCloseAppsMessage.AutoSize = $true + $labelCloseAppsMessage.add_Click($handler_labelCloseAppsMessage_Click) + + ## Listbox Close Applications + $listBoxCloseApps.DataBindings.DefaultDataSourceUpdateMode = 0 + $listboxCloseApps.Font = $defaultFont + $listBoxCloseApps.FormattingEnabled = $true + $listBoxCloseApps.HorizontalScrollbar = $true + $listBoxCloseApps.Name = 'listBoxCloseApps' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (420, 100) + $listBoxCloseApps.Size = $System_Drawing_Size + $listBoxCloseApps.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (15, 0, 15, 0) + $listBoxCloseApps.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $listBoxCloseApps.TabIndex = 3 + $ProcessDescriptions | ForEach-Object { $null = $listboxCloseApps.Items.Add($_) } + + ## Label Defer + $labelDefer.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelDefer.Font = $defaultFont + $labelDefer.Name = 'labelDefer' + $labelDefer.Size = $defaultControlSize + $labelDefer.MinimumSize = $defaultControlSize + $labelDefer.MaximumSize = $defaultControlSize + $labelDefer.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 5) + $labelDefer.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelDefer.TabStop = $false + $deferralText = "$configDeferPromptExpiryMessage`r`n" + + If ($deferTimes -ge 0) { + $deferralText = "$deferralText `r`n$configDeferPromptRemainingDeferrals $([Int32]$deferTimes + 1)" + } + If ($deferDeadline) { + $deferralText = "$deferralText `r`n$configDeferPromptDeadline $deferDeadline" + } + If (($deferTimes -lt 0) -and (-not $DeferDeadline)) { + $deferralText = "$deferralText `r`n$configDeferPromptNoDeadline" + } + $deferralText = "$deferralText `r`n`r`n$configDeferPromptWarningMessage" + $labelDefer.Text = $deferralText + $labelDefer.TextAlign = 'MiddleCenter' + $labelDefer.AutoSize = $true + $labelDefer.add_Click($handler_labelDefer_Click) + + ## Label CountdownMessage + $labelCountdownMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCountdownMessage.Name = 'labelCountdownMessage' + $labelCountdownMessage.Font = "$($defaultFont.Name), $($defaultFont.Size + 2), style=Regular" + $labelCountdownMessage.Size = $defaultControlSize + $labelCountdownMessage.MinimumSize = $defaultControlSize + $labelCountdownMessage.MaximumSize = $defaultControlSize + $labelCountdownMessage.Margin = $paddingNone + $labelCountdownMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCountdownMessage.TabStop = $false + If (($forceCountdown -eq $true) -or (-not $script:runningProcessDescriptions)) { + Switch ($deploymentType) { + 'Uninstall' { + $labelCountdownMessage.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeUninstall); Break + } + 'Repair' { + $labelCountdownMessage.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeRepair); Break + } + Default { + $labelCountdownMessage.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeInstall); Break + } + } + } + Else { + $labelCountdownMessage.Text = $configClosePromptCountdownMessage + } + $labelCountdownMessage.TextAlign = 'MiddleCenter' + $labelCountdownMessage.Anchor = 'Top' + $labelCountdownMessage.AutoSize = $true + $labelCountdownMessage.add_Click($handler_labelCountdownMessage_Click) + + ## Label Countdown + $labelCountdown.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCountdown.Name = 'labelCountdown' + $labelCountdown.Font = "$($defaultFont.Name), $($defaultFont.Size + 9), style=Bold" + $labelCountdown.Size = $defaultControlSize + $labelCountdown.MinimumSize = $defaultControlSize + $labelCountdown.MaximumSize = $defaultControlSize + $labelCountdown.Margin = $paddingNone + $labelCountdown.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCountdown.TabStop = $false + $labelCountdown.Text = '00:00:00' + $labelCountdown.TextAlign = 'MiddleCenter' + $labelCountdown.AutoSize = $true + $labelCountdown.add_Click($handler_labelDefer_Click) + + ## Panel Flow Layout + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, $appDeployLogoBannerHeight) + $flowLayoutPanel.Location = $System_Drawing_Point + $flowLayoutPanel.MinimumSize = $DefaultControlSize + $flowLayoutPanel.MaximumSize = $DefaultControlSize + $flowLayoutPanel.Size = $DefaultControlSize + $flowLayoutPanel.Margin = $paddingNone + $flowLayoutPanel.Padding = $paddingNone + $flowLayoutPanel.AutoSizeMode = 'GrowAndShrink' + $flowLayoutPanel.AutoSize = $true + $flowLayoutPanel.Anchor = 'Top' + $flowLayoutPanel.FlowDirection = 'TopDown' + $flowLayoutPanel.WrapContents = $true + $flowLayoutPanel.Controls.Add($labelWelcomeMessage) + $flowLayoutPanel.Controls.Add($labelAppName) + + If ($CustomText -and $configWelcomePromptCustomMessage) { + $labelCustomMessage.Text = $configWelcomePromptCustomMessage + $flowLayoutPanel.Controls.Add($labelCustomMessage) + } + If ($showCloseApps) { + $flowLayoutPanel.Controls.Add($labelCloseAppsMessage) + $flowLayoutPanel.Controls.Add($listBoxCloseApps) + } + If ($showDefer) { + $flowLayoutPanel.Controls.Add($labelDefer) + } + If ($showCountdown) { + $flowLayoutPanel.Controls.Add($labelCountdownMessage) + $flowLayoutPanel.Controls.Add($labelCountdown) + } + + ## Button Close For Me + $buttonCloseApps.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonCloseApps.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (14, 4) + $buttonCloseApps.Font = $defaultFont + $buttonCloseApps.Name = 'buttonCloseApps' + $buttonCloseApps.Size = $buttonSize + $buttonCloseApps.MinimumSize = $buttonSize + $buttonCloseApps.MaximumSize = $buttonSize + $buttonCloseApps.TabIndex = 1 + $buttonCloseApps.Text = $configClosePromptButtonClose + $buttonCloseApps.DialogResult = 'Yes' + $buttonCloseApps.AutoSize = $true + $buttonCloseApps.Margin = $paddingNone + $buttonCloseApps.Padding = $paddingNone + $buttonCloseApps.UseVisualStyleBackColor = $true + $buttonCloseApps.add_Click($buttonCloseApps_OnClick) + + ## Button Defer + $buttonDefer.DataBindings.DefaultDataSourceUpdateMode = 0 + If (-not $showCloseApps) { + $buttonDefer.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (14, 4) + } + Else { + $buttonDefer.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (160, 4) + } + $buttonDefer.Name = 'buttonDefer' + $buttonDefer.Font = $defaultFont + $buttonDefer.Size = $buttonSize + $buttonDefer.MinimumSize = $buttonSize + $buttonDefer.MaximumSize = $buttonSize + $buttonDefer.TabIndex = 0 + $buttonDefer.Text = $configClosePromptButtonDefer + $buttonDefer.DialogResult = 'No' + $buttonDefer.AutoSize = $true + $buttonDefer.Margin = $paddingNone + $buttonDefer.Padding = $paddingNone + $buttonDefer.UseVisualStyleBackColor = $true + $buttonDefer.add_Click($buttonDefer_OnClick) + + ## Button Continue + $buttonContinue.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonContinue.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (306, 4) + $buttonContinue.Name = 'buttonContinue' + $buttonContinue.Font = $defaultFont + $buttonContinue.Size = $buttonSize + $buttonContinue.MinimumSize = $buttonSize + $buttonContinue.MaximumSize = $buttonSize + $buttonContinue.TabIndex = 2 + $buttonContinue.Text = $configClosePromptButtonContinue + $buttonContinue.DialogResult = 'OK' + $buttonContinue.AutoSize = $true + $buttonContinue.Margin = $paddingNone + $buttonContinue.Padding = $paddingNone + $buttonContinue.UseVisualStyleBackColor = $true + $buttonContinue.add_Click($buttonContinue_OnClick) + If ($showCloseApps) { + # Add tooltip to Continue button + $toolTip.BackColor = [Drawing.Color]::LightGoldenrodYellow + $toolTip.IsBalloon = $false + $toolTip.InitialDelay = 100 + $toolTip.ReshowDelay = 100 + $toolTip.SetToolTip($buttonContinue, $configClosePromptButtonContinueTooltip) + } + + ## Button Abort (Hidden) + $buttonAbort.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonAbort.Name = 'buttonAbort' + $buttonAbort.Font = $defaultFont + $buttonAbort.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (0, 0) + $buttonAbort.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (0, 0) + $buttonAbort.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (0, 0) + $buttonAbort.BackColor = [System.Drawing.Color]::Transparent + $buttonAbort.ForeColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.BorderSize = 0 + $buttonAbort.FlatAppearance.MouseDownBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.MouseOverBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatStyle = [System.Windows.Forms.FlatStyle]::System + $buttonAbort.TabStop = $false + $buttonAbort.DialogResult = 'Abort' + $buttonAbort.Visible = $true # Has to be set visible so we can call Click on it + $buttonAbort.Margin = $paddingNone + $buttonAbort.Padding = $paddingNone + $buttonAbort.UseVisualStyleBackColor = $true + $buttonAbort.add_Click($buttonAbort_OnClick) + + ## Form Welcome + $formWelcome.Size = $defaultControlSize + $formWelcome.MinimumSize = $defaultControlSize + $formWelcome.Padding = $paddingNone + $formWelcome.Margin = $paddingNone + $formWelcome.DataBindings.DefaultDataSourceUpdateMode = 0 + $formWelcome.Name = 'WelcomeForm' + $formWelcome.Text = $installTitle + $formWelcome.StartPosition = 'CenterScreen' + # $formWelcome.FormBorderStyle = 'FixedDialog' + $formWelcome.MaximizeBox = $false + $formWelcome.MinimizeBox = $false + $formWelcome.TopMost = $TopMost + $formWelcome.TopLevel = $true + $formWelcome.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + $formWelcome.AutoSize = $true + $formWelcome.AutoScaleMode = 'Font' + $formWelcome.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formWelcome.Controls.Add($pictureBanner) + $formWelcome.Controls.Add($buttonAbort) + ## Panel Button + $panelButtons.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.AutoSize = $true + $panelButtons.Padding = $paddingNone + $panelButtons.Margin = $paddingNone + If ($showCloseApps) { + $panelButtons.Controls.Add($buttonCloseApps) + } + If ($showDefer) { + $panelButtons.Controls.Add($buttonDefer) + } + $panelButtons.Controls.Add($buttonContinue) + + ## Add the Buttons Panel to the flowPanel + $flowLayoutPanel.Controls.Add($panelButtons) + ## Add FlowPanel to the form + $formWelcome.Controls.Add($flowLayoutPanel) + # Init the OnLoad event to correct the initial state of the form + $formWelcome.add_Load($Welcome_Form_StateCorrection_Load) + # Clean up the control events + $formWelcome.add_FormClosed($Welcome_Form_Cleanup_FormClosed) + + ## Minimize all other windows + If ($minimizeWindows) { + $null = $shellApp.MinimizeAll() + } + + ## Show the form + $result = $formWelcome.ShowDialog() + $formWelcome.Dispose() + + Switch ($result) { + OK { + $result = 'Continue' + } + No { + $result = 'Defer' + } + Yes { + $result = 'Close' + } + Abort { + $result = 'Timeout' + } + } + + If ($configInstallationWelcomePromptDynamicRunningProcessEvaluation) { + $timerRunningProcesses.Stop() + } + + Write-Output -InputObject ($result) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Show-InstallationRestartPrompt Function Show-InstallationRestartPrompt { -<# + <# .SYNOPSIS - Displays a restart prompt with a countdown to a forced restart. + +Displays a restart prompt with a countdown to a forced restart. + .DESCRIPTION - Displays a restart prompt with a countdown to a forced restart. + +Displays a restart prompt with a countdown to a forced restart. + .PARAMETER CountdownSeconds - Specifies the number of seconds to countdown before the system restart. + +Specifies the number of seconds to countdown before the system restart. Default: 60 + .PARAMETER CountdownNoHideSeconds - Specifies the number of seconds to display the restart prompt without allowing the window to be hidden. + +Specifies the number of seconds to display the restart prompt without allowing the window to be hidden. Default: 30 + +.PARAMETER NoSilentRestart + +Specifies whether the restart should be triggered when Deploy mode is silent or very silent. Default: $true + .PARAMETER NoCountdown - Specifies not to show a countdown, just the Restart Now and Restart Later buttons. - The UI will restore/reposition itself persistently based on the interval value specified in the config file. + +Specifies not to show a countdown. + +The UI will restore/reposition itself persistently based on the interval value specified in the config file. + +.PARAMETER SilentCountdownSeconds + +Specifies number of seconds to countdown for the restart when the toolkit is running in silent mode and NoSilentRestart is $false. Default: 5 + +.PARAMETER TopMost + +Specifies whether the windows is the topmost window. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + +.EXAMPLE + +Show-InstallationRestartPrompt -Countdownseconds 600 -CountdownNoHideSeconds 60 + .EXAMPLE - Show-InstallationRestartPrompt -Countdownseconds 600 -CountdownNoHideSeconds 60 + +Show-InstallationRestartPrompt -NoCountdown + .EXAMPLE - Show-InstallationRestartPrompt -NoCountdown + +Show-InstallationRestartPrompt -Countdownseconds 300 -NoSilentRestart $false -SilentCountdownSeconds 10 + .NOTES + +Be mindful of the countdown you specify for the reboot as code directly after this function might NOT be able to execute - that includes logging. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$CountdownSeconds = 60, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$CountdownNoHideSeconds = 30, - [Parameter(Mandatory=$false)] - [switch]$NoCountdown = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Bypass if in non-interactive mode - If ($deployModeSilent) { - Write-Log -Message "Bypass Installation Restart Prompt [Mode: $deployMode]." -Source ${CmdletName} - Return - } - ## Get the parameters passed to the function for invoking the function asynchronously - [hashtable]$installRestartPromptParameters = $psBoundParameters - - ## Check if we are already displaying a restart prompt - If (Get-Process | Where-Object { $_.MainWindowTitle -match $configRestartPromptTitle }) { - Write-Log -Message "${CmdletName} was invoked, but an existing restart prompt was detected. Cancelling restart prompt." -Severity 2 -Source ${CmdletName} - Return - } - - [datetime]$startTime = Get-Date - [datetime]$countdownTime = $startTime - - [Windows.Forms.Application]::EnableVisualStyles() - $formRestart = New-Object -TypeName 'System.Windows.Forms.Form' - $labelCountdown = New-Object -TypeName 'System.Windows.Forms.Label' - $labelTimeRemaining = New-Object -TypeName 'System.Windows.Forms.Label' - $labelMessage = New-Object -TypeName 'System.Windows.Forms.Label' - $buttonRestartLater = New-Object -TypeName 'System.Windows.Forms.Button' - $picturebox = New-Object -TypeName 'System.Windows.Forms.PictureBox' - $buttonRestartNow = New-Object -TypeName 'System.Windows.Forms.Button' - $timerCountdown = New-Object -TypeName 'System.Windows.Forms.Timer' - $InitialFormWindowState = New-Object -TypeName 'System.Windows.Forms.FormWindowState' - - [scriptblock]$RestartComputer = { - Write-Log -Message 'Force restart the computer...' -Source ${CmdletName} - Restart-Computer -Force - } - - [scriptblock]$FormEvent_Load = { - ## Initialize the countdown timer - [datetime]$currentTime = Get-Date - [datetime]$countdownTime = $startTime.AddSeconds($countdownSeconds) - $timerCountdown.Start() - ## Set up the form - [timespan]$remainingTime = $countdownTime.Subtract($currentTime) - $labelCountdown.Text = [string]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) - If ($remainingTime.TotalSeconds -le $countdownNoHideSeconds) { $buttonRestartLater.Enabled = $false } - $formRestart.WindowState = 'Normal' - $formRestart.TopMost = $true - $formRestart.BringToFront() - } - - [scriptblock]$Form_StateCorrection_Load = { - ## Correct the initial state of the form to prevent the .NET maximized form issue - $formRestart.WindowState = $InitialFormWindowState - $formRestart.AutoSize = $true - $formRestart.TopMost = $true - $formRestart.BringToFront() - ## Get the start position of the form so we can return the form to this position if PersistPrompt is enabled - Set-Variable -Name 'formInstallationRestartPromptStartPosition' -Value $formRestart.Location -Scope 'Script' - } - - ## Persistence Timer - If ($NoCountdown) { - $timerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' - $timerPersist.Interval = ($configInstallationRestartPersistInterval * 1000) - [scriptblock]$timerPersist_Tick = { - # Show the Restart Popup - $formRestart.WindowState = 'Normal' - $formRestart.TopMost = $true - $formRestart.BringToFront() - $formRestart.Location = "$($formInstallationRestartPromptStartPosition.X),$($formInstallationRestartPromptStartPosition.Y)" - $formRestart.Refresh() - [Windows.Forms.Application]::DoEvents() - } - $timerPersist.add_Tick($timerPersist_Tick) - $timerPersist.Start() - } - - [scriptblock]$buttonRestartLater_Click = { - ## Minimize the form - $formRestart.WindowState = 'Minimized' - If ($NoCountdown) { - ## Reset the persistence timer - $timerPersist.Stop() - $timerPersist.Start() - } - } - - ## Restart the computer - [scriptblock]$buttonRestartNow_Click = { & $RestartComputer } - - ## Hide the form if minimized - [scriptblock]$formRestart_Resize = { If ($formRestart.WindowState -eq 'Minimized') { $formRestart.WindowState = 'Minimized' } } - - [scriptblock]$timerCountdown_Tick = { - ## Get the time information - [datetime]$currentTime = Get-Date - [datetime]$countdownTime = $startTime.AddSeconds($countdownSeconds) - [timespan]$remainingTime = $countdownTime.Subtract($currentTime) - ## If the countdown is complete, restart the machine - If ($countdownTime -lt $currentTime) { - $buttonRestartNow.PerformClick() - } - Else { - ## Update the form - $labelCountdown.Text = [string]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) - If ($remainingTime.TotalSeconds -le $countdownNoHideSeconds) { - $buttonRestartLater.Enabled = $false - # If the form is hidden when we hit the "No Hide", bring it back up - If ($formRestart.WindowState -eq 'Minimized') { - # Show Popup - $formRestart.WindowState = 'Normal' - $formRestart.TopMost = $true - $formRestart.BringToFront() - $formRestart.Location = "$($formInstallationRestartPromptStartPosition.X),$($formInstallationRestartPromptStartPosition.Y)" - $formRestart.Refresh() - [Windows.Forms.Application]::DoEvents() - } - } - [Windows.Forms.Application]::DoEvents() - } - } - - ## Remove all event handlers from the controls - [scriptblock]$Form_Cleanup_FormClosed = { - Try { - $buttonRestartLater.remove_Click($buttonRestartLater_Click) - $buttonRestartNow.remove_Click($buttonRestartNow_Click) - $formRestart.remove_Load($FormEvent_Load) - $formRestart.remove_Resize($formRestart_Resize) - $timerCountdown.remove_Tick($timerCountdown_Tick) - $timerPersist.remove_Tick($timerPersist_Tick) - $formRestart.remove_Load($Form_StateCorrection_Load) - $formRestart.remove_FormClosed($Form_Cleanup_FormClosed) - } - Catch { } - } - - ## Form - If (-not $NoCountdown) { - $formRestart.Controls.Add($labelCountdown) - $formRestart.Controls.Add($labelTimeRemaining) - } - $formRestart.Controls.Add($labelMessage) - $formRestart.Controls.Add($buttonRestartLater) - $formRestart.Controls.Add($picturebox) - $formRestart.Controls.Add($buttonRestartNow) - $formRestart.ClientSize = '450,260' - $formRestart.ControlBox = $false - $formRestart.FormBorderStyle = 'FixedDialog' - $formRestart.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon - $formRestart.MaximizeBox = $false - $formRestart.MinimizeBox = $false - $formRestart.Name = 'formRestart' - $formRestart.StartPosition = 'CenterScreen' - $formRestart.Text = "$($configRestartPromptTitle): $installTitle" - $formRestart.add_Load($FormEvent_Load) - $formRestart.add_Resize($formRestart_Resize) - - ## Banner - $picturebox.Anchor = 'Top' - $picturebox.Image = [Drawing.Image]::Fromfile($AppDeployLogoBanner) - $picturebox.Location = '0,0' - $picturebox.Name = 'picturebox' - $picturebox.Size = '450,50' - $picturebox.SizeMode = 'CenterImage' - $picturebox.TabIndex = 1 - $picturebox.TabStop = $false - - ## Label Message - $labelMessage.Location = '20,58' - $labelMessage.Name = 'labelMessage' - $labelMessage.Size = '400,79' - $labelMessage.TabIndex = 3 - $labelMessage.Text = "$configRestartPromptMessage $configRestartPromptMessageTime `n`n$configRestartPromptMessageRestart" - If ($NoCountdown) { $labelMessage.Text = $configRestartPromptMessage } - $labelMessage.TextAlign = 'MiddleCenter' - - ## Label Time Remaining - $labelTimeRemaining.Location = '20,138' - $labelTimeRemaining.Name = 'labelTimeRemaining' - $labelTimeRemaining.Size = '400,23' - $labelTimeRemaining.TabIndex = 4 - $labelTimeRemaining.Text = $configRestartPromptTimeRemaining - $labelTimeRemaining.TextAlign = 'MiddleCenter' - - ## Label Countdown - $labelCountdown.Font = 'Microsoft Sans Serif, 18pt, style=Bold' - $labelCountdown.Location = '20,165' - $labelCountdown.Name = 'labelCountdown' - $labelCountdown.Size = '400,30' - $labelCountdown.TabIndex = 5 - $labelCountdown.Text = '00:00:00' - $labelCountdown.TextAlign = 'MiddleCenter' - - ## Label Restart Later - $buttonRestartLater.Anchor = 'Bottom,Left' - $buttonRestartLater.Location = '20,216' - $buttonRestartLater.Name = 'buttonRestartLater' - $buttonRestartLater.Size = '159,23' - $buttonRestartLater.TabIndex = 0 - $buttonRestartLater.Text = $configRestartPromptButtonRestartLater - $buttonRestartLater.UseVisualStyleBackColor = $true - $buttonRestartLater.add_Click($buttonRestartLater_Click) - - ## Label Restart Now - $buttonRestartNow.Anchor = 'Bottom,Right' - $buttonRestartNow.Location = '265,216' - $buttonRestartNow.Name = 'buttonRestartNow' - $buttonRestartNow.Size = '159,23' - $buttonRestartNow.TabIndex = 2 - $buttonRestartNow.Text = $configRestartPromptButtonRestartNow - $buttonRestartNow.UseVisualStyleBackColor = $true - $buttonRestartNow.add_Click($buttonRestartNow_Click) - - ## Timer Countdown - If (-not $NoCountdown) { $timerCountdown.add_Tick($timerCountdown_Tick) } - - ##---------------------------------------------- - - ## Save the initial state of the form - $InitialFormWindowState = $formRestart.WindowState - # Init the OnLoad event to correct the initial state of the form - $formRestart.add_Load($Form_StateCorrection_Load) - # Clean up the control events - $formRestart.add_FormClosed($Form_Cleanup_FormClosed) - $formRestartClosing = [Windows.Forms.FormClosingEventHandler]{ If ($_.CloseReason -eq 'UserClosing') { $_.Cancel = $true } } - $formRestart.add_FormClosing($formRestartClosing) - - ## If the script has been dot-source invoked by the deploy app script, display the restart prompt asynchronously - If ($deployAppScriptFriendlyName) { - If ($NoCountdown) { - Write-Log -Message "Invoking ${CmdletName} asynchronously with no countdown..." -Source ${CmdletName} - } - Else { - Write-Log -Message "Invoking ${CmdletName} asynchronously with a [$countDownSeconds] second countdown..." -Source ${CmdletName} - } - [string]$installRestartPromptParameters = ($installRestartPromptParameters.GetEnumerator() | ForEach-Object { - If ($_.Value.GetType().Name -eq 'SwitchParameter') { - "-$($_.Key)" - } - ElseIf ($_.Value.GetType().Name -eq 'Boolean') { - "-$($_.Key) `$" + "$($_.Value)".ToLower() - } - ElseIf ($_.Value.GetType().Name -eq 'Int32') { - "-$($_.Key) $($_.Value)" - } - Else { - "-$($_.Key) `"$($_.Value)`"" - } - }) -join ' ' - Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `"$scriptPath`" -ReferredInstallTitle `"$installTitle`" -ReferredInstallName `"$installName`" -ReferredLogName `"$logName`" -ShowInstallationRestartPrompt $installRestartPromptParameters -AsyncToolkitLaunch" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' - } - Else { - If ($NoCountdown) { - Write-Log -Message 'Display restart prompt with no countdown.' -Source ${CmdletName} - } - Else { - Write-Log -Message "Display restart prompt with a [$countDownSeconds] second countdown." -Source ${CmdletName} - } - - # Show the Form - Write-Output -InputObject $formRestart.ShowDialog() - $formRestart.Dispose() - - # Activate the Window - [Diagnostics.Process]$powershellProcess = Get-Process | Where-Object { $_.MainWindowTitle -match $installTitle } - [Microsoft.VisualBasic.Interaction]::AppActivate($powershellProcess.ID) - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$CountdownSeconds = 60, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$CountdownNoHideSeconds = 30, + [Parameter(Mandatory = $false)] + [Boolean]$NoSilentRestart = $true, + [Parameter(Mandatory = $false)] + [Switch]$NoCountdown = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$SilentCountdownSeconds = 5, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If in non-interactive mode + If ($deployModeSilent) { + If ($NoSilentRestart -eq $false) { + Write-Log -Message "Triggering restart silently, because the deploy mode is set to [$deployMode] and [NoSilentRestart] is disabled. Timeout is set to [$SilentCountdownSeconds] seconds." -Source ${CmdletName} + Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command `"& { Start-Sleep -Seconds $SilentCountdownSeconds; Restart-Computer -Force; }`"" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' + } + Else { + Write-Log -Message "Skipping restart, because the deploy mode is set to [$deployMode] and [NoSilentRestart] is enabled." -Source ${CmdletName} + } + Return + } + ## Get the parameters passed to the function for invoking the function asynchronously + [Hashtable]$installRestartPromptParameters = $PSBoundParameters + + ## Check if we are already displaying a restart prompt + If (Get-Process | Where-Object { $_.MainWindowTitle -match $configRestartPromptTitle }) { + Write-Log -Message "${CmdletName} was invoked, but an existing restart prompt was detected. Cancelling restart prompt." -Severity 2 -Source ${CmdletName} + Return + } + + ## If the script has been dot-source invoked by the deploy app script, display the restart prompt asynchronously + If ($deployAppScriptFriendlyName) { + If ($NoCountdown) { + Write-Log -Message "Invoking ${CmdletName} asynchronously with no countdown..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Invoking ${CmdletName} asynchronously with a [$countDownSeconds] second countdown..." -Source ${CmdletName} + } + ## Remove Silent reboot parameters from the list that is being forwarded to the main script for asynchronous function execution. This is only for Interactive mode so we dont need silent mode reboot parameters. + $installRestartPromptParameters.Remove('NoSilentRestart') + $installRestartPromptParameters.Remove('SilentCountdownSeconds') + ## Prepare a list of parameters of this function as a string + [String]$installRestartPromptParameters = ($installRestartPromptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' + ## Start another powershell instance silently with function parameters from this function + Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {& `'$scriptPath`' -ReferredInstallTitle `'$installTitle`' -ReferredInstallName `'$installName`' -ReferredLogName `'$logName`' -ShowInstallationRestartPrompt $installRestartPromptParameters -AsyncToolkitLaunch}" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' + Return + } + + [DateTime]$startTime = Get-Date + [DateTime]$countdownTime = $startTime + + [Windows.Forms.Application]::EnableVisualStyles() + $formRestart = New-Object -TypeName 'System.Windows.Forms.Form' + $labelCountdown = New-Object -TypeName 'System.Windows.Forms.Label' + $labelTimeRemaining = New-Object -TypeName 'System.Windows.Forms.Label' + $labelMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $buttonRestartLater = New-Object -TypeName 'System.Windows.Forms.Button' + $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' + $buttonRestartNow = New-Object -TypeName 'System.Windows.Forms.Button' + $timerCountdown = New-Object -TypeName 'System.Windows.Forms.Timer' + $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' + $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' + + [ScriptBlock]$RestartComputer = { + Write-Log -Message 'Forcefully restarting the computer...' -Source ${CmdletName} + Restart-Computer -Force + } + + [ScriptBlock]$Restart_Form_StateCorrection_Load = { + # Disable the X button + Try { + $windowHandle = $formRestart.Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the button. Just disable the Control Box instead + Write-Log 'Failed to disable the Close button. Disabling the Control Box instead.' -Severity 2 -Source ${CmdletName} + $formRestart.ControlBox = $false + } + ## Initialize the countdown timer + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($countdownSeconds) + $timerCountdown.Start() + ## Set up the form + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + If ($remainingTime.TotalSeconds -le $countdownNoHideSeconds) { + $buttonRestartLater.Enabled = $false + } + $formRestart.WindowState = 'Normal' + $formRestart.AutoSize = $true + $formRestart.AutoScaleMode = 'Font' + $formRestart.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formRestart.TopMost = $TopMost + $formRestart.BringToFront() + ## Get the start position of the form so we can return the form to this position if PersistPrompt is enabled + Set-Variable -Name 'formInstallationRestartPromptStartPosition' -Value $formRestart.Location -Scope 'Script' + } + + ## Persistence Timer + If ($NoCountdown) { + $restartTimerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' + $restartTimerPersist.Interval = ($configInstallationRestartPersistInterval * 1000) + [ScriptBlock]$restartTimerPersist_Tick = { + # Show the Restart Popup + $formRestart.WindowState = 'Normal' + $formRestart.TopMost = $TopMost + $formRestart.BringToFront() + $formRestart.Location = "$($formInstallationRestartPromptStartPosition.X),$($formInstallationRestartPromptStartPosition.Y)" + } + $restartTimerPersist.add_Tick($restartTimerPersist_Tick) + $restartTimerPersist.Start() + } + + [ScriptBlock]$buttonRestartLater_Click = { + ## Minimize the form + $formRestart.WindowState = 'Minimized' + If ($NoCountdown) { + ## Reset the persistence timer + $restartTimerPersist.Stop() + $restartTimerPersist.Start() + } + } + + ## Restart the computer + [ScriptBlock]$buttonRestartNow_Click = { & $RestartComputer } + + ## Hide the form if minimized + [ScriptBlock]$formRestart_Resize = { If ($formRestart.WindowState -eq 'Minimized') { + $formRestart.WindowState = 'Minimized' + } } + + [ScriptBlock]$timerCountdown_Tick = { + ## Get the time information + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($countdownSeconds) + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + ## If the countdown is complete, restart the machine + If ($countdownTime -le $currentTime) { + $buttonRestartNow.PerformClick() + } + Else { + ## Update the form + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + If ($remainingTime.TotalSeconds -le $countdownNoHideSeconds) { + $buttonRestartLater.Enabled = $false + # If the form is hidden when we hit the "No Hide", bring it back up + If ($formRestart.WindowState -eq 'Minimized') { + # Show Popup + $formRestart.WindowState = 'Normal' + $formRestart.TopMost = $TopMost + $formRestart.BringToFront() + $formRestart.Location = "$($formInstallationRestartPromptStartPosition.X),$($formInstallationRestartPromptStartPosition.Y)" + } + } + } + } + + ## Remove all event handlers from the controls + [ScriptBlock]$Restart_Form_Cleanup_FormClosed = { + Try { + $buttonRestartLater.remove_Click($buttonRestartLater_Click) + $buttonRestartNow.remove_Click($buttonRestartNow_Click) + $formRestart.remove_Load($Restart_Form_StateCorrection_Load) + $formRestart.remove_Resize($formRestart_Resize) + $timerCountdown.remove_Tick($timerCountdown_Tick) + $restartTimerPersist.remove_Tick($restartTimerPersist_Tick) + $formRestart.remove_FormClosed($Restart_Form_Cleanup_FormClosed) + } + Catch { + } + } + + ## Form + ##---------------------------------------------- + ## Create zero px padding object + $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 0) + ## Create basic control size + $defaultControlSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 0) + + ## Generic Button properties + $buttonSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (195, 24) + + ## Picture Banner + $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureBanner.ImageLocation = $appDeployLogoBanner + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + $pictureBanner.Location = $System_Drawing_Point + $pictureBanner.Name = 'pictureBanner' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, $appDeployLogoBannerHeight) + $pictureBanner.Size = $System_Drawing_Size + $pictureBanner.SizeMode = 'CenterImage' + $pictureBanner.Margin = $paddingNone + $pictureBanner.TabStop = $false + + ## Label Message + $labelMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelMessage.Font = $defaultFont + $labelMessage.Name = 'labelMessage' + $labelMessage.Size = $defaultControlSize + $labelMessage.MinimumSize = $defaultControlSize + $labelMessage.MaximumSize = $defaultControlSize + $labelMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 5) + $labelMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelMessage.Text = "$configRestartPromptMessage $configRestartPromptMessageTime `r`n`r`n$configRestartPromptMessageRestart" + If ($NoCountdown) { + $labelMessage.Text = $configRestartPromptMessage + } + $labelMessage.TextAlign = 'MiddleCenter' + $labelMessage.Anchor = 'Top' + $labelMessage.TabStop = $false + $labelMessage.AutoSize = $true + + ## Label Time remaining message + $labelTimeRemaining.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelTimeRemaining.Font = "$($defaultFont.Name), $($defaultFont.Size + 2), style=Regular" + $labelTimeRemaining.Name = 'labelTimeRemaining' + $labelTimeRemaining.Size = $defaultControlSize + $labelTimeRemaining.MinimumSize = $defaultControlSize + $labelTimeRemaining.MaximumSize = $defaultControlSize + $labelTimeRemaining.Margin = $paddingNone + $labelTimeRemaining.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelTimeRemaining.TabStop = $false + $labelTimeRemaining.Text = $configRestartPromptTimeRemaining + $labelTimeRemaining.TextAlign = 'MiddleCenter' + $labelTimeRemaining.Anchor = 'Top' + $labelTimeRemaining.AutoSize = $true + + ## Label Countdown + $labelCountdown.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCountdown.Font = "$($defaultFont.Name), $($defaultFont.Size + 9), style=Bold" + $labelCountdown.Name = 'labelCountdown' + $labelCountdown.Size = $defaultControlSize + $labelCountdown.MinimumSize = $defaultControlSize + $labelCountdown.MaximumSize = $defaultControlSize + $labelCountdown.Margin = $paddingNone + $labelCountdown.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCountdown.TabStop = $false + $labelCountdown.Text = '00:00:00' + $labelCountdown.TextAlign = 'MiddleCenter' + $labelCountdown.AutoSize = $true + + ## Panel Flow Layout + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, $appDeployLogoBannerHeight) + $flowLayoutPanel.Location = $System_Drawing_Point + $flowLayoutPanel.MinimumSize = $DefaultControlSize + $flowLayoutPanel.MaximumSize = $DefaultControlSize + $flowLayoutPanel.Size = $DefaultControlSize + $flowLayoutPanel.Margin = $paddingNone + $flowLayoutPanel.Padding = $paddingNone + $flowLayoutPanel.AutoSizeMode = 'GrowAndShrink' + $flowLayoutPanel.AutoSize = $true + $flowLayoutPanel.Anchor = 'Top' + $flowLayoutPanel.FlowDirection = 'TopDown' + $flowLayoutPanel.WrapContents = $true + $flowLayoutPanel.Controls.Add($labelMessage) + If (-not $NoCountdown) { + $flowLayoutPanel.Controls.Add($labelTimeRemaining) + $flowLayoutPanel.Controls.Add($labelCountdown) + } + + ## Button Minimize + $buttonRestartLater.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonRestartLater.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (240, 4) + $buttonRestartLater.Name = 'buttonRestartLater' + $buttonRestartLater.Font = $defaultFont + $buttonRestartLater.Size = $buttonSize + $buttonRestartLater.MinimumSize = $buttonSize + $buttonRestartLater.MaximumSize = $buttonSize + $buttonRestartLater.TabIndex = 0 + $buttonRestartLater.Text = $configRestartPromptButtonRestartLater + $buttonRestartLater.AutoSize = $true + $buttonRestartLater.Margin = $paddingNone + $buttonRestartLater.Padding = $paddingNone + $buttonRestartLater.UseVisualStyleBackColor = $true + $buttonRestartLater.add_Click($buttonRestartLater_Click) + + ## Button Restart Now + $buttonRestartNow.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonRestartNow.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (14, 4) + $buttonRestartNow.Name = 'buttonRestartNow' + $buttonRestartNow.Font = $defaultFont + $buttonRestartNow.Size = $buttonSize + $buttonRestartNow.MinimumSize = $buttonSize + $buttonRestartNow.MaximumSize = $buttonSize + $buttonRestartNow.TabIndex = 1 + $buttonRestartNow.Text = $configRestartPromptButtonRestartNow + $buttonRestartNow.Margin = $paddingNone + $buttonRestartNow.Padding = $paddingNone + $buttonRestartNow.UseVisualStyleBackColor = $true + $buttonRestartNow.add_Click($buttonRestartNow_Click) + + ## Form Restart + $formRestart.Size = $defaultControlSize + $formRestart.MinimumSize = $defaultControlSize + $formRestart.Padding = $paddingNone + $formRestart.Margin = $paddingNone + $formRestart.DataBindings.DefaultDataSourceUpdateMode = 0 + $formRestart.Name = 'formRestart' + $formRestart.Text = $installTitle + $formRestart.StartPosition = 'CenterScreen' + # $formRestart.FormBorderStyle = 'FixedDialog' + $formRestart.MaximizeBox = $false + $formRestart.MinimizeBox = $false + $formRestart.TopMost = $TopMost + $formRestart.TopLevel = $true + $formRestart.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + $formRestart.AutoSize = $true + $formRestart.AutoScaleMode = 'Font' + $formRestart.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formRestart.ControlBox = $true + $formRestart.Controls.Add($pictureBanner) + + ## Button Panel + $panelButtons.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.AutoSize = $true + $panelButtons.Padding = $paddingNone + $panelButtons.Margin = $paddingNone + $panelButtons.Controls.Add($buttonRestartNow) + $panelButtons.Controls.Add($buttonRestartLater) + ## Add the Buttons Panel to the flowPanel + $flowLayoutPanel.Controls.Add($panelButtons) + ## Add FlowPanel to the form + $formRestart.Controls.Add($flowLayoutPanel) + $formRestart.add_Resize($formRestart_Resize) + ## Timer Countdown + If (-not $NoCountdown) { + $timerCountdown.add_Tick($timerCountdown_Tick) + } + ##---------------------------------------------- + # Init the OnLoad event to correct the initial state of the form + $formRestart.add_Load($Restart_Form_StateCorrection_Load) + # Clean up the control events + $formRestart.add_FormClosed($Restart_Form_Cleanup_FormClosed) + $formRestartClosing = [Windows.Forms.FormClosingEventHandler] { If ($_.CloseReason -eq 'UserClosing') { + $_.Cancel = $true + } } + $formRestart.add_FormClosing($formRestartClosing) + + If ($NoCountdown) { + Write-Log -Message 'Displaying restart prompt with no countdown.' -Source ${CmdletName} + } + Else { + Write-Log -Message "Displaying restart prompt with a [$countDownSeconds] second countdown." -Source ${CmdletName} + } + + # Show the Form + Write-Output -InputObject ($formRestart.ShowDialog()) + $formRestart.Dispose() + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Show-BalloonTip Function Show-BalloonTip { -<# + <# .SYNOPSIS - Displays a balloon tip notification in the system tray. + +Displays a balloon tip notification in the system tray. + .DESCRIPTION - Displays a balloon tip notification in the system tray. + +Displays a balloon tip notification in the system tray. + .PARAMETER BalloonTipText - Text of the balloon tip. + +Text of the balloon tip. + .PARAMETER BalloonTipTitle - Title of the balloon tip. + +Title of the balloon tip. + .PARAMETER BalloonTipIcon - Icon to be used. Options: 'Error', 'Info', 'None', 'Warning'. Default is: Info. + +Icon to be used. Options: 'Error', 'Info', 'None', 'Warning'. Default is: Info. + .PARAMETER BalloonTipTime - Time in milliseconds to display the balloon tip. Default: 500. + +Time in milliseconds to display the balloon tip. Default: 10000. + +.PARAMETER NoWait + +Create the balloontip asynchronously. Default: $false + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + .EXAMPLE - Show-BalloonTip -BalloonTipText 'Installation Started' -BalloonTipTitle 'Application Name' + +Show-BalloonTip -BalloonTipText 'Installation Started' -BalloonTipTitle 'Application Name' + .EXAMPLE - Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText 'Installation Started' -BalloonTipTitle 'Application Name' -BalloonTipTime 1000 + +Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText 'Installation Started' -BalloonTipTitle 'Application Name' -BalloonTipTime 1000 + .NOTES + +For Windows 10 OS and above a Toast notification is displayed in place of a balloon tip if toast notifications are enabled in the XML config file. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,Position=0)] - [ValidateNotNullOrEmpty()] - [string]$BalloonTipText, - [Parameter(Mandatory=$false,Position=1)] - [ValidateNotNullorEmpty()] - [string]$BalloonTipTitle = $installTitle, - [Parameter(Mandatory=$false,Position=2)] - [ValidateSet('Error','Info','None','Warning')] - [Windows.Forms.ToolTipIcon]$BalloonTipIcon = 'Info', - [Parameter(Mandatory=$false,Position=3)] - [ValidateNotNullorEmpty()] - [int32]$BalloonTipTime = 10000 - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - ## Skip balloon if in silent mode - If (($deployModeSilent) -or (-not $configShowBalloonNotifications) -or (Test-PowerPoint)) { Return } - - ## Dispose of previous balloon - If ($script:notifyIcon) { Try { $script:notifyIcon.Dispose() } Catch {} } - - ## Get the calling function so we know when to display the exiting balloon tip notification in an asynchronous script - Try { [string]$callingFunction = (Get-Variable -Name MyInvocation -Scope 1).Value.Mycommand.Name } Catch { } - - If ($callingFunction -eq 'Exit-Script') { - Write-Log -Message "Display balloon tip notification asynchronously with message [$BalloonTipText]." -Source ${CmdletName} - ## Create a script block to display the balloon notification in a new PowerShell process so that we can wait to cleanly dispose of the balloon tip without having to make the deployment script wait - [scriptblock]$notifyIconScriptBlock = { - Param ( - [Parameter(Mandatory=$true,Position=0)] - [ValidateNotNullOrEmpty()] - [string]$BalloonTipText, - [Parameter(Mandatory=$false,Position=1)] - [ValidateNotNullorEmpty()] - [string]$BalloonTipTitle, - [Parameter(Mandatory=$false,Position=2)] - [ValidateSet('Error','Info','None','Warning')] - $BalloonTipIcon, # Don't strongly type variable as System.Drawing; assembly not loaded yet in asynchronous scriptblock so will throw error - [Parameter(Mandatory=$false,Position=3)] - [ValidateNotNullorEmpty()] - [int32]$BalloonTipTime, - [Parameter(Mandatory=$false,Position=4)] - [ValidateNotNullorEmpty()] - [string]$AppDeployLogoIcon - ) - - ## Load assembly containing class System.Windows.Forms and System.Drawing - Add-Type -AssemblyName 'System.Windows.Forms' -ErrorAction 'Stop' - Add-Type -AssemblyName 'System.Drawing' -ErrorAction 'Stop' - - [Windows.Forms.ToolTipIcon]$BalloonTipIcon = $BalloonTipIcon - $script:notifyIcon = New-Object -TypeName 'System.Windows.Forms.NotifyIcon' -Property @{ - BalloonTipIcon = $BalloonTipIcon - BalloonTipText = $BalloonTipText - BalloonTipTitle = $BalloonTipTitle - Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon - Text = -join $BalloonTipText[0..62] - Visible = $true - } - - ## Display the balloon tip notification asynchronously - $script:NotifyIcon.ShowBalloonTip($BalloonTipTime) - - ## Keep the asynchronous PowerShell process running so that we can dispose of the balloon tip icon - Start-Sleep -Milliseconds ($BalloonTipTime) - $script:notifyIcon.Dispose() - } - - ## Invoke a separate PowerShell process passing the script block as a command and associated parameters to display the balloon tip notification asynchronously - Try { - Execute-Process -Path "$PSHOME\powershell.exe" -Parameters "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {$notifyIconScriptBlock} '$BalloonTipText' '$BalloonTipTitle' '$BalloonTipIcon' '$BalloonTipTime' '$AppDeployLogoIcon'" -NoWait -WindowStyle 'Hidden' -CreateNoWindow - } - Catch { } - } - ## Otherwise create the balloontip icon synchronously - Else { - Write-Log -Message "Display balloon tip notification with message [$BalloonTipText]." -Source ${CmdletName} - [Windows.Forms.ToolTipIcon]$BalloonTipIcon = $BalloonTipIcon - $script:notifyIcon = New-Object -TypeName 'System.Windows.Forms.NotifyIcon' -Property @{ - BalloonTipIcon = $BalloonTipIcon - BalloonTipText = $BalloonTipText - BalloonTipTitle = $BalloonTipTitle - Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon - Text = -join $BalloonTipText[0..62] - Visible = $true - } - - ## Display the balloon tip notification - $script:NotifyIcon.ShowBalloonTip($BalloonTipTime) - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [String]$BalloonTipText, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$BalloonTipTitle = $installTitle, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateSet('Error', 'Info', 'None', 'Warning')] + [Windows.Forms.ToolTipIcon]$BalloonTipIcon = 'Info', + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [Int32]$BalloonTipTime = 10000, + [Parameter(Mandatory = $false, Position = 4)] + [Switch]$NoWait = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Skip balloon if in silent mode, disabled in the config or presentation is detected + $presentationDetected = Test-PowerPoint + If (($deployModeSilent) -or (-not $configShowBalloonNotifications) -or $presentationDetected) { + Write-Log -Message "Bypassing Show-BalloonTip [Mode:$deployMode, Config Show Balloon Notifications:$configShowBalloonNotifications, Presentation Detected:$presentationDetected]. BalloonTipText:$BalloonTipText" -Source ${CmdletName} + Return + } + ## Dispose of previous balloon + If ($script:notifyIcon) { + Try { + $script:notifyIcon.Dispose() + } + Catch { + } + } + + If (($envOSVersionMajor -lt 10) -or ($configToastDisable -eq $true)) { + ## NoWait - Create the balloontip icon asynchronously + If ($NoWait) { + Write-Log -Message "Displaying balloon tip notification asynchronously with message [$BalloonTipText]." -Source ${CmdletName} + ## Create a script block to display the balloon notification in a new PowerShell process so that we can wait to cleanly dispose of the balloon tip without having to make the deployment script wait + ## Scriptblock text has to be as short as possible because it is passed as a parameter to powershell + ## Don't strongly type parameter BalloonTipIcon as System.Drawing assembly not loaded yet in asynchronous scriptblock so will throw error + [ScriptBlock]$notifyIconScriptBlock = { + Param( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [String]$BalloonTipText, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$BalloonTipTitle, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateSet('Error', 'Info', 'None', 'Warning')] + $BalloonTipIcon = 'Info', + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [Int32]$BalloonTipTime, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [String]$AppDeployLogoIcon + ) + Add-Type -AssemblyName 'System.Windows.Forms', 'System.Drawing' -ErrorAction 'Stop' + $BalloonTipIconText = [String]::Concat($BalloonTipTitle, ' - ', $BalloonTipText) + If ($BalloonTipIconText.Length -gt 63) { + $BalloonTipIconText = [String]::Concat($BalloonTipIconText.Substring(0, 60), '...') + } + [Windows.Forms.ToolTipIcon]$BalloonTipIcon = $BalloonTipIcon + $script:notifyIcon = New-Object -TypeName 'System.Windows.Forms.NotifyIcon' -Property @{ + BalloonTipIcon = $BalloonTipIcon + BalloonTipText = $BalloonTipText + BalloonTipTitle = $BalloonTipTitle + Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + Text = $BalloonTipIconText + Visible = $true + } + + $script:notifyIcon.ShowBalloonTip($BalloonTipTime) + Start-Sleep -Milliseconds ($BalloonTipTime) + $script:notifyIcon.Dispose() } + + ## Invoke a separate PowerShell process passing the script block as a command and associated parameters to display the balloon tip notification asynchronously + Try { + Execute-Process -Path "$PSHOME\powershell.exe" -Parameters "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {$notifyIconScriptBlock} `'$BalloonTipText`' `'$BalloonTipTitle`' `'$BalloonTipIcon`' `'$BalloonTipTime`' `'$AppDeployLogoIcon`'" -NoWait -WindowStyle 'Hidden' -CreateNoWindow + } + Catch { + } + } + ## Otherwise create the balloontip icon synchronously + Else { + Write-Log -Message "Displaying balloon tip notification with message [$BalloonTipText]." -Source ${CmdletName} + ## Prepare Text - Cut it if longer than 63 chars + $BalloonTipIconText = [String]::Concat($BalloonTipTitle, ' - ', $BalloonTipText) + If ($BalloonTipIconText.Length -gt 63) { + $BalloonTipIconText = [String]::Concat($BalloonTipIconText.Substring(0, 60), '...') + } + ## Create the BalloonTip + [Windows.Forms.ToolTipIcon]$BalloonTipIcon = $BalloonTipIcon + $script:notifyIcon = New-Object -TypeName 'System.Windows.Forms.NotifyIcon' -Property @{ + BalloonTipIcon = $BalloonTipIcon + BalloonTipText = $BalloonTipText + BalloonTipTitle = $BalloonTipTitle + Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + Text = $BalloonTipIconText + Visible = $true + } + ## Display the balloon tip notification + $script:notifyIcon.ShowBalloonTip($BalloonTipTime) + } + } + # Otherwise use toast notification + Else { + $toastAppID = $appDeployToolkitName + $toastAppDisplayName = $configToastAppName + + [scriptblock]$toastScriptBlock = { + Param( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [String]$BalloonTipText, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$BalloonTipTitle, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNullorEmpty()] + [String]$AppDeployLogoImage, + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [String]$toastAppID, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [String]$toastAppDisplayName + ) + + # Check for required entries in registry for when using Powershell as application for the toast + # Register the AppID in the registry for use with the Action Center, if required + $regPathToastNotificationSettings = 'Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings' + $regPathToastApp = 'Registry::HKEY_CURRENT_USER\Software\Classes\AppUserModelId' + + # Create the registry entries + $null = New-Item -Path "$regPathToastNotificationSettings\$toastAppId" -Force + # Make sure the app used with the action center is enabled + $null = New-ItemProperty -Path "$regPathToastNotificationSettings\$toastAppId" -Name 'ShowInActionCenter' -Value 1 -PropertyType 'DWORD' -Force + $null = New-ItemProperty -Path "$regPathToastNotificationSettings\$toastAppId" -Name 'Enabled' -Value 1 -PropertyType 'DWORD' -Force + $null = New-ItemProperty -Path "$regPathToastNotificationSettings\$toastAppId" -Name 'SoundFile' -PropertyType 'STRING' -Force + + # Create the registry entries + $null = New-Item -Path "$regPathToastApp\$toastAppId" -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'DisplayName' -Value "$($toastAppDisplayName)" -PropertyType 'STRING' -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'ShowInSettings' -Value 0 -PropertyType 'DWORD' -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'IconUri' -Value $appDeployLogoImage -PropertyType 'ExpandString' -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'IconBackgroundColor' -Value 0 -PropertyType 'ExpandString' -Force + + [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null + [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null + + ## Gets the Template XML so we can manipulate the values + $Template = [Windows.UI.Notifications.ToastTemplateType]::ToastImageAndText01 + [xml] $ToastTemplate = ([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent($Template).GetXml()) + [xml] $ToastTemplate = @" + + + + $BalloonTipTitle + $BalloonTipText + + + + +"@ + + $ToastXml = New-Object -TypeName Windows.Data.Xml.Dom.XmlDocument + $ToastXml.LoadXml($ToastTemplate.OuterXml) + + $notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($toastAppId) + $notifier.Show($toastXml) + + } + + If ($ProcessNTAccount -eq $runAsActiveUser.NTAccount) { + Write-Log -Message "Displaying toast notification with message [$BalloonTipText]." -Source ${CmdletName} + Invoke-Command -ScriptBlock $toastScriptBlock -ArgumentList $BalloonTipText, $BalloonTipTitle, $AppDeployLogoImage, $toastAppID, $toastAppDisplayName + } + Else { + ## Invoke a separate PowerShell process as the current user passing the script block as a command and associated parameters to display the toast notification in the user context + Try { + Write-Log -Message "Displaying toast notification with message [$BalloonTipText] using Execute-ProcessAsUser." -Source ${CmdletName} + $executeToastAsUserScript = "$loggedOnUserTempPath" + "$($appDeployToolkitName)-ToastNotification.ps1" + Set-Content -Path $executeToastAsUserScript -Value $toastScriptBlock -Force + Execute-ProcessAsUser -Path "$PSHOME\powershell.exe" -Parameters "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & { & `"`'$executeToastAsUserScript`' `'$BalloonTipText`' `'$BalloonTipTitle`' `'$AppDeployLogoImage`' `'$toastAppID`' `'$toastAppDisplayName`'`"; Exit `$LastExitCode }" -TempPath $loggedOnUserTempPath -Wait -RunLevel 'LeastPrivilege' + } + Catch { + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Show-InstallationProgress Function Show-InstallationProgress { -<# + <# .SYNOPSIS - Displays a progress dialog in a separate thread with an updateable custom message. + +Displays a progress dialog in a separate thread with an updateable custom message. + .DESCRIPTION - Create a WPF window in a separate thread to display a marquee style progress ellipse with a custom message that can be updated. - The status message supports line breaks. - The first time this function is called in a script, it will display a balloon tip notification to indicate that the installation has started (provided balloon tips are enabled in the configuration). + +Create a WPF window in a separate thread to display a marquee style progress ellipse with a custom message that can be updated. + +The status message supports line breaks. + +The first time this function is called in a script, it will display a balloon tip notification to indicate that the installation has started (provided balloon tips are enabled in the configuration). + .PARAMETER StatusMessage - The status message to be displayed. The default status message is taken from the XML configuration file. + +The status message to be displayed. The default status message is taken from the XML configuration file. + .PARAMETER WindowLocation - The location of the progress window. Default: just below top, centered. + +The location of the progress window. Default: center of the screen. + .PARAMETER TopMost - Specifies whether the progress window should be topmost. Default: $true. + +Specifies whether the progress window should be topmost. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Show-InstallationProgress - Uses the default status message from the XML configuration file. + +Show-InstallationProgress + +Uses the default status message from the XML configuration file. + .EXAMPLE - Show-InstallationProgress -StatusMessage 'Installation in Progress...' + +Show-InstallationProgress -StatusMessage 'Installation in Progress...' + .EXAMPLE - Show-InstallationProgress -StatusMessage "Installation in Progress...`nThe installation may take 20 minutes to complete." + +Show-InstallationProgress -StatusMessage "Installation in Progress...`r`nThe installation may take 20 minutes to complete." + .EXAMPLE - Show-InstallationProgress -StatusMessage 'Installation in Progress...' -WindowLocation 'BottomRight' -TopMost $false + +Show-InstallationProgress -StatusMessage 'Installation in Progress...' -WindowLocation 'BottomRight' -TopMost $false + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$StatusMessage = $configProgressMessageInstall, - [Parameter(Mandatory=$false)] - [ValidateSet('Default','BottomRight')] - [string]$WindowLocation = 'Default', - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$TopMost = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - If ($deployModeSilent) { Return } - - ## If the default progress message hasn't been overridden and the deployment type is uninstall, use the default uninstallation message - If (($StatusMessage -eq $configProgressMessageInstall) -and ($deploymentType -eq 'Uninstall')) { - $StatusMessage = $configProgressMessageUninstall - } - - If ($envHost.Name -match 'PowerGUI') { - Write-Log -Message "$($envHost.Name) is not a supported host for WPF multi-threading. Progress dialog with message [$statusMessage] will not be displayed." -Severity 2 -Source ${CmdletName} - Return - } - - ## Check if the progress thread is running before invoking methods on it - If ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -ne 'Running') { - # Notify user that the software installation has started - $balloonText = "$deploymentTypeName $configBalloonTextStart" - Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText $balloonText - # Create a synchronized hashtable to share objects between runspaces - $script:ProgressSyncHash = [hashtable]::Synchronized(@{ }) - # Create a new runspace for the progress bar - $script:ProgressRunspace = [runspacefactory]::CreateRunspace() - $script:ProgressRunspace.ApartmentState = 'STA' - $script:ProgressRunspace.ThreadOptions = 'ReuseThread' - $script:ProgressRunspace.Open() - # Add the sync hash to the runspace - $script:ProgressRunspace.SessionStateProxy.SetVariable('progressSyncHash', $script:ProgressSyncHash) - # Add other variables from the parent thread required in the progress runspace - $script:ProgressRunspace.SessionStateProxy.SetVariable('installTitle', $installTitle) - $script:ProgressRunspace.SessionStateProxy.SetVariable('windowLocation', $windowLocation) - $script:ProgressRunspace.SessionStateProxy.SetVariable('topMost', $topMost.ToString()) - $script:ProgressRunspace.SessionStateProxy.SetVariable('appDeployLogoBanner', $appDeployLogoBanner) - $script:ProgressRunspace.SessionStateProxy.SetVariable('progressStatusMessage', $statusMessage) - $script:ProgressRunspace.SessionStateProxy.SetVariable('AppDeployLogoIcon', $AppDeployLogoIcon) - $script:ProgressRunspace.SessionStateProxy.SetVariable('dpiScale', $dpiScale) - - # Add the script block to be executed in the progress runspace - $progressCmd = [PowerShell]::Create().AddScript({ - [Xml.XmlDocument]$xamlProgress = @' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$StatusMessage = $configProgressMessageInstall, + [Parameter(Mandatory = $false)] + [ValidateSet('Default', 'BottomRight', 'TopCenter')] + [String]$WindowLocation = 'Default', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($deployModeSilent) { + Write-Log -Message "Bypassing Show-InstallationProgress [Mode: $deployMode]. Status message:$StatusMessage" -Source ${CmdletName} + Return + } + + ## If the default progress message hasn't been overridden and the deployment type is uninstall, use the default uninstallation message + If ($StatusMessage -eq $configProgressMessageInstall) { + If ($deploymentType -eq 'Uninstall') { + $StatusMessage = $configProgressMessageUninstall + } + ElseIf ($deploymentType -eq 'Repair') { + $StatusMessage = $configProgressMessageRepair + } + } + + If ($envHost.Name -match 'PowerGUI') { + Write-Log -Message "$($envHost.Name) is not a supported host for WPF multi-threading. Progress dialog with message [$statusMessage] will not be displayed." -Severity 2 -Source ${CmdletName} + Return + } + + ## Check if the progress thread is running before invoking methods on it + If ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -ne 'Running') { + # Notify user that the software installation has started + $balloonText = "$deploymentTypeName $configBalloonTextStart" + Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText $balloonText + # Create a synchronized hashtable to share objects between runspaces + $script:ProgressSyncHash = [Hashtable]::Synchronized(@{ }) + # Create a new runspace for the progress bar + $script:ProgressRunspace = [runspacefactory]::CreateRunspace() + $script:ProgressRunspace.ApartmentState = 'STA' + $script:ProgressRunspace.ThreadOptions = 'ReuseThread' + $script:ProgressRunspace.Open() + # Add the sync hash to the runspace + $script:ProgressRunspace.SessionStateProxy.SetVariable('progressSyncHash', $script:ProgressSyncHash) + # Add other variables from the parent thread required in the progress runspace + $script:ProgressRunspace.SessionStateProxy.SetVariable('installTitle', $installTitle) + $script:ProgressRunspace.SessionStateProxy.SetVariable('windowLocation', $windowLocation) + $script:ProgressRunspace.SessionStateProxy.SetVariable('topMost', $topMost.ToString()) + $script:ProgressRunspace.SessionStateProxy.SetVariable('appDeployLogoBanner', $appDeployLogoBanner) + $script:ProgressRunspace.SessionStateProxy.SetVariable('ProgressStatusMessage', $statusMessage) + $script:ProgressRunspace.SessionStateProxy.SetVariable('AppDeployLogoIcon', $AppDeployLogoIcon) + + # Add the script block to be executed in the progress runspace + $progressCmd = [PowerShell]::Create().AddScript({ + [String]$xamlProgressString = @' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '@ - - ## Set the configurable values using variables added to the runspace from the parent thread - # Calculate the position on the screen where the progress dialog should be placed - $screen = [Windows.Forms.Screen]::PrimaryScreen - $screenWorkingArea = $screen.WorkingArea - [int32]$screenWidth = $screenWorkingArea | Select-Object -ExpandProperty 'Width' - [int32]$screenHeight = $screenWorkingArea | Select-Object -ExpandProperty 'Height' - # Set the start position of the Window based on the screen size - If ($windowLocation -eq 'BottomRight') { - $xamlProgress.Window.Left = [string](($screenWidth / ($dpiscale / 100)) - ($xamlProgress.Window.Width)) - $xamlProgress.Window.Top = [string](($screenHeight / ($dpiscale / 100)) - ($xamlProgress.Window.Height)) - } - # Show the default location (Top center) - Else { - # Center the progress window by calculating the center of the workable screen based on the width of the screen relative to the DPI scale minus half the width of the progress bar - $xamlProgress.Window.Left = [string](($screenWidth / (2 * ($dpiscale / 100) )) - (($xamlProgress.Window.Width / 2))) - $xamlProgress.Window.Top = [string]($screenHeight / 9.5) - } - $xamlProgress.Window.TopMost = $topMost - $xamlProgress.Window.Icon = $AppDeployLogoIcon - $xamlProgress.Window.Grid.Image.Source = $appDeployLogoBanner - $xamlProgress.Window.Grid.TextBlock.Text = $ProgressStatusMessage - $xamlProgress.Window.Title = $installTitle - # Parse the XAML - $progressReader = New-Object -TypeName 'System.Xml.XmlNodeReader' -ArgumentList $xamlProgress - $script:ProgressSyncHash.Window = [Windows.Markup.XamlReader]::Load($progressReader) - $script:ProgressSyncHash.ProgressText = $script:ProgressSyncHash.Window.FindName('ProgressText') - # Add an action to the Window.Closing event handler to disable the close button - $script:ProgressSyncHash.Window.Add_Closing({ $_.Cancel = $true }) - # Allow the window to be dragged by clicking on it anywhere - $script:ProgressSyncHash.Window.Add_MouseLeftButtonDown({ $script:ProgressSyncHash.Window.DragMove() }) - # Add a tooltip - $script:ProgressSyncHash.Window.ToolTip = $installTitle - $null = $script:ProgressSyncHash.Window.ShowDialog() - $script:ProgressSyncHash.Error = $Error - }) - - $progressCmd.Runspace = $script:ProgressRunspace - Write-Log -Message "Spin up progress dialog in a separate thread with message: [$statusMessage]." -Source ${CmdletName} - # Invoke the progress runspace - $progressData = $progressCmd.BeginInvoke() - # Allow the thread to be spun up safely before invoking actions against it. - Start-Sleep -Seconds 1 - If ($script:ProgressSyncHash.Error) { - Write-Log -Message "Failure while displaying progress dialog. `n$(Resolve-Error -ErrorRecord $script:ProgressSyncHash.Error)" -Severity 3 -Source ${CmdletName} - } - } - ## Check if the progress thread is running before invoking methods on it - ElseIf ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -eq 'Running') { - # Update the progress text - Try { - $script:ProgressSyncHash.Window.Dispatcher.Invoke([Windows.Threading.DispatcherPriority]'Send', [Windows.Input.InputEventHandler]{ $script:ProgressSyncHash.ProgressText.Text = $statusMessage }, $null, $null) - Write-Log -Message "Updated progress message: [$statusMessage]." -Source ${CmdletName} - } - Catch { - Write-Log -Message "Unable to update the progress message. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [Xml.XmlDocument]$xamlProgress = New-Object -TypeName 'System.Xml.XmlDocument' + $xamlProgress.LoadXml($xamlProgressString) + ## Set the configurable values using variables added to the runspace from the parent thread + $xamlProgress.Window.TopMost = $topMost + $xamlProgress.Window.Icon = $AppDeployLogoIcon + $xamlProgress.Window.Grid.Image.Source = $appDeployLogoBanner + $xamlProgress.Window.Grid.TextBlock.Text = $ProgressStatusMessage + $xamlProgress.Window.Title = $installTitle + # Parse the XAML + $progressReader = New-Object -TypeName 'System.Xml.XmlNodeReader' -ArgumentList ($xamlProgress) + $script:ProgressSyncHash.Window = [Windows.Markup.XamlReader]::Load($progressReader) + # Grey out the X button + $script:ProgressSyncHash.Window.add_Loaded({ + # Calculate the position on the screen where the progress dialog should be placed + [Int32]$screenWidth = [System.Windows.SystemParameters]::WorkArea.Width + [Int32]$screenHeight = [System.Windows.SystemParameters]::WorkArea.Height + [Int32]$script:screenCenterWidth = $screenWidth - $script:ProgressSyncHash.Window.ActualWidth + [Int32]$script:screenCenterHeight = $screenHeight - $script:ProgressSyncHash.Window.ActualHeight + # Set the start position of the Window based on the screen size + If ($windowLocation -eq 'BottomRight') { + $script:ProgressSyncHash.Window.Left = [Double]($screenCenterWidth) + $script:ProgressSyncHash.Window.Top = [Double]($screenCenterHeight - 100) #-100 Needed to not overlap system tray Toasts + } + ElseIf ($windowLocation -eq 'TopCenter') { + $script:ProgressSyncHash.Window.Left = [Double]($screenCenterWidth / 2) + $script:ProgressSyncHash.Window.Top = [Double]($screenCenterHeight / 6) + } + Else { + # Center the progress window by calculating the center of the workable screen based on the width of the screen minus half the width of the progress bar + $script:ProgressSyncHash.Window.Left = [Double]($screenCenterWidth / 2) + $script:ProgressSyncHash.Window.Top = [Double]($screenCenterHeight / 2) + } + # Disable the X button + Try { + $windowHandle = (New-Object -TypeName System.Windows.Interop.WindowInteropHelper -ArgumentList ($this)).Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the close button + Write-Log 'Failed to disable the Close button.' -Severity 2 -Source ${CmdletName} + } + }) + # Prepare the ProgressText variable so we can use it to change the text in the text area + $script:ProgressSyncHash.ProgressText = $script:ProgressSyncHash.Window.FindName('ProgressText') + # Add an action to the Window.Closing event handler to disable the close button + $script:ProgressSyncHash.Window.Add_Closing({ $_.Cancel = $true }) + # Allow the window to be dragged by clicking on it anywhere + $script:ProgressSyncHash.Window.Add_MouseLeftButtonDown({ $script:ProgressSyncHash.Window.DragMove() }) + # Add a tooltip + $script:ProgressSyncHash.Window.ToolTip = $installTitle + $null = $script:ProgressSyncHash.Window.ShowDialog() + $script:ProgressSyncHash.Error = $Error + }) + + $progressCmd.Runspace = $script:ProgressRunspace + Write-Log -Message "Creating the progress dialog in a separate thread with message: [$statusMessage]." -Source ${CmdletName} + # Invoke the progress runspace + $null = $progressCmd.BeginInvoke() + # Allow the thread to be spun up safely before invoking actions against it. + Start-Sleep -Seconds 1 + If ($script:ProgressSyncHash.Error) { + Write-Log -Message "Failure while displaying progress dialog. `r`n$(Resolve-Error -ErrorRecord $script:ProgressSyncHash.Error)" -Severity 3 -Source ${CmdletName} + } + } + ## Check if the progress thread is running before invoking methods on it + ElseIf ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -eq 'Running') { + Try { + # Update the progress text + $script:ProgressSyncHash.Window.Dispatcher.Invoke([Windows.Threading.DispatcherPriority]::Send, [Windows.Input.InputEventHandler] { $script:ProgressSyncHash.ProgressText.Text = $statusMessage }, $null, $null) + # Calculate the position on the screen where the progress dialog should be placed + $script:ProgressSyncHash.Window.Dispatcher.Invoke([Windows.Threading.DispatcherPriority]::Send, [Windows.Input.InputEventHandler] { + [Int32]$screenWidth = [System.Windows.SystemParameters]::WorkArea.Width + [Int32]$screenHeight = [System.Windows.SystemParameters]::WorkArea.Height + # Set the start position of the Window based on the screen size + If ($windowLocation -eq 'BottomRight') { + # Put the window in the corner + $script:ProgressSyncHash.Window.Left = ($screenWidth - $script:ProgressSyncHash.Window.ActualWidth) + $script:ProgressSyncHash.Window.Top = ($screenHeight - $script:ProgressSyncHash.Window.ActualHeight - 100) #-100 Needed to not overlap system tray Toasts + } + ElseIf ($windowLocation -eq 'TopCenter') { + $script:ProgressSyncHash.Window.Left = [Double](($screenWidth - $script:ProgressSyncHash.Window.ActualWidth) / 2) + $script:ProgressSyncHash.Window.Top = [Double](($screenHeight - $script:ProgressSyncHash.Window.ActualHeight) / 6) + } + Else { + # Center the progress window by calculating the center of the workable screen based on the width of the screen minus half the width of the progress bar + $script:ProgressSyncHash.Window.Left = [Double](($screenWidth - $script:ProgressSyncHash.Window.ActualWidth) / 2) + $script:ProgressSyncHash.Window.Top = [Double](($screenHeight - $script:ProgressSyncHash.Window.ActualHeight) / 2) + } + }, $null, $null) + + Write-Log -Message "Updated the progress message: [$statusMessage]." -Source ${CmdletName} + } + Catch { + Write-Log -Message "Unable to update the progress message. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Close-InstallationProgress Function Close-InstallationProgress { -<# + <# .SYNOPSIS - Closes the dialog created by Show-InstallationProgress. + +Closes the dialog created by Show-InstallationProgress. + .DESCRIPTION - Closes the dialog created by Show-InstallationProgress. - This function is called by the Exit-Script function to close a running instance of the progress dialog if found. + +Closes the dialog created by Show-InstallationProgress. + +This function is called by the Exit-Script function to close a running instance of the progress dialog if found. + +.PARAMETER WaitingTime + +How many seconds to wait, at most, for the InstallationProgress window to be initialized, before the function returns, without closing anything. Range: 1 - 60 Default: 5 + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + .EXAMPLE - Close-InstallationProgress + +Close-InstallationProgress + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - If ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -eq 'Running') { - ## Close the progress thread - Write-Log -Message 'Close the installation progress dialog.' -Source ${CmdletName} - $script:ProgressSyncHash.Window.Dispatcher.InvokeShutdown() - $script:ProgressSyncHash.Clear() - $script:ProgressRunspace.Close() - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateRange(1, 60)] + [Int32]$WaitingTime = 5 + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($deployModeSilent) { + Write-Log -Message "Bypassing Close-InstallationProgress [Mode: $deployMode]" -Source ${CmdletName} + Return + } + # Check whether the window has been created and wait for up to $WaitingTime seconds if it does not + [Int32]$Timeout = $WaitingTime + While ((-not $script:ProgressSyncHash.Window.IsInitialized) -and ($Timeout -gt 0)) { + If ($Timeout -eq $WaitingTime) { + Write-Log -Message "The installation progress dialog does not exist. Waiting up to $WaitingTime seconds..." -Source ${CmdletName} + } + $Timeout -= 1 + Start-Sleep -Seconds 1 + } + # Return if we still have no window + If (-not $script:ProgressSyncHash.Window.IsInitialized) { + Write-Log -Message "The installation progress dialog was not created within $WaitingTime seconds." -Source ${CmdletName} -Severity 2 + Return + } + # If the thread is suspended, resume it + If ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Suspended) { + Write-Log -Message 'The thread for the installation progress dialog is suspended. Resuming the thread.' -Source ${CmdletName} + Try { + $script:ProgressSyncHash.Window.Dispatcher.Thread.Resume() + } + Catch { + Write-Log -Message 'Failed to resume the thread for the installation progress dialog.' -Source ${CmdletName} -Severity 2 + } + } + # If the thread is changing its state, wait + [Int32]$Timeout = 0 + While ((($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Aborted) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::AbortRequested) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::StopRequested) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Unstarted) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::WaitSleepJoin)) -and ($Timeout -le $WaitingTime)) { + If (-not $Timeout) { + Write-Log -Message "The thread for the installation progress dialog is changing its state. Waiting up to $WaitingTime seconds..." -Source ${CmdletName} -Severity 2 + } + $Timeout += 1 + Start-Sleep -Seconds 1 + } + # If the thread is running, stop it + If ((-not ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Stopped)) -and (-not ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Unstarted))) { + Write-Log -Message 'Closing the installation progress dialog.' -Source ${CmdletName} + $script:ProgressSyncHash.Window.Dispatcher.InvokeShutdown() + } + + If ($script:ProgressRunspace) { + # If the runspace is still opening, wait + [Int32]$Timeout = 0 + While ((($script:ProgressRunspace.RunspaceStateInfo.State -eq [System.Management.Automation.Runspaces.RunspaceState]::Opening) -or ($script:ProgressRunspace.RunspaceStateInfo.State -eq [System.Management.Automation.Runspaces.RunspaceState]::BeforeOpen)) -and ($Timeout -le $WaitingTime)) { + If (-not $Timeout) { + Write-Log -Message "The runspace for the installation progress dialog is still opening. Waiting up to $WaitingTime seconds..." -Source ${CmdletName} -Severity 2 + } + $Timeout += 1 + Start-Sleep -Seconds 1 + } + # If the runspace is opened, close it + If ($script:ProgressRunspace.RunspaceStateInfo.State -eq [System.Management.Automation.Runspaces.RunspaceState]::Opened) { + Write-Log -Message "Closing the installation progress dialog`'s runspace." -Source ${CmdletName} + $script:ProgressRunspace.Close() + } + } + Else { + Write-Log -Message 'The runspace for the installation progress dialog is already closed.' -Source ${CmdletName} -Severity 2 + } + + If ($script:ProgressSyncHash) { + # Clear sync hash + $script:ProgressSyncHash.Clear() + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-PinnedApplication Function Set-PinnedApplication { -<# + <# .SYNOPSIS - Pins or unpins a shortcut to the start menu or task bar. + +Pins or unpins a shortcut to the start menu or task bar. + .DESCRIPTION - Pins or unpins a shortcut to the start menu or task bar. - This should typically be run in the user context, as pinned items are stored in the user profile. + +Pins or unpins a shortcut to the start menu or task bar. + +This should typically be run in the user context, as pinned items are stored in the user profile. + .PARAMETER Action - Action to be performed. Options: 'PintoStartMenu','UnpinfromStartMenu','PintoTaskbar','UnpinfromTaskbar'. + +Action to be performed. Options: 'PinToStartMenu','UnpinFromStartMenu','PinToTaskbar','UnpinFromTaskbar'. + .PARAMETER FilePath - Path to the shortcut file to be pinned or unpinned. + +Path to the shortcut file to be pinned or unpinned. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Set-PinnedApplication -Action 'PintoStartMenu' -FilePath "$envProgramFilesX86\IBM\Lotus\Notes\notes.exe" + +Set-PinnedApplication -Action 'PinToStartMenu' -FilePath "$envProgramFilesX86\IBM\Lotus\Notes\notes.exe" + .EXAMPLE - Set-PinnedApplication -Action 'UnpinfromTaskbar' -FilePath "$envProgramFilesX86\IBM\Lotus\Notes\notes.exe" + +Set-PinnedApplication -Action 'UnpinFromTaskbar' -FilePath "$envProgramFilesX86\IBM\Lotus\Notes\notes.exe" + .NOTES + +Windows 10 logic borrowed from Stuart Pearson (https://pinto10blog.wordpress.com/2016/09/10/pinto10/) + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateSet('PintoStartMenu','UnpinfromStartMenu','PintoTaskbar','UnpinfromTaskbar')] - [string]$Action, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$FilePath - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - #region Function Get-PinVerb - Function Get-PinVerb { - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [int32]$VerbId - ) - - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - Write-Log -Message "Get localized pin verb for verb id [$VerbID]." -Source ${CmdletName} - [string]$PinVerb = [PSADT.FileVerb]::GetPinVerb($VerbId) - Write-Log -Message "Verb ID [$VerbID] has a localized pin verb of [$PinVerb]." -Source ${CmdletName} - Write-Output -InputObject $PinVerb - } - #endregion - - #region Function Invoke-Verb - Function Invoke-Verb { - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$FilePath, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Verb - ) - - Try { - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - $verb = $verb.Replace('&','') - $path = Split-Path -Path $FilePath -Parent -ErrorAction 'Stop' - $folder = $shellApp.Namespace($path) - $item = $folder.ParseName((Split-Path -Path $FilePath -Leaf -ErrorAction 'Stop')) - $itemVerb = $item.Verbs() | Where-Object { $_.Name.Replace('&','') -eq $verb } -ErrorAction 'Stop' - - If ($null -eq $itemVerb) { - Write-Log -Message "Performing action [$verb] is not programmatically supported for this file [$FilePath]." -Severity 2 -Source ${CmdletName} - } - Else { - Write-Log -Message "Perform action [$verb] on [$FilePath]." -Source ${CmdletName} - $itemVerb.DoIt() - } - } - Catch { - Write-Log -Message "Failed to perform action [$verb] on [$FilePath]. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - #endregion - - If (([version]$envOSVersion).Major -ge 10) { - Write-Log -Message "Detected Windows 10 or higher, using Windows 10 verb codes." -Source ${CmdletName} - [hashtable]$Verbs = @{ - 'PintoStartMenu' = 51201 - 'UnpinfromStartMenu' = 51394 - 'PintoTaskbar' = 5386 - 'UnpinfromTaskbar' = 5387 - } - } - Else { - [hashtable]$Verbs = @{ - 'PintoStartMenu' = 5381 - 'UnpinfromStartMenu' = 5382 - 'PintoTaskbar' = 5386 - 'UnpinfromTaskbar' = 5387 - } - } - - } - Process { - Try { - Write-Log -Message "Execute action [$Action] for file [$FilePath]." -Source ${CmdletName} - - If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf' -ErrorAction 'Stop')) { - Throw "Path [$filePath] does not exist." - } - - If (-not ($Verbs.$Action)) { - Throw "Action [$Action] not supported. Supported actions are [$($Verbs.Keys -join ', ')]." - } - - [string]$PinVerbAction = Get-PinVerb -VerbId $Verbs.$Action - If (-not ($PinVerbAction)) { - Throw "Failed to get a localized pin verb for action [$Action]. Action is not supported on this operating system." - } - - Invoke-Verb -FilePath $FilePath -Verb $PinVerbAction - } - Catch { - Write-Log -Message "Failed to execute action [$Action]. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateSet('PinToStartMenu', 'UnpinFromStartMenu', 'PinToTaskbar', 'UnpinFromTaskbar')] + [String]$Action, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + #region Function Get-PinVerb + Function Get-PinVerb { + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [Int32]$VerbId + ) + + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-Log -Message "Get localized pin verb for verb id [$VerbID]." -Source ${CmdletName} + [String]$PinVerb = [PSADT.FileVerb]::GetPinVerb($VerbId) + Write-Log -Message "Verb ID [$VerbID] has a localized pin verb of [$PinVerb]." -Source ${CmdletName} + Write-Output -InputObject ($PinVerb) + } + #endregion + + #region Function Invoke-Verb + Function Invoke-Verb { + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Verb + ) + + Try { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + $Verb = $Verb.Replace('&', '') + $path = Split-Path -Path $FilePath -Parent -ErrorAction 'Stop' + $folder = $shellApp.Namespace($path) + $item = $folder.ParseName((Split-Path -Path $FilePath -Leaf -ErrorAction 'Stop')) + $itemVerb = $item.Verbs() | Where-Object { $_.Name.Replace('&', '') -eq $Verb } -ErrorAction 'Stop' + + If ($null -eq $itemVerb) { + Write-Log -Message "Performing action [$Verb] is not programmatically supported for this file [$FilePath]." -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message "Performing action [$Verb] on [$FilePath]." -Source ${CmdletName} + $itemVerb.DoIt() + } + } + Catch { + Write-Log -Message "Failed to perform action [$Verb] on [$FilePath]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + #endregion + + If (([Version]$envOSVersion).Major -ge 10) { + Write-Log -Message 'Detected Windows 10 or higher, using Windows 10 verb codes.' -Source ${CmdletName} + [Hashtable]$Verbs = @{ + 'PinToStartMenu' = 51201 + 'UnpinFromStartMenu' = 51394 + 'PinToTaskbar' = 5386 + 'UnpinFromTaskbar' = 5387 + } + } + Else { + [Hashtable]$Verbs = @{ + 'PinToStartMenu' = 5381 + 'UnpinFromStartMenu' = 5382 + 'PinToTaskbar' = 5386 + 'UnpinFromTaskbar' = 5387 + } + } + + } + Process { + Try { + Write-Log -Message "Execute action [$Action] for file [$FilePath]." -Source ${CmdletName} + + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf' -ErrorAction 'Stop')) { + Throw "Path [$filePath] does not exist." + } + + If (-not ($Verbs.$Action)) { + Throw "Action [$Action] not supported. Supported actions are [$($Verbs.Keys -join ', ')]." + } + + If ($Action.Contains('StartMenu')) { + If ([Int32]$envOSVersionMajor -ge 10) { + If ((Get-Item -Path $FilePath).Extension -ne '.lnk') { + Throw 'Only shortcut files (.lnk) are supported on Windows 10 and higher.' + } + ElseIf (-not ($FilePath.StartsWith($envUserStartMenu, 'OrdinalIgnoreCase') -or $FilePath.StartsWith($envCommonStartMenu, 'OrdinalIgnoreCase'))) { + Throw "Only shortcut files (.lnk) in [$envUserStartMenu] and [$envCommonStartMenu] are supported on Windows 10 and higher." + } + } + + [String]$PinVerbAction = Get-PinVerb -VerbId ($Verbs.$Action) + If (-not $PinVerbAction) { + Throw "Failed to get a localized pin verb for action [$Action]. Action is not supported on this operating system." + } + + Invoke-Verb -FilePath $FilePath -Verb $PinVerbAction + } + ElseIf ($Action.Contains('Taskbar')) { + If ([Int32]$envOSVersionMajor -ge 10) { + $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($FilePath) + $PinExists = Test-Path -Path "$envAppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\$($FileNameWithoutExtension).lnk" + + If (($Action -eq 'PinToTaskbar') -and ($PinExists)) { + If ($(Invoke-ObjectMethod -InputObject $Shell -MethodName 'CreateShortcut' -ArgumentList "$envAppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\$($FileNameWithoutExtension).lnk").TargetPath -eq $FilePath) { + Write-Log -Message "Pin [$FileNameWithoutExtension] already exists." -Source ${CmdletName} + Return + } + } + ElseIf (($Action -eq 'UnpinFromTaskbar') -and ($PinExists -eq $false)) { + Write-Log -Message "Pin [$FileNameWithoutExtension] does not exist." -Source ${CmdletName} + Return + } + + $ExplorerCommandHandler = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.taskbarpin' -Value 'ExplorerCommandHandler' + $classesStarKey = (Get-Item "Registry::HKEY_USERS\$($RunasActiveUser.SID)\SOFTWARE\Classes").OpenSubKey('*', $true) + $shellKey = $classesStarKey.CreateSubKey('shell', $true) + $specialKey = $shellKey.CreateSubKey('{:}', $true) + $specialKey.SetValue('ExplorerCommandHandler', $ExplorerCommandHandler) + + $Folder = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'Namespace' -ArgumentList $(Split-Path -Path $FilePath -Parent) + $Item = Invoke-ObjectMethod -InputObject $Folder -MethodName 'ParseName' -ArgumentList $(Split-Path -Path $FilePath -Leaf) + + $Item.InvokeVerb('{:}') + + $shellKey.DeleteSubKey('{:}') + If ($shellKey.SubKeyCount -eq 0 -and $shellKey.ValueCount -eq 0) { + $classesStarKey.DeleteSubKey('shell') + } + } + Else { + [String]$PinVerbAction = Get-PinVerb -VerbId ($Verbs.$Action) + If (-not $PinVerbAction) { + Throw "Failed to get a localized pin verb for action [$Action]. Action is not supported on this operating system." + } + + Invoke-Verb -FilePath $FilePath -Verb $PinVerbAction + } + } + } + Catch { + Write-Log -Message "Failed to execute action [$Action]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + Finally { + Try { + If ($shellKey) { + $shellKey.Close() + } + } + Catch { + } + Try { + If ($classesStarKey) { + $classesStarKey.Close() + } + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-IniValue Function Get-IniValue { -<# + <# .SYNOPSIS - Parses an INI file and returns the value of the specified section and key. + +Parses an INI file and returns the value of the specified section and key. + .DESCRIPTION - Parses an INI file and returns the value of the specified section and key. + +Parses an INI file and returns the value of the specified section and key. + .PARAMETER FilePath - Path to the INI file. + +Path to the INI file. + .PARAMETER Section - Section within the INI file. + +Section within the INI file. + .PARAMETER Key - Key within the section of the INI file. + +Key within the section of the INI file. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the value of the specified section and key. + .EXAMPLE - Get-IniValue -FilePath "$envProgramFilesX86\IBM\Notes\notes.ini" -Section 'Notes' -Key 'KeyFileName' + +Get-IniValue -FilePath "$envProgramFilesX86\IBM\Notes\notes.ini" -Section 'Notes' -Key 'KeyFileName' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$FilePath, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Section, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Key, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Read INI Key: [Section = $Section] [Key = $Key]." -Source ${CmdletName} - - If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { Throw "File [$filePath] could not be found." } - - $IniValue = [PSADT.IniFile]::GetIniValue($Section, $Key, $FilePath) - Write-Log -Message "INI Key Value: [Section = $Section] [Key = $Key] [Value = $IniValue]." -Source ${CmdletName} - - Write-Output -InputObject $IniValue - } - Catch { - Write-Log -Message "Failed to read INI file key value. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to read INI file key value: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Section, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Reading INI Key: [Section = $Section] [Key = $Key]." -Source ${CmdletName} + + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { + Throw "File [$filePath] could not be found." + } + + $IniValue = [PSADT.IniFile]::GetIniValue($Section, $Key, $FilePath) + Write-Log -Message "INI Key Value: [Section = $Section] [Key = $Key] [Value = $IniValue]." -Source ${CmdletName} + + Write-Output -InputObject ($IniValue) + } + Catch { + Write-Log -Message "Failed to read INI file key value. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read INI file key value: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-IniValue Function Set-IniValue { -<# + <# .SYNOPSIS - Opens an INI file and sets the value of the specified section and key. + +Opens an INI file and sets the value of the specified section and key. + .DESCRIPTION - Opens an INI file and sets the value of the specified section and key. + +Opens an INI file and sets the value of the specified section and key. + .PARAMETER FilePath - Path to the INI file. + +Path to the INI file. + .PARAMETER Section - Section within the INI file. + +Section within the INI file. + .PARAMETER Key - Key within the section of the INI file. + +Key within the section of the INI file. + .PARAMETER Value - Value for the key within the section of the INI file. To remove a value, set this variable to $null. + +Value for the key within the section of the INI file. To remove a value, set this variable to $null. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any output. + .EXAMPLE - Set-IniValue -FilePath "$envProgramFilesX86\IBM\Notes\notes.ini" -Section 'Notes' -Key 'KeyFileName' -Value 'MyFile.ID' + +Set-IniValue -FilePath "$envProgramFilesX86\IBM\Notes\notes.ini" -Section 'Notes' -Key 'KeyFileName' -Value 'MyFile.ID' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$FilePath, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Section, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Key, - # Don't strongly type this variable as [string] b/c PowerShell replaces [string]$Value = $null with an empty string - [Parameter(Mandatory=$true)] - [AllowNull()] - $Value, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Write INI Key Value: [Section = $Section] [Key = $Key] [Value = $Value]." -Source ${CmdletName} - - If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { Throw "File [$filePath] could not be found." } - - [PSADT.IniFile]::SetIniValue($Section, $Key, ([Text.StringBuilder]$Value), $FilePath) - } - Catch { - Write-Log -Message "Failed to write INI file key value. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to write INI file key value: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Section, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + # Don't strongly type this variable as [String] b/c PowerShell replaces [String]$Value = $null with an empty string + [Parameter(Mandatory = $true)] + [AllowNull()] + $Value, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Writing INI Key Value: [Section = $Section] [Key = $Key] [Value = $Value]." -Source ${CmdletName} + + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { + Throw "File [$filePath] could not be found." + } + + [PSADT.IniFile]::SetIniValue($Section, $Key, ([Text.StringBuilder]$Value), $FilePath) + } + Catch { + Write-Log -Message "Failed to write INI file key value. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to write INI file key value: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-PEFileArchitecture Function Get-PEFileArchitecture { -<# + <# .SYNOPSIS - Determine if a PE file is a 32-bit or a 64-bit file. + +Determine if a PE file is a 32-bit or a 64-bit file. + .DESCRIPTION - Determine if a PE file is a 32-bit or a 64-bit file by examining the file's image file header. - PE file extensions: .exe, .dll, .ocx, .drv, .sys, .scr, .efi, .cpl, .fon + +Determine if a PE file is a 32-bit or a 64-bit file by examining the file's image file header. + +PE file extensions: .exe, .dll, .ocx, .drv, .sys, .scr, .efi, .cpl, .fon + .PARAMETER FilePath - Path to the PE file to examine. + +Path to the PE file to examine. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + .PARAMETER PassThru - Get the file object, attach a property indicating the file binary type, and write to pipeline + +Get the file object, attach a property indicating the file binary type, and write to pipeline + +.INPUTS + +System.IO.FileInfo. + +Accepts a FileInfo object from the pipeline. + +.OUTPUTS + +System.String + +Returns a string indicating the file binary type. + .EXAMPLE - Get-PEFileArchitecture -FilePath "$env:windir\notepad.exe" + +Get-PEFileArchitecture -FilePath "$env:windir\notepad.exe" + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK + #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] - [IO.FileInfo[]]$FilePath, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true, - [Parameter(Mandatory=$false)] - [switch]$PassThru - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - [string[]]$PEFileExtensions = '.exe', '.dll', '.ocx', '.drv', '.sys', '.scr', '.efi', '.cpl', '.fon' - [int32]$MACHINE_OFFSET = 4 - [int32]$PE_POINTER_OFFSET = 60 - } - Process { - ForEach ($Path in $filePath) { - Try { - If ($PEFileExtensions -notcontains $Path.Extension) { - Throw "Invalid file type. Please specify one of the following PE file types: $($PEFileExtensions -join ', ')" - } - - [byte[]]$data = New-Object -TypeName 'System.Byte[]' -ArgumentList 4096 - $stream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($Path.FullName, 'Open', 'Read') - $null = $stream.Read($data, 0, 4096) - $stream.Flush() - $stream.Close() - - [int32]$PE_HEADER_ADDR = [BitConverter]::ToInt32($data, $PE_POINTER_OFFSET) - [uint16]$PE_IMAGE_FILE_HEADER = [BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET) - Switch ($PE_IMAGE_FILE_HEADER) { - 0 { $PEArchitecture = 'Native' } # The contents of this file are assumed to be applicable to any machine type - 0x014c { $PEArchitecture = '32BIT' } # File for Windows 32-bit systems - 0x0200 { $PEArchitecture = 'Itanium-x64' } # File for Intel Itanium x64 processor family - 0x8664 { $PEArchitecture = '64BIT' } # File for Windows 64-bit systems - Default { $PEArchitecture = 'Unknown' } - } - Write-Log -Message "File [$($Path.FullName)] has a detected file architecture of [$PEArchitecture]." -Source ${CmdletName} - - If ($PassThru) { - # Get the file object, attach a property indicating the type, and write to pipeline - Get-Item -LiteralPath $Path.FullName -Force | Add-Member -MemberType 'NoteProperty' -Name 'BinaryType' -Value $PEArchitecture -Force -PassThru | Write-Output - } - Else { - Write-Output -InputObject $PEArchitecture - } - } - Catch { - Write-Log -Message "Failed to get the PE file architecture. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to get the PE file architecture: $($_.Exception.Message)" - } - Continue - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [IO.FileInfo[]]$FilePath, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true, + [Parameter(Mandatory = $false)] + [Switch]$PassThru + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [String[]]$PEFileExtensions = '.exe', '.dll', '.ocx', '.drv', '.sys', '.scr', '.efi', '.cpl', '.fon' + [Int32]$MACHINE_OFFSET = 4 + [Int32]$PE_POINTER_OFFSET = 60 + } + Process { + ForEach ($Path in $filePath) { + Try { + If ($PEFileExtensions -notcontains $Path.Extension) { + Throw "Invalid file type. Please specify one of the following PE file types: $($PEFileExtensions -join ', ')" + } + + [Byte[]]$data = New-Object -TypeName 'System.Byte[]' -ArgumentList (4096) + $stream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($Path.FullName, 'Open', 'Read') + $null = $stream.Read($data, 0, 4096) + $stream.Flush() + $stream.Close() + + [Int32]$PE_HEADER_ADDR = [BitConverter]::ToInt32($data, $PE_POINTER_OFFSET) + [UInt16]$PE_IMAGE_FILE_HEADER = [BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET) + Switch ($PE_IMAGE_FILE_HEADER) { + 0 { + $PEArchitecture = 'Native' + } # The contents of this file are assumed to be applicable to any machine type + 0x014c { + $PEArchitecture = '32BIT' + } # File for Windows 32-bit systems + 0x0200 { + $PEArchitecture = 'Itanium-x64' + } # File for Intel Itanium x64 processor family + 0x8664 { + $PEArchitecture = '64BIT' + } # File for Windows 64-bit systems + Default { + $PEArchitecture = 'Unknown' + } + } + Write-Log -Message "File [$($Path.FullName)] has a detected file architecture of [$PEArchitecture]." -Source ${CmdletName} + + If ($PassThru) { + # Get the file object, attach a property indicating the type, and write to pipeline + Get-Item -LiteralPath $Path.FullName -Force | Add-Member -MemberType 'NoteProperty' -Name 'BinaryType' -Value $PEArchitecture -Force -PassThru | Write-Output + } + Else { + Write-Output -InputObject ($PEArchitecture) + } + } + Catch { + Write-Log -Message "Failed to get the PE file architecture. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to get the PE file architecture: $($_.Exception.Message)" + } + Continue + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Invoke-RegisterOrUnregisterDLL Function Invoke-RegisterOrUnregisterDLL { -<# + <# .SYNOPSIS - Register or unregister a DLL file. + +Register or unregister a DLL file. + .DESCRIPTION - Register or unregister a DLL file using regsvr32.exe. Function can be invoked using alias: 'Register-DLL' or 'Unregister-DLL'. + +Register or unregister a DLL file using regsvr32.exe. Function can be invoked using alias: 'Register-DLL' or 'Unregister-DLL'. + .PARAMETER FilePath - Path to the DLL file. + +Path to the DLL file. + .PARAMETER DLLAction - Specify whether to register or unregister the DLL. Optional if function is invoked using 'Register-DLL' or 'Unregister-DLL' alias. + +Specify whether to register or unregister the DLL. Optional if function is invoked using 'Register-DLL' or 'Unregister-DLL' alias. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return objects. + .EXAMPLE - Register-DLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" - Register DLL file using the "Register-DLL" alias for this function + +Register-DLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" + +Register DLL file using the "Register-DLL" alias for this function + .EXAMPLE - UnRegister-DLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" - Unregister DLL file using the "Unregister-DLL" alias for this function + +UnRegister-DLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" + +Unregister DLL file using the "Unregister-DLL" alias for this function + .EXAMPLE - Invoke-RegisterOrUnregisterDLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" -DLLAction 'Register' - Register DLL file using the actual name of this function + +Invoke-RegisterOrUnregisterDLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" -DLLAction 'Register' + +Register DLL file using the actual name of this function + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$FilePath, - [Parameter(Mandatory=$false)] - [ValidateSet('Register','Unregister')] - [string]$DLLAction, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## Get name used to invoke this function in case the 'Register-DLL' or 'Unregister-DLL' alias was used and set the correct DLL action - [string]${InvokedCmdletName} = $MyInvocation.InvocationName - # Set the correct register/unregister action based on the alias used to invoke this function - If (${InvokedCmdletName} -ne ${CmdletName}) { - Switch (${InvokedCmdletName}) { - 'Register-DLL' { [string]$DLLAction = 'Register' } - 'Unregister-DLL' { [string]$DLLAction = 'Unregister' } - } - } - # Set the correct DLL register/unregister action parameters - If (-not $DLLAction) { Throw 'Parameter validation failed. Please specify the [-DLLAction] parameter to determine whether to register or unregister the DLL.' } - [string]$DLLAction = ((Get-Culture).TextInfo).ToTitleCase($DLLAction.ToLower()) - Switch ($DLLAction) { - 'Register' { [string]$DLLActionParameters = "/s `"$FilePath`"" } - 'Unregister' { [string]$DLLActionParameters = "/s /u `"$FilePath`"" } - } - } - Process { - Try { - Write-Log -Message "$DLLAction DLL file [$filePath]." -Source ${CmdletName} - If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { Throw "File [$filePath] could not be found." } - - [string]$DLLFileBitness = Get-PEFileArchitecture -FilePath $filePath -ContinueOnError $false -ErrorAction 'Stop' - If (($DLLFileBitness -ne '64BIT') -and ($DLLFileBitness -ne '32BIT')) { - Throw "File [$filePath] has a detected file architecture of [$DLLFileBitness]. Only 32-bit or 64-bit DLL files can be $($DLLAction.ToLower() + 'ed')." - } - - If ($Is64Bit) { - If ($DLLFileBitness -eq '64BIT') { - If ($Is64BitProcess) { - [string]$RegSvr32Path = "$envWinDir\system32\regsvr32.exe" - } - Else { - [string]$RegSvr32Path = "$envWinDir\sysnative\regsvr32.exe" - } - } - ElseIf ($DLLFileBitness -eq '32BIT') { - [string]$RegSvr32Path = "$envWinDir\SysWOW64\regsvr32.exe" - } - } - Else { - If ($DLLFileBitness -eq '64BIT') { - Throw "File [$filePath] cannot be $($DLLAction.ToLower()) because it is a 64-bit file on a 32-bit operating system." - } - ElseIf ($DLLFileBitness -eq '32BIT') { - [string]$RegSvr32Path = "$envWinDir\system32\regsvr32.exe" - } - } - - [psobject]$ExecuteResult = Execute-Process -Path $RegSvr32Path -Parameters $DLLActionParameters -WindowStyle 'Hidden' -PassThru - - If ($ExecuteResult.ExitCode -ne 0) { - If ($ExecuteResult.ExitCode -eq 60002) { - Throw "Execute-Process function failed with exit code [$($ExecuteResult.ExitCode)]." - } - Else { - Throw "regsvr32.exe failed with exit code [$($ExecuteResult.ExitCode)]." - } - } - } - Catch { - Write-Log -Message "Failed to $($DLLAction.ToLower()) DLL file. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to $($DLLAction.ToLower()) DLL file: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $false)] + [ValidateSet('Register', 'Unregister')] + [String]$DLLAction, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Get name used to invoke this function in case the 'Register-DLL' or 'Unregister-DLL' alias was used and set the correct DLL action + [String]${InvokedCmdletName} = $MyInvocation.InvocationName + # Set the correct register/unregister action based on the alias used to invoke this function + If (${InvokedCmdletName} -ne ${CmdletName}) { + Switch (${InvokedCmdletName}) { + 'Register-DLL' { + [String]$DLLAction = 'Register' + } + 'Unregister-DLL' { + [String]$DLLAction = 'Unregister' + } + } + } + # Set the correct DLL register/unregister action parameters + If (-not $DLLAction) { + Throw 'Parameter validation failed. Please specify the [-DLLAction] parameter to determine whether to register or unregister the DLL.' + } + [String]$DLLAction = ((Get-Culture).TextInfo).ToTitleCase($DLLAction.ToLower()) + Switch ($DLLAction) { + 'Register' { + [String]$DLLActionParameters = "/s `"$FilePath`"" + } + 'Unregister' { + [String]$DLLActionParameters = "/s /u `"$FilePath`"" + } + } + } + Process { + Try { + Write-Log -Message "$DLLAction DLL file [$filePath]." -Source ${CmdletName} + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { + Throw "File [$filePath] could not be found." + } + + [String]$DLLFileBitness = Get-PEFileArchitecture -FilePath $filePath -ContinueOnError $false -ErrorAction 'Stop' + If (($DLLFileBitness -ne '64BIT') -and ($DLLFileBitness -ne '32BIT')) { + Throw "File [$filePath] has a detected file architecture of [$DLLFileBitness]. Only 32-bit or 64-bit DLL files can be $($DLLAction.ToLower() + 'ed')." + } + + If ($Is64Bit) { + If ($DLLFileBitness -eq '64BIT') { + If ($Is64BitProcess) { + [String]$RegSvr32Path = "$envWinDir\System32\regsvr32.exe" + } + Else { + [String]$RegSvr32Path = "$envWinDir\Sysnative\regsvr32.exe" + } + } + ElseIf ($DLLFileBitness -eq '32BIT') { + [String]$RegSvr32Path = "$envWinDir\SysWOW64\regsvr32.exe" + } + } + Else { + If ($DLLFileBitness -eq '64BIT') { + Throw "File [$filePath] cannot be $($DLLAction.ToLower()) because it is a 64-bit file on a 32-bit operating system." + } + ElseIf ($DLLFileBitness -eq '32BIT') { + [String]$RegSvr32Path = "$envWinDir\System32\regsvr32.exe" + } + } + + [PSObject]$ExecuteResult = Execute-Process -Path $RegSvr32Path -Parameters $DLLActionParameters -WindowStyle 'Hidden' -PassThru -ExitOnProcessFailure $false + + If ($ExecuteResult.ExitCode -ne 0) { + If ($ExecuteResult.ExitCode -eq 60002) { + Throw "Execute-Process function failed with exit code [$($ExecuteResult.ExitCode)]." + } + Else { + Throw "regsvr32.exe failed with exit code [$($ExecuteResult.ExitCode)]." + } + } + } + Catch { + Write-Log -Message "Failed to $($DLLAction.ToLower()) DLL file. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to $($DLLAction.ToLower()) DLL file: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } Set-Alias -Name 'Register-DLL' -Value 'Invoke-RegisterOrUnregisterDLL' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' Set-Alias -Name 'Unregister-DLL' -Value 'Invoke-RegisterOrUnregisterDLL' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' @@ -7807,2552 +11817,3897 @@ Set-Alias -Name 'Unregister-DLL' -Value 'Invoke-RegisterOrUnregisterDLL' -Scope #region Function Invoke-ObjectMethod Function Invoke-ObjectMethod { -<# + <# .SYNOPSIS - Invoke method on any object. + +Invoke method on any object. + .DESCRIPTION - Invoke method on any object with or without using named parameters. + +Invoke method on any object with or without using named parameters. + .PARAMETER InputObject - Specifies an object which has methods that can be invoked. + +Specifies an object which has methods that can be invoked. + .PARAMETER MethodName - Specifies the name of a method to invoke. + +Specifies the name of a method to invoke. + .PARAMETER ArgumentList - Argument to pass to the method being executed. Allows execution of method without specifying named parameters. + +Argument to pass to the method being executed. Allows execution of method without specifying named parameters. + .PARAMETER Parameter - Argument to pass to the method being executed. Allows execution of method by using named parameters. + +Argument to pass to the method being executed. Allows execution of method by using named parameters. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Object. + +The object returned by the method being invoked. + .EXAMPLE - $ShellApp = New-Object -ComObject 'Shell.Application' - $null = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'MinimizeAll' - Minimizes all windows. + +$ShellApp = New-Object -ComObject 'Shell.Application' +$null = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'MinimizeAll' + +Minimizes all windows. + .EXAMPLE - $ShellApp = New-Object -ComObject 'Shell.Application' - $null = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'Explore' -Parameter @{'vDir'='C:\Windows'} - Opens the C:\Windows folder in a Windows Explorer window. + +$ShellApp = New-Object -ComObject 'Shell.Application' + +$null = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'Explore' -Parameter @{'vDir'='C:\Windows'} + +Opens the C:\Windows folder in a Windows Explorer window. + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding(DefaultParameterSetName='Positional')] - Param ( - [Parameter(Mandatory=$true,Position=0)] - [ValidateNotNull()] - [object]$InputObject, - [Parameter(Mandatory=$true,Position=1)] - [ValidateNotNullorEmpty()] - [string]$MethodName, - [Parameter(Mandatory=$false,Position=2,ParameterSetName='Positional')] - [object[]]$ArgumentList, - [Parameter(Mandatory=$true,Position=2,ParameterSetName='Named')] - [ValidateNotNull()] - [hashtable]$Parameter - ) - - Begin { } - Process { - If ($PSCmdlet.ParameterSetName -eq 'Named') { - ## Invoke method by using parameter names - Write-Output -InputObject $InputObject.GetType().InvokeMember($MethodName, [Reflection.BindingFlags]::InvokeMethod, $null, $InputObject, ([object[]]($Parameter.Values)), $null, $null, ([string[]]($Parameter.Keys))) - } - Else { - ## Invoke method without using parameter names - Write-Output -InputObject $InputObject.GetType().InvokeMember($MethodName, [Reflection.BindingFlags]::InvokeMethod, $null, $InputObject, $ArgumentList, $null, $null, $null) - } - } - End { } + [CmdletBinding(DefaultParameterSetName = 'Positional')] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNull()] + [Object]$InputObject, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$MethodName, + [Parameter(Mandatory = $false, Position = 2, ParameterSetName = 'Positional')] + [Object[]]$ArgumentList, + [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'Named')] + [ValidateNotNull()] + [Hashtable]$Parameter + ) + + Begin { + } + Process { + If ($PSCmdlet.ParameterSetName -eq 'Named') { + ## Invoke method by using parameter names + Write-Output -InputObject ($InputObject.GetType().InvokeMember($MethodName, [Reflection.BindingFlags]::InvokeMethod, $null, $InputObject, ([Object[]]($Parameter.Values)), $null, $null, ([String[]]($Parameter.Keys)))) + } + Else { + ## Invoke method without using parameter names + Write-Output -InputObject ($InputObject.GetType().InvokeMember($MethodName, [Reflection.BindingFlags]::InvokeMethod, $null, $InputObject, $ArgumentList, $null, $null, $null)) + } + } + End { + } } #endregion #region Function Get-ObjectProperty Function Get-ObjectProperty { -<# + <# .SYNOPSIS - Get a property from any object. + +Get a property from any object. + .DESCRIPTION - Get a property from any object. + +Get a property from any object. + .PARAMETER InputObject - Specifies an object which has properties that can be retrieved. + +Specifies an object which has properties that can be retrieved. + .PARAMETER PropertyName - Specifies the name of a property to retrieve. + +Specifies the name of a property to retrieve. + .PARAMETER ArgumentList - Argument to pass to the property being retrieved. + +Argument to pass to the property being retrieved. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Object. + +Returns the value of the property being retrieved. + .EXAMPLE - Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @(1) + +Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @(1) + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,Position=0)] - [ValidateNotNull()] - [object]$InputObject, - [Parameter(Mandatory=$true,Position=1)] - [ValidateNotNullorEmpty()] - [string]$PropertyName, - [Parameter(Mandatory=$false,Position=2)] - [object[]]$ArgumentList - ) - - Begin { } - Process { - ## Retrieve property - Write-Output -InputObject $InputObject.GetType().InvokeMember($PropertyName, [Reflection.BindingFlags]::GetProperty, $null, $InputObject, $ArgumentList, $null, $null, $null) - } - End { } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNull()] + [Object]$InputObject, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$PropertyName, + [Parameter(Mandatory = $false, Position = 2)] + [Object[]]$ArgumentList + ) + + Begin { + } + Process { + ## Retrieve property + Write-Output -InputObject ($InputObject.GetType().InvokeMember($PropertyName, [Reflection.BindingFlags]::GetProperty, $null, $InputObject, $ArgumentList, $null, $null, $null)) + } + End { + } } #endregion #region Function Get-MsiTableProperty Function Get-MsiTableProperty { -<# + <# .SYNOPSIS - Get all of the properties from a Windows Installer database table or the Summary Information stream and return as a custom object. + +Get all of the properties from a Windows Installer database table or the Summary Information stream and return as a custom object. + .DESCRIPTION - Use the Windows Installer object to read all of the properties from a Windows Installer database table or the Summary Information stream. + +Use the Windows Installer object to read all of the properties from a Windows Installer database table or the Summary Information stream. + .PARAMETER Path - The fully qualified path to an database file. Supports .msi and .msp files. + +The fully qualified path to an database file. Supports .msi and .msp files. + .PARAMETER TransformPath - The fully qualified path to a list of MST file(s) which should be applied to the MSI file. + +The fully qualified path to a list of MST file(s) which should be applied to the MSI file. + .PARAMETER Table - The name of the the MSI table from which all of the properties must be retrieved. Default is: 'Property'. + +The name of the the MSI table from which all of the properties must be retrieved. Default is: 'Property'. + .PARAMETER TablePropertyNameColumnNum - Specify the table column number which contains the name of the properties. Default is: 1 for MSIs and 2 for MSPs. + +Specify the table column number which contains the name of the properties. Default is: 1 for MSIs and 2 for MSPs. + .PARAMETER TablePropertyValueColumnNum - Specify the table column number which contains the value of the properties. Default is: 2 for MSIs and 3 for MSPs. + +Specify the table column number which contains the value of the properties. Default is: 2 for MSIs and 3 for MSPs. + .PARAMETER GetSummaryInformation - Retrieves the Summary Information for the Windows Installer database. - Summary Information property descriptions: https://msdn.microsoft.com/en-us/library/aa372049(v=vs.85).aspx + +Retrieves the Summary Information for the Windows Installer database. + +Summary Information property descriptions: https://msdn.microsoft.com/en-us/library/aa372049(v=vs.85).aspx + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Management.Automation.PSObject + +Returns a custom object with the following properties: 'Name' and 'Value'. + .EXAMPLE - Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -TransformPath 'C:\Package\AppDeploy.mst' - Retrieve all of the properties from the default 'Property' table. + +Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -TransformPath 'C:\Package\AppDeploy.mst' + +Retrieve all of the properties from the default 'Property' table. + .EXAMPLE - Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -TransformPath 'C:\Package\AppDeploy.mst' -Table 'Property' | Select-Object -ExpandProperty ProductCode - Retrieve all of the properties from the 'Property' table and then pipe to Select-Object to select the ProductCode property. + +Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -TransformPath 'C:\Package\AppDeploy.mst' -Table 'Property' | Select-Object -ExpandProperty ProductCode + +Retrieve all of the properties from the 'Property' table and then pipe to Select-Object to select the ProductCode property. + .EXAMPLE - Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -GetSummaryInformation - Retrieves the Summary Information for the Windows Installer database. + +Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -GetSummaryInformation + +Retrieves the Summary Information for the Windows Installer database. + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding(DefaultParameterSetName='TableInfo')] - Param ( - [Parameter(Mandatory=$true)] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] - [string]$Path, - [Parameter(Mandatory=$false)] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] - [string[]]$TransformPath, - [Parameter(Mandatory=$false,ParameterSetName='TableInfo')] - [ValidateNotNullOrEmpty()] - [string]$Table = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { 'Property' } Else { 'MsiPatchMetadata' }), - [Parameter(Mandatory=$false,ParameterSetName='TableInfo')] - [ValidateNotNullorEmpty()] - [int32]$TablePropertyNameColumnNum = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { 1 } Else { 2 }), - [Parameter(Mandatory=$false,ParameterSetName='TableInfo')] - [ValidateNotNullorEmpty()] - [int32]$TablePropertyValueColumnNum = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { 2 } Else { 3 }), - [Parameter(Mandatory=$true,ParameterSetName='SummaryInfo')] - [ValidateNotNullorEmpty()] - [switch]$GetSummaryInformation = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - If ($PSCmdlet.ParameterSetName -eq 'TableInfo') { - Write-Log -Message "Read data from Windows Installer database file [$Path] in table [$Table]." -Source ${CmdletName} - } - Else { - Write-Log -Message "Read the Summary Information from the Windows Installer database file [$Path]." -Source ${CmdletName} - } - - ## Create a Windows Installer object - [__comobject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' - ## Determine if the database file is a patch (.msp) or not - If ([IO.Path]::GetExtension($Path) -eq '.msp') { [boolean]$IsMspFile = $true } - ## Define properties for how the MSI database is opened - [int32]$msiOpenDatabaseModeReadOnly = 0 - [int32]$msiSuppressApplyTransformErrors = 63 - [int32]$msiOpenDatabaseMode = $msiOpenDatabaseModeReadOnly - [int32]$msiOpenDatabaseModePatchFile = 32 - If ($IsMspFile) { [int32]$msiOpenDatabaseMode = $msiOpenDatabaseModePatchFile } - ## Open database in read only mode - [__comobject]$Database = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($Path, $msiOpenDatabaseMode) - ## Apply a list of transform(s) to the database - If (($TransformPath) -and (-not $IsMspFile)) { - ForEach ($Transform in $TransformPath) { - $null = Invoke-ObjectMethod -InputObject $Database -MethodName 'ApplyTransform' -ArgumentList @($Transform, $msiSuppressApplyTransformErrors) - } - } - - ## Get either the requested windows database table information or summary information - If ($PSCmdlet.ParameterSetName -eq 'TableInfo') { - ## Open the requested table view from the database - [__comobject]$View = Invoke-ObjectMethod -InputObject $Database -MethodName 'OpenView' -ArgumentList @("SELECT * FROM $Table") - $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' - - ## Create an empty object to store properties in - [psobject]$TableProperties = New-Object -TypeName 'PSObject' - - ## Retrieve the first row from the requested table. If the first row was successfully retrieved, then save data and loop through the entire table. - # https://msdn.microsoft.com/en-us/library/windows/desktop/aa371136(v=vs.85).aspx - [__comobject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' - While ($Record) { - # Read string data from record and add property/value pair to custom object - $TableProperties | Add-Member -MemberType 'NoteProperty' -Name (Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @($TablePropertyNameColumnNum)) -Value (Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @($TablePropertyValueColumnNum)) -Force - # Retrieve the next row in the table - [__comobject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' - } - Write-Output -InputObject $TableProperties - } - Else { - ## Get the SummaryInformation from the windows installer database - [__comobject]$SummaryInformation = Get-ObjectProperty -InputObject $Database -PropertyName 'SummaryInformation' - [hashtable]$SummaryInfoProperty = @{} - ## Summary property descriptions: https://msdn.microsoft.com/en-us/library/aa372049(v=vs.85).aspx - $SummaryInfoProperty.Add('CodePage', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(1))) - $SummaryInfoProperty.Add('Title', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(2))) - $SummaryInfoProperty.Add('Subject', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(3))) - $SummaryInfoProperty.Add('Author', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(4))) - $SummaryInfoProperty.Add('Keywords', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(5))) - $SummaryInfoProperty.Add('Comments', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(6))) - $SummaryInfoProperty.Add('Template', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(7))) - $SummaryInfoProperty.Add('LastSavedBy', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(8))) - $SummaryInfoProperty.Add('RevisionNumber', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(9))) - $SummaryInfoProperty.Add('LastPrinted', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(11))) - $SummaryInfoProperty.Add('CreateTimeDate', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(12))) - $SummaryInfoProperty.Add('LastSaveTimeDate', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(13))) - $SummaryInfoProperty.Add('PageCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(14))) - $SummaryInfoProperty.Add('WordCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(15))) - $SummaryInfoProperty.Add('CharacterCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(16))) - $SummaryInfoProperty.Add('CreatingApplication', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(18))) - $SummaryInfoProperty.Add('Security', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(19))) - [psobject]$SummaryInfoProperties = New-Object -TypeName 'PSObject' -Property $SummaryInfoProperty - Write-Output -InputObject $SummaryInfoProperties - } - } - Catch { - Write-Log -Message "Failed to get the MSI table [$Table]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to get the MSI table [$Table]: $($_.Exception.Message)" - } - } - Finally { - Try { - If ($View) { - $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) } Catch { } - } - ElseIf($SummaryInformation) { - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation) } Catch { } - } - } - Catch { } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($DataBase) } Catch { } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) } Catch { } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding(DefaultParameterSetName = 'TableInfo')] + Param ( + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String[]]$TransformPath, + [Parameter(Mandatory = $false, ParameterSetName = 'TableInfo')] + [ValidateNotNullOrEmpty()] + [String]$Table = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { + 'Property' + } + Else { + 'MsiPatchMetadata' + }), + [Parameter(Mandatory = $false, ParameterSetName = 'TableInfo')] + [ValidateNotNullorEmpty()] + [Int32]$TablePropertyNameColumnNum = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { + 1 + } + Else { + 2 + }), + [Parameter(Mandatory = $false, ParameterSetName = 'TableInfo')] + [ValidateNotNullorEmpty()] + [Int32]$TablePropertyValueColumnNum = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { + 2 + } + Else { + 3 + }), + [Parameter(Mandatory = $true, ParameterSetName = 'SummaryInfo')] + [ValidateNotNullorEmpty()] + [Switch]$GetSummaryInformation = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If ($PSCmdlet.ParameterSetName -eq 'TableInfo') { + Write-Log -Message "Reading data from Windows Installer database file [$Path] in table [$Table]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Reading the Summary Information from the Windows Installer database file [$Path]." -Source ${CmdletName} + } + + ## Create a Windows Installer object + [__ComObject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' + ## Determine if the database file is a patch (.msp) or not + If ([IO.Path]::GetExtension($Path) -eq '.msp') { + [Boolean]$IsMspFile = $true + } + ## Define properties for how the MSI database is opened + [Int32]$msiOpenDatabaseModeReadOnly = 0 + [Int32]$msiSuppressApplyTransformErrors = 63 + [Int32]$msiOpenDatabaseMode = $msiOpenDatabaseModeReadOnly + [Int32]$msiOpenDatabaseModePatchFile = 32 + If ($IsMspFile) { + [Int32]$msiOpenDatabaseMode = $msiOpenDatabaseModePatchFile + } + ## Open database in read only mode + [__ComObject]$Database = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($Path, $msiOpenDatabaseMode) + ## Apply a list of transform(s) to the database + If (($TransformPath) -and (-not $IsMspFile)) { + ForEach ($Transform in $TransformPath) { + $null = Invoke-ObjectMethod -InputObject $Database -MethodName 'ApplyTransform' -ArgumentList @($Transform, $msiSuppressApplyTransformErrors) + } + } + + ## Get either the requested windows database table information or summary information + If ($PSCmdlet.ParameterSetName -eq 'TableInfo') { + ## Open the requested table view from the database + [__ComObject]$View = Invoke-ObjectMethod -InputObject $Database -MethodName 'OpenView' -ArgumentList @("SELECT * FROM $Table") + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' + + ## Create an empty object to store properties in + [PSObject]$TableProperties = New-Object -TypeName 'PSObject' + + ## Retrieve the first row from the requested table. If the first row was successfully retrieved, then save data and loop through the entire table. + # https://msdn.microsoft.com/en-us/library/windows/desktop/aa371136(v=vs.85).aspx + [__ComObject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' + While ($Record) { + # Read string data from record and add property/value pair to custom object + $TableProperties | Add-Member -MemberType 'NoteProperty' -Name (Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @($TablePropertyNameColumnNum)) -Value (Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @($TablePropertyValueColumnNum)) -Force + # Retrieve the next row in the table + [__ComObject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' + } + Write-Output -InputObject ($TableProperties) + } + Else { + ## Get the SummaryInformation from the windows installer database + [__ComObject]$SummaryInformation = Get-ObjectProperty -InputObject $Database -PropertyName 'SummaryInformation' + [Hashtable]$SummaryInfoProperty = @{} + ## Summary property descriptions: https://msdn.microsoft.com/en-us/library/aa372049(v=vs.85).aspx + $SummaryInfoProperty.Add('CodePage', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(1))) + $SummaryInfoProperty.Add('Title', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(2))) + $SummaryInfoProperty.Add('Subject', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(3))) + $SummaryInfoProperty.Add('Author', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(4))) + $SummaryInfoProperty.Add('Keywords', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(5))) + $SummaryInfoProperty.Add('Comments', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(6))) + $SummaryInfoProperty.Add('Template', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(7))) + $SummaryInfoProperty.Add('LastSavedBy', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(8))) + $SummaryInfoProperty.Add('RevisionNumber', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(9))) + $SummaryInfoProperty.Add('LastPrinted', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(11))) + $SummaryInfoProperty.Add('CreateTimeDate', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(12))) + $SummaryInfoProperty.Add('LastSaveTimeDate', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(13))) + $SummaryInfoProperty.Add('PageCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(14))) + $SummaryInfoProperty.Add('WordCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(15))) + $SummaryInfoProperty.Add('CharacterCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(16))) + $SummaryInfoProperty.Add('CreatingApplication', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(18))) + $SummaryInfoProperty.Add('Security', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(19))) + [PSObject]$SummaryInfoProperties = New-Object -TypeName 'PSObject' -Property $SummaryInfoProperty + Write-Output -InputObject ($SummaryInfoProperties) + } + } + Catch { + Write-Log -Message "Failed to get the MSI table [$Table]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to get the MSI table [$Table]: $($_.Exception.Message)" + } + } + Finally { + Try { + If ($View) { + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) + } + Catch { + } + } + ElseIf ($SummaryInformation) { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation) + } + Catch { + } + } + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($DataBase) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-MsiProperty Function Set-MsiProperty { -<# + <# .SYNOPSIS - Set a property in the MSI property table. + +Set a property in the MSI property table. + .DESCRIPTION - Set a property in the MSI property table. + +Set a property in the MSI property table. + .PARAMETER DataBase - Specify a ComObject representing an MSI database opened in view/modify/update mode. + +Specify a ComObject representing an MSI database opened in view/modify/update mode. + .PARAMETER PropertyName - The name of the property to be set/modified. + +The name of the property to be set/modified. + .PARAMETER PropertyValue - The value of the property to be set/modified. + +The value of the property to be set/modified. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + .EXAMPLE - Set-MsiProperty -DataBase $TempMsiPathDatabase -PropertyName 'ALLUSERS' -PropertyValue '1' + +Set-MsiProperty -DataBase $TempMsiPathDatabase -PropertyName 'ALLUSERS' -PropertyValue '1' + .NOTES - This is an internal script function and should typically not be called directly. + +This is an internal script function and should typically not be called directly. + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [__comobject]$DataBase, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$PropertyName, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$PropertyValue, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]." -Source ${CmdletName} - - ## Open the requested table view from the database - [__comobject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("SELECT * FROM Property WHERE Property='$PropertyName'") - $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' - - ## Retrieve the requested property from the requested table. - # https://msdn.microsoft.com/en-us/library/windows/desktop/aa371136(v=vs.85).aspx - [__comobject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' - - ## Close the previous view on the MSI database - $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) - - ## Set the MSI property - If ($Record) { - # If the property already exists, then create the view for updating the property - [__comobject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("UPDATE Property SET Value='$PropertyValue' WHERE Property='$PropertyName'") - } - Else { - # If property does not exist, then create view for inserting the property - [__comobject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("INSERT INTO Property (Property, Value) VALUES ('$PropertyName','$PropertyValue')") - } - # Execute the view to set the MSI property - $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' - } - Catch { - Write-Log -Message "Failed to set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]: $($_.Exception.Message)" - } - } - Finally { - Try { - If ($View) { - $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) - } - } - Catch { } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [__ComObject]$DataBase, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$PropertyName, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$PropertyValue, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Setting the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]." -Source ${CmdletName} + + ## Open the requested table view from the database + [__ComObject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("SELECT * FROM Property WHERE Property='$PropertyName'") + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' + + ## Retrieve the requested property from the requested table. + # https://msdn.microsoft.com/en-us/library/windows/desktop/aa371136(v=vs.85).aspx + [__ComObject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' + + ## Close the previous view on the MSI database + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) + + ## Set the MSI property + If ($Record) { + # If the property already exists, then create the view for updating the property + [__ComObject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("UPDATE Property SET Value='$PropertyValue' WHERE Property='$PropertyName'") + } + Else { + # If property does not exist, then create view for inserting the property + [__ComObject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("INSERT INTO Property (Property, Value) VALUES ('$PropertyName','$PropertyValue')") + } + # Execute the view to set the MSI property + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' + } + Catch { + Write-Log -Message "Failed to set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]: $($_.Exception.Message)" + } + } + Finally { + Try { + If ($View) { + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) + } + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function New-MsiTransform Function New-MsiTransform { -<# + <# .SYNOPSIS - Create a transform file for an MSI database. + +Create a transform file for an MSI database. + .DESCRIPTION - Create a transform file for an MSI database and create/modify properties in the Properties table. + +Create a transform file for an MSI database and create/modify properties in the Properties table. + .PARAMETER MsiPath - Specify the path to an MSI file. + +Specify the path to an MSI file. + .PARAMETER ApplyTransformPath - Specify the path to a transform which should be applied to the MSI database before any new properties are created or modified. + +Specify the path to a transform which should be applied to the MSI database before any new properties are created or modified. + .PARAMETER NewTransformPath - Specify the path where the new transform file with the desired properties will be created. If a transform file of the same name already exists, it will be deleted before a new one is created. - Default is: a) If -ApplyTransformPath was specified but not -NewTransformPath, then .new.mst - b) If only -MsiPath was specified, then .mst + +Specify the path where the new transform file with the desired properties will be created. If a transform file of the same name already exists, it will be deleted before a new one is created. + +Default is: a) If -ApplyTransformPath was specified but not -NewTransformPath, then .new.mst + b) If only -MsiPath was specified, then .mst + .PARAMETER TransformProperties - Hashtable which contains calls to Set-MsiProperty for configuring the desired properties which should be included in new transform file. - Example hashtable: [hashtable]$TransformProperties = @{ 'ALLUSERS' = '1' } + +Hashtable which contains calls to Set-MsiProperty for configuring the desired properties which should be included in new transform file. + +Example hashtable: [Hashtable]$TransformProperties = @{ 'ALLUSERS' = '1' } + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. -.EXAMPLE - [hashtable]$TransformProperties = { - 'ALLUSERS' = '1' - 'AgreeToLicense' = 'Yes' - 'REBOOT' = 'ReallySuppress' - 'RebootYesNo' = 'No' - 'ROOTDRIVE' = 'C:' - } - New-MsiTransform -MsiPath 'C:\Temp\PSADTInstall.msi' -TransformProperties $TransformProperties + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + [Hashtable]$TransformProperties = { + 'ALLUSERS' = '1' + 'AgreeToLicense' = 'Yes' + 'REBOOT' = 'ReallySuppress' + 'RebootYesNo' = 'No' + 'ROOTDRIVE' = 'C:' + } + New-MsiTransform -MsiPath 'C:\Temp\PSADTInstall.msi' -TransformProperties $TransformProperties + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] - [string]$MsiPath, - [Parameter(Mandatory=$false)] - [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] - [string]$ApplyTransformPath, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$NewTransformPath, - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [hashtable]$TransformProperties, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## Define properties for how the MSI database is opened - [int32]$msiOpenDatabaseModeReadOnly = 0 - [int32]$msiOpenDatabaseModeTransact = 1 - [int32]$msiViewModifyUpdate = 2 - [int32]$msiViewModifyReplace = 4 - [int32]$msiViewModifyDelete = 6 - [int32]$msiTransformErrorNone = 0 - [int32]$msiTransformValidationNone = 0 - [int32]$msiSuppressApplyTransformErrors = 63 - } - Process { - Try { - Write-Log -Message "Create a transform file for MSI [$MsiPath]." -Source ${CmdletName} - - ## Discover the parent folder that the MSI file resides in - [string]$MsiParentFolder = Split-Path -Path $MsiPath -Parent -ErrorAction 'Stop' - - ## Create a temporary file name for storing a second copy of the MSI database - [string]$TempMsiPath = Join-Path -Path $MsiParentFolder -ChildPath ([IO.Path]::GetFileName(([IO.Path]::GetTempFileName()))) -ErrorAction 'Stop' - - ## Create a second copy of the MSI database - Write-Log -Message "Copy MSI database in path [$MsiPath] to destination [$TempMsiPath]." -Source ${CmdletName} - $null = Copy-Item -LiteralPath $MsiPath -Destination $TempMsiPath -Force -ErrorAction 'Stop' - - ## Create a Windows Installer object - [__comobject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' - - ## Open both copies of the MSI database - # Open the original MSI database in read only mode - Write-Log -Message "Open the MSI database [$MsiPath] in read only mode." -Source ${CmdletName} - [__comobject]$MsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($MsiPath, $msiOpenDatabaseModeReadOnly) - # Open the temporary copy of the MSI database in view/modify/update mode - Write-Log -Message "Open the MSI database [$TempMsiPath] in view/modify/update mode." -Source ${CmdletName} - [__comobject]$TempMsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($TempMsiPath, $msiViewModifyUpdate) - - ## If a MSI transform file was specified, then apply it to the temporary copy of the MSI database - If ($ApplyTransformPath) { - Write-Log -Message "Apply transform file [$ApplyTransformPath] to MSI database [$TempMsiPath]." -Source ${CmdletName} - $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'ApplyTransform' -ArgumentList @($ApplyTransformPath, $msiSuppressApplyTransformErrors) - } - - ## Determine the path for the new transform file that will be generated - If (-not $NewTransformPath) { - If ($ApplyTransformPath) { - [string]$NewTransformFileName = [IO.Path]::GetFileNameWithoutExtension($ApplyTransformPath) + '.new' + [IO.Path]::GetExtension($ApplyTransformPath) - } - Else { - [string]$NewTransformFileName = [IO.Path]::GetFileNameWithoutExtension($MsiPath) + '.mst' - } - [string]$NewTransformPath = Join-Path -Path $MsiParentFolder -ChildPath $NewTransformFileName -ErrorAction 'Stop' - } - - ## Set the MSI properties in the temporary copy of the MSI database - $TransformProperties.GetEnumerator() | ForEach-Object { Set-MsiProperty -DataBase $TempMsiPathDatabase -PropertyName $_.Key -PropertyValue $_.Value } - - ## Commit the new properties to the temporary copy of the MSI database - $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'Commit' - - ## Reopen the temporary copy of the MSI database in read only mode - # Release the database object for the temporary copy of the MSI database - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($TempMsiPathDatabase) - # Open the temporary copy of the MSI database in read only mode - Write-Log -Message "Re-open the MSI database [$TempMsiPath] in read only mode." -Source ${CmdletName} - [__comobject]$TempMsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($TempMsiPath, $msiOpenDatabaseModeReadOnly) - - ## Delete the new transform file path if it already exists - If (Test-Path -LiteralPath $NewTransformPath -PathType 'Leaf' -ErrorAction 'Stop') { - Write-Log -Message "A transform file of the same name already exists. Deleting transform file [$NewTransformPath]." -Source ${CmdletName} - $null = Remove-Item -LiteralPath $NewTransformPath -Force -ErrorAction 'Stop' - } - - ## Generate the new transform file by taking the difference between the temporary copy of the MSI database and the original MSI database - Write-Log -Message "Generate new transform file [$NewTransformPath]." -Source ${CmdletName} - $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'GenerateTransform' -ArgumentList @($MsiPathDatabase, $NewTransformPath) - $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'CreateTransformSummaryInfo' -ArgumentList @($MsiPathDatabase, $NewTransformPath, $msiTransformErrorNone, $msiTransformValidationNone) - - If (Test-Path -LiteralPath $NewTransformPath -PathType 'Leaf' -ErrorAction 'Stop') { - Write-Log -Message "Successfully created new transform file in path [$NewTransformPath]." -Source ${CmdletName} - } - Else { - Throw "Failed to generate transform file in path [$NewTransformPath]." - } - } - Catch { - Write-Log -Message "Failed to create new transform file in path [$NewTransformPath]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to create new transform file in path [$NewTransformPath]: $($_.Exception.Message)" - } - } - Finally { - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($TempMsiPathDatabase) } Catch { } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($MsiPathDatabase) } Catch { } - Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) } Catch { } - Try { - ## Delete the temporary copy of the MSI database - If (Test-Path -LiteralPath $TempMsiPath -PathType 'Leaf' -ErrorAction 'Stop') { - $null = Remove-Item -LiteralPath $TempMsiPath -Force -ErrorAction 'Stop' - } - } - Catch { } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String]$MsiPath, + [Parameter(Mandatory = $false)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String]$ApplyTransformPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$NewTransformPath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [Hashtable]$TransformProperties, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Define properties for how the MSI database is opened + [Int32]$msiOpenDatabaseModeReadOnly = 0 + [Int32]$msiOpenDatabaseModeTransact = 1 + [Int32]$msiViewModifyUpdate = 2 + [Int32]$msiViewModifyReplace = 4 + [Int32]$msiViewModifyDelete = 6 + [Int32]$msiTransformErrorNone = 0 + [Int32]$msiTransformValidationNone = 0 + [Int32]$msiSuppressApplyTransformErrors = 63 + } + Process { + Try { + Write-Log -Message "Creating a transform file for MSI [$MsiPath]." -Source ${CmdletName} + + ## Discover the parent folder that the MSI file resides in + [String]$MsiParentFolder = Split-Path -Path $MsiPath -Parent -ErrorAction 'Stop' + + ## Create a temporary file name for storing a second copy of the MSI database + [String]$TempMsiPath = Join-Path -Path $MsiParentFolder -ChildPath ([IO.Path]::GetFileName(([IO.Path]::GetTempFileName()))) -ErrorAction 'Stop' + + ## Create a second copy of the MSI database + Write-Log -Message "Copying MSI database in path [$MsiPath] to destination [$TempMsiPath]." -Source ${CmdletName} + $null = Copy-Item -LiteralPath $MsiPath -Destination $TempMsiPath -Force -ErrorAction 'Stop' + + ## Create a Windows Installer object + [__ComObject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' + + ## Open both copies of the MSI database + # Open the original MSI database in read only mode + Write-Log -Message "Opening the MSI database [$MsiPath] in read only mode." -Source ${CmdletName} + [__ComObject]$MsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($MsiPath, $msiOpenDatabaseModeReadOnly) + # Open the temporary copy of the MSI database in view/modify/update mode + Write-Log -Message "Opening the MSI database [$TempMsiPath] in view/modify/update mode." -Source ${CmdletName} + [__ComObject]$TempMsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($TempMsiPath, $msiViewModifyUpdate) + + ## If a MSI transform file was specified, then apply it to the temporary copy of the MSI database + If ($ApplyTransformPath) { + Write-Log -Message "Applying transform file [$ApplyTransformPath] to MSI database [$TempMsiPath]." -Source ${CmdletName} + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'ApplyTransform' -ArgumentList @($ApplyTransformPath, $msiSuppressApplyTransformErrors) + } + + ## Determine the path for the new transform file that will be generated + If (-not $NewTransformPath) { + If ($ApplyTransformPath) { + [String]$NewTransformFileName = [IO.Path]::GetFileNameWithoutExtension($ApplyTransformPath) + '.new' + [IO.Path]::GetExtension($ApplyTransformPath) + } + Else { + [String]$NewTransformFileName = [IO.Path]::GetFileNameWithoutExtension($MsiPath) + '.mst' + } + [String]$NewTransformPath = Join-Path -Path $MsiParentFolder -ChildPath $NewTransformFileName -ErrorAction 'Stop' + } + + ## Set the MSI properties in the temporary copy of the MSI database + $TransformProperties.GetEnumerator() | ForEach-Object { Set-MsiProperty -DataBase $TempMsiPathDatabase -PropertyName $_.Key -PropertyValue $_.Value } + + ## Commit the new properties to the temporary copy of the MSI database + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'Commit' + + ## Reopen the temporary copy of the MSI database in read only mode + # Release the database object for the temporary copy of the MSI database + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($TempMsiPathDatabase) + # Open the temporary copy of the MSI database in read only mode + Write-Log -Message "Re-opening the MSI database [$TempMsiPath] in read only mode." -Source ${CmdletName} + [__ComObject]$TempMsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($TempMsiPath, $msiOpenDatabaseModeReadOnly) + + ## Delete the new transform file path if it already exists + If (Test-Path -LiteralPath $NewTransformPath -PathType 'Leaf' -ErrorAction 'Stop') { + Write-Log -Message "A transform file of the same name already exists. Deleting transform file [$NewTransformPath]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $NewTransformPath -Force -ErrorAction 'Stop' + } + + ## Generate the new transform file by taking the difference between the temporary copy of the MSI database and the original MSI database + Write-Log -Message "Generating new transform file [$NewTransformPath]." -Source ${CmdletName} + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'GenerateTransform' -ArgumentList @($MsiPathDatabase, $NewTransformPath) + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'CreateTransformSummaryInfo' -ArgumentList @($MsiPathDatabase, $NewTransformPath, $msiTransformErrorNone, $msiTransformValidationNone) + + If (Test-Path -LiteralPath $NewTransformPath -PathType 'Leaf' -ErrorAction 'Stop') { + Write-Log -Message "Successfully created new transform file in path [$NewTransformPath]." -Source ${CmdletName} + } + Else { + Throw "Failed to generate transform file in path [$NewTransformPath]." + } + } + Catch { + Write-Log -Message "Failed to create new transform file in path [$NewTransformPath]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create new transform file in path [$NewTransformPath]: $($_.Exception.Message)" + } + } + Finally { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($TempMsiPathDatabase) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($MsiPathDatabase) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) + } + Catch { + } + Try { + ## Delete the temporary copy of the MSI database + If (Test-Path -LiteralPath $TempMsiPath -PathType 'Leaf' -ErrorAction 'Stop') { + $null = Remove-Item -LiteralPath $TempMsiPath -Force -ErrorAction 'Stop' + } + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-MSUpdates Function Test-MSUpdates { -<# + <# .SYNOPSIS - Test whether a Microsoft Windows update is installed. + +Test whether a Microsoft Windows update is installed. + .DESCRIPTION - Test whether a Microsoft Windows update is installed. + +Test whether a Microsoft Windows update is installed. + .PARAMETER KBNumber - KBNumber of the update. + +KBNumber of the update. + .PARAMETER ContinueOnError - Suppress writing log message to console on failure to write message to log file. Default is: $true. + +Suppress writing log message to console on failure to write message to log file. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if the update is installed, otherwise returns $false. + .EXAMPLE - Test-MSUpdates -KBNumber 'KB2549864' + +Test-MSUpdates -KBNumber 'KB2549864' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,Position=0,HelpMessage='Enter the KB Number for the Microsoft Update')] - [ValidateNotNullorEmpty()] - [string]$KBNumber, - [Parameter(Mandatory=$false,Position=1)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Check if Microsoft Update [$kbNumber] is installed." -Source ${CmdletName} - - ## Default is not found - [boolean]$kbFound = $false - - ## Check for update using built in PS cmdlet which uses WMI in the background to gather details - Get-Hotfix -Id $kbNumber -ErrorAction 'SilentlyContinue' | ForEach-Object { $kbFound = $true } - - If (-not $kbFound) { - Write-Log -Message 'Unable to detect Windows update history via Get-Hotfix cmdlet. Trying via COM object.' -Source ${CmdletName} - - ## Check for update using ComObject method (to catch Office updates) - [__comobject]$UpdateSession = New-Object -ComObject "Microsoft.Update.Session" - [__comobject]$UpdateSearcher = $UpdateSession.CreateUpdateSearcher() - # Indicates whether the search results include updates that are superseded by other updates in the search results - $UpdateSearcher.IncludePotentiallySupersededUpdates = $false - # Indicates whether the UpdateSearcher goes online to search for updates. - $UpdateSearcher.Online = $false - [int32]$UpdateHistoryCount = $UpdateSearcher.GetTotalHistoryCount() - If ($UpdateHistoryCount -gt 0) { - [psobject]$UpdateHistory = $UpdateSearcher.QueryHistory(0, $UpdateHistoryCount) | - Select-Object -Property 'Title','Date', - @{Name = 'Operation'; Expression = { Switch ($_.Operation) { 1 {'Installation'}; 2 {'Uninstallation'}; 3 {'Other'} } } }, - @{Name = 'Status'; Expression = { Switch ($_.ResultCode) { 0 {'Not Started'}; 1 {'In Progress'}; 2 {'Successful'}; 3 {'Incomplete'}; 4 {'Failed'}; 5 {'Aborted'} } } }, - 'Description' | - Sort-Object -Property 'Date' -Descending - ForEach ($Update in $UpdateHistory) { - If (($Update.Operation -ne 'Other') -and ($Update.Title -match "\($KBNumber\)")) { - $LatestUpdateHistory = $Update - Break - } - } - If (($LatestUpdateHistory.Operation -eq 'Installation') -and ($LatestUpdateHistory.Status -eq 'Successful')) { - Write-Log -Message "Discovered the following Microsoft Update: `n$($LatestUpdateHistory | Format-List | Out-String)" -Source ${CmdletName} - $kbFound = $true - } - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSession) - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSearcher) - } - Else { - Write-Log -Message 'Unable to detect Windows update history via COM object.' -Source ${CmdletName} - } - } - - ## Return Result - If (-not $kbFound) { - Write-Log -Message "Microsoft Update [$kbNumber] is not installed." -Source ${CmdletName} - Write-Output -InputObject $false - } - Else { - Write-Log -Message "Microsoft Update [$kbNumber] is installed." -Source ${CmdletName} - Write-Output -InputObject $true - } - } - Catch { - Write-Log -Message "Failed discovering Microsoft Update [$kbNumber]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed discovering Microsoft Update [$kbNumber]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, HelpMessage = 'Enter the KB Number for the Microsoft Update')] + [ValidateNotNullorEmpty()] + [String]$KBNumber, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Checking if Microsoft Update [$kbNumber] is installed." -Source ${CmdletName} + + ## Default is not found + [Boolean]$kbFound = $false + + ## Check for update using built in PS cmdlet which uses WMI in the background to gather details + Get-HotFix -Id $kbNumber -ErrorAction 'SilentlyContinue' | ForEach-Object { $kbFound = $true } + + If (-not $kbFound) { + Write-Log -Message 'Unable to detect Windows update history via Get-Hotfix cmdlet. Trying via COM object.' -Source ${CmdletName} + + ## Check for update using ComObject method (to catch Office updates) + [__ComObject]$UpdateSession = New-Object -ComObject 'Microsoft.Update.Session' + [__ComObject]$UpdateSearcher = $UpdateSession.CreateUpdateSearcher() + # Indicates whether the search results include updates that are superseded by other updates in the search results + $UpdateSearcher.IncludePotentiallySupersededUpdates = $false + # Indicates whether the UpdateSearcher goes online to search for updates. + $UpdateSearcher.Online = $false + [Int32]$UpdateHistoryCount = $UpdateSearcher.GetTotalHistoryCount() + If ($UpdateHistoryCount -gt 0) { + [PSObject]$UpdateHistory = $UpdateSearcher.QueryHistory(0, $UpdateHistoryCount) | + Select-Object -Property 'Title', 'Date', + @{Name = 'Operation'; Expression = { Switch ($_.Operation) { + 1 { + 'Installation' + }; 2 { + 'Uninstallation' + }; 3 { + 'Other' + } + } } + }, + @{Name = 'Status'; Expression = { Switch ($_.ResultCode) { + 0 { + 'Not Started' + }; 1 { + 'In Progress' + }; 2 { + 'Successful' + }; 3 { + 'Incomplete' + }; 4 { + 'Failed' + }; 5 { + 'Aborted' + } + } } + }, + 'Description' | + Sort-Object -Property 'Date' -Descending + ForEach ($Update in $UpdateHistory) { + If (($Update.Operation -ne 'Other') -and ($Update.Title -match "\($KBNumber\)")) { + $LatestUpdateHistory = $Update + Break + } + } + If (($LatestUpdateHistory.Operation -eq 'Installation') -and ($LatestUpdateHistory.Status -eq 'Successful')) { + Write-Log -Message "Discovered the following Microsoft Update: `r`n$($LatestUpdateHistory | Format-List | Out-String)" -Source ${CmdletName} + $kbFound = $true + } + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSession) + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSearcher) + } + Else { + Write-Log -Message 'Unable to detect Windows update history via COM object.' -Source ${CmdletName} + } + } + + ## Return Result + If (-not $kbFound) { + Write-Log -Message "Microsoft Update [$kbNumber] is not installed." -Source ${CmdletName} + Write-Output -InputObject ($false) + } + Else { + Write-Log -Message "Microsoft Update [$kbNumber] is installed." -Source ${CmdletName} + Write-Output -InputObject ($true) + } + } + Catch { + Write-Log -Message "Failed discovering Microsoft Update [$kbNumber]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed discovering Microsoft Update [$kbNumber]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion -#region Function Install-MSUpdates -Function Install-MSUpdates { -<# -.SYNOPSIS - Install all Microsoft Updates in a given directory. -.DESCRIPTION - Install all Microsoft Updates of type ".exe", ".msu", or ".msp" in a given directory (recursively search directory). -.PARAMETER Directory - Directory containing the updates. +#region Function Install-MSUpdates +Function Install-MSUpdates { + <# +.SYNOPSIS + +Install all Microsoft Updates in a given directory. + +.DESCRIPTION + +Install all Microsoft Updates of type ".exe", ".msu", or ".msp" in a given directory (recursively search directory). + +.PARAMETER Directory + +Directory containing the updates. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Install-MSUpdates -Directory "$dirFiles\MSUpdates" + +Install-MSUpdates -Directory "$dirFiles\MSUpdates" + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$Directory - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Write-Log -Message "Recursively install all Microsoft Updates in directory [$Directory]." -Source ${CmdletName} - - ## KB Number pattern match - $kbPattern = '(?i)kb\d{6,8}' - - ## Get all hotfixes and install if required - [IO.FileInfo[]]$files = Get-ChildItem -LiteralPath $Directory -Recurse -Include ('*.exe','*.msu','*.msp') - ForEach ($file in $files) { - If ($file.Name -match 'redist') { - [version]$redistVersion = [Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName).ProductVersion - [string]$redistDescription = [Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName).FileDescription - - Write-Log -Message "Install [$redistDescription $redistVersion]..." -Source ${CmdletName} - # Handle older redistributables (ie, VC++ 2005) - If ($redistDescription -match 'Win32 Cabinet Self-Extractor') { - Execute-Process -Path $file.FullName -Parameters '/q' -WindowStyle 'Hidden' -ContinueOnError $true - } - Else { - Execute-Process -Path $file.FullName -Parameters '/quiet /norestart' -WindowStyle 'Hidden' -ContinueOnError $true - } - } - Else { - # Get the KB number of the file - [string]$kbNumber = [regex]::Match($file.Name, $kbPattern).ToString() - If (-not $kbNumber) { Continue } - - # Check to see whether the KB is already installed - If (-not (Test-MSUpdates -KBNumber $kbNumber)) { - Write-Log -Message "KB Number [$KBNumber] was not detected and will be installed." -Source ${CmdletName} - Switch ($file.Extension) { - # Installation type for executables (i.e., Microsoft Office Updates) - '.exe' { Execute-Process -Path $file.FullName -Parameters '/quiet /norestart' -WindowStyle 'Hidden' -ContinueOnError $true } - # Installation type for Windows updates using Windows Update Standalone Installer - '.msu' { Execute-Process -Path 'wusa.exe' -Parameters "`"$($file.FullName)`" /quiet /norestart" -WindowStyle 'Hidden' -ContinueOnError $true } - # Installation type for Windows Installer Patch - '.msp' { Execute-MSI -Action 'Patch' -Path $file.FullName -ContinueOnError $true } - } - } - Else { - Write-Log -Message "KB Number [$kbNumber] is already installed. Continue..." -Source ${CmdletName} - } - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Directory + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Write-Log -Message "Recursively installing all Microsoft Updates in directory [$Directory]." -Source ${CmdletName} + + ## KB Number pattern match + $kbPattern = '(?i)kb\d{6,8}' + + ## Get all hotfixes and install if required + [IO.FileInfo[]]$files = Get-ChildItem -LiteralPath $Directory -Recurse -Include ('*.exe', '*.msu', '*.msp') + ForEach ($file in $files) { + If ($file.Name -match 'redist') { + [Version]$redistVersion = [Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName).ProductVersion + [String]$redistDescription = [Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName).FileDescription + + Write-Log -Message "Installing [$redistDescription $redistVersion]..." -Source ${CmdletName} + # Handle older redistributables (ie, VC++ 2005) + If ($redistDescription -match 'Win32 Cabinet Self-Extractor') { + Execute-Process -Path $file.FullName -Parameters '/q' -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + Else { + Execute-Process -Path $file.FullName -Parameters '/quiet /norestart' -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + } + Else { + # Get the KB number of the file + [String]$kbNumber = [RegEx]::Match($file.Name, $kbPattern).ToString() + If (-not $kbNumber) { + Continue + } + + # Check to see whether the KB is already installed + If (-not (Test-MSUpdates -KBNumber $kbNumber)) { + Write-Log -Message "KB Number [$KBNumber] was not detected and will be installed." -Source ${CmdletName} + Switch ($file.Extension) { + # Installation type for executables (i.e., Microsoft Office Updates) + '.exe' { + Execute-Process -Path $file.FullName -Parameters '/quiet /norestart' -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + # Installation type for Windows updates using Windows Update Standalone Installer + '.msu' { + Execute-Process -Path $exeWusa -Parameters "`"$($file.FullName)`" /quiet /norestart" -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + # Installation type for Windows Installer Patch + '.msp' { + Execute-MSI -Action 'Patch' -Path $file.FullName -IgnoreExitCodes '*' + } + } + } + Else { + Write-Log -Message "KB Number [$kbNumber] is already installed. Continue..." -Source ${CmdletName} + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-WindowTitle Function Get-WindowTitle { -<# + <# .SYNOPSIS - Search for an open window title and return details about the window. + +Search for an open window title and return details about the window. + .DESCRIPTION - Search for a window title. If window title searched for returns more than one result, then details for each window will be displayed. - Returns the following properties for each window: WindowTitle, WindowHandle, ParentProcess, ParentProcessMainWindowHandle, ParentProcessId. - Function does not work in SYSTEM context unless launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + +Search for a window title. If window title searched for returns more than one result, then details for each window will be displayed. + +Returns the following properties for each window: WindowTitle, WindowHandle, ParentProcess, ParentProcessMainWindowHandle, ParentProcessId. + +Function does not work in SYSTEM context unless launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + .PARAMETER WindowTitle - The title of the application window to search for using regex matching. + +The title of the application window to search for using regex matching. + .PARAMETER GetAllWindowTitles - Get titles for all open windows on the system. + +Get titles for all open windows on the system. + .PARAMETER DisableFunctionLogging - Disables logging messages to the script log file. + +Disables logging messages to the script log file. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Management.Automation.PSObject + +Returns a PSObject with the following properties: WindowTitle, WindowHandle, ParentProcess, ParentProcessMainWindowHandle, ParentProcessId. + .EXAMPLE - Get-WindowTitle -WindowTitle 'Microsoft Word' - Gets details for each window that has the words "Microsoft Word" in the title. + +Get-WindowTitle -WindowTitle 'Microsoft Word' + +Gets details for each window that has the words "Microsoft Word" in the title. + .EXAMPLE - Get-WindowTitle -GetAllWindowTitles - Gets details for all windows with a title. + +Get-WindowTitle -GetAllWindowTitles + +Gets details for all windows with a title. + .EXAMPLE - Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.ParentProcess -eq 'WINWORD' } - Get details for all windows belonging to Microsoft Word process with name "WINWORD". + +Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.ParentProcess -eq 'WINWORD' } + +Get details for all windows belonging to Microsoft Word process with name "WINWORD". + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,ParameterSetName='SearchWinTitle')] - [AllowEmptyString()] - [string]$WindowTitle, - [Parameter(Mandatory=$true,ParameterSetName='GetAllWinTitles')] - [ValidateNotNullorEmpty()] - [switch]$GetAllWindowTitles = $false, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [switch]$DisableFunctionLogging = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - If ($PSCmdlet.ParameterSetName -eq 'SearchWinTitle') { - If (-not $DisableFunctionLogging) { Write-Log -Message "Find open window title(s) [$WindowTitle] using regex matching." -Source ${CmdletName} } - } - ElseIf ($PSCmdlet.ParameterSetName -eq 'GetAllWinTitles') { - If (-not $DisableFunctionLogging) { Write-Log -Message 'Find all open window title(s).' -Source ${CmdletName} } - } - - ## Get all window handles for visible windows - [IntPtr[]]$VisibleWindowHandles = [PSADT.UiAutomation]::EnumWindows() | Where-Object { [PSADT.UiAutomation]::IsWindowVisible($_) } - - ## Discover details about each visible window that was discovered - ForEach ($VisibleWindowHandle in $VisibleWindowHandles) { - If (-not $VisibleWindowHandle) { Continue } - ## Get the window title - [string]$VisibleWindowTitle = [PSADT.UiAutomation]::GetWindowText($VisibleWindowHandle) - If ($VisibleWindowTitle) { - ## Get the process that spawned the window - [Diagnostics.Process]$Process = Get-Process -ErrorAction 'Stop' | Where-Object { $_.Id -eq [PSADT.UiAutomation]::GetWindowThreadProcessId($VisibleWindowHandle) } - If ($Process) { - ## Build custom object with details about the window and the process - [psobject]$VisibleWindow = New-Object -TypeName 'PSObject' -Property @{ - WindowTitle = $VisibleWindowTitle - WindowHandle = $VisibleWindowHandle - ParentProcess= $Process.Name - ParentProcessMainWindowHandle = $Process.MainWindowHandle - ParentProcessId = $Process.Id - } - - ## Only save/return the window and process details which match the search criteria - If ($PSCmdlet.ParameterSetName -eq 'SearchWinTitle') { - $MatchResult = $VisibleWindow.WindowTitle -match $WindowTitle - If ($MatchResult) { - [psobject[]]$VisibleWindows += $VisibleWindow - } - } - ElseIf ($PSCmdlet.ParameterSetName -eq 'GetAllWinTitles') { - [psobject[]]$VisibleWindows += $VisibleWindow - } - } - } - } - } - Catch { - If (-not $DisableFunctionLogging) { Write-Log -Message "Failed to get requested window title(s). `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} } - } - } - End { - Write-Output -InputObject $VisibleWindows - - If ($DisableFunctionLogging) { . $RevertScriptLogging } - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'SearchWinTitle')] + [AllowEmptyString()] + [String]$WindowTitle, + [Parameter(Mandatory = $true, ParameterSetName = 'GetAllWinTitles')] + [ValidateNotNullorEmpty()] + [Switch]$GetAllWindowTitles = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$DisableFunctionLogging = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If ($PSCmdlet.ParameterSetName -eq 'SearchWinTitle') { + If (-not $DisableFunctionLogging) { + Write-Log -Message "Finding open window title(s) [$WindowTitle] using regex matching." -Source ${CmdletName} + } + } + ElseIf ($PSCmdlet.ParameterSetName -eq 'GetAllWinTitles') { + If (-not $DisableFunctionLogging) { + Write-Log -Message 'Finding all open window title(s).' -Source ${CmdletName} + } + } + + ## Get all window handles for visible windows + [IntPtr[]]$VisibleWindowHandles = [PSADT.UiAutomation]::EnumWindows() | Where-Object { [PSADT.UiAutomation]::IsWindowVisible($_) } + + ## Discover details about each visible window that was discovered + ForEach ($VisibleWindowHandle in $VisibleWindowHandles) { + If (-not $VisibleWindowHandle) { + Continue + } + ## Get the window title + [String]$VisibleWindowTitle = [PSADT.UiAutomation]::GetWindowText($VisibleWindowHandle) + If ($VisibleWindowTitle) { + ## Get the process that spawned the window + [Diagnostics.Process]$Process = Get-Process -ErrorAction 'Stop' | Where-Object { $_.Id -eq [PSADT.UiAutomation]::GetWindowThreadProcessId($VisibleWindowHandle) } + If ($Process) { + ## Build custom object with details about the window and the process + [PSObject]$VisibleWindow = New-Object -TypeName 'PSObject' -Property @{ + WindowTitle = $VisibleWindowTitle + WindowHandle = $VisibleWindowHandle + ParentProcess = $Process.ProcessName + ParentProcessMainWindowHandle = $Process.MainWindowHandle + ParentProcessId = $Process.Id + } + + ## Only save/return the window and process details which match the search criteria + If ($PSCmdlet.ParameterSetName -eq 'SearchWinTitle') { + $MatchResult = $VisibleWindow.WindowTitle -match $WindowTitle + If ($MatchResult) { + [PSObject[]]$VisibleWindows += $VisibleWindow + } + } + ElseIf ($PSCmdlet.ParameterSetName -eq 'GetAllWinTitles') { + [PSObject[]]$VisibleWindows += $VisibleWindow + } + } + } + } + } + Catch { + If (-not $DisableFunctionLogging) { + Write-Log -Message "Failed to get requested window title(s). `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + } + End { + Write-Output -InputObject ($VisibleWindows) + + If ($DisableFunctionLogging) { + . $RevertScriptLogging + } + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Send-Keys Function Send-Keys { -<# + <# .SYNOPSIS - Send a sequence of keys to one or more application windows. + +Send a sequence of keys to one or more application windows. + .DESCRIPTION - Send a sequence of keys to one or more application window. If window title searched for returns more than one window, then all of them will receive the sent keys. - Function does not work in SYSTEM context unless launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + +Send a sequence of keys to one or more application window. If window title searched for returns more than one window, then all of them will receive the sent keys. + +Function does not work in SYSTEM context unless launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + .PARAMETER WindowTitle - The title of the application window to search for using regex matching. + +The title of the application window to search for using regex matching. + .PARAMETER GetAllWindowTitles - Get titles for all open windows on the system. + +Get titles for all open windows on the system. + .PARAMETER WindowHandle - Send keys to a specific window where the Window Handle is already known. + +Send keys to a specific window where the Window Handle is already known. + .PARAMETER Keys - The sequence of keys to send. Info on Key input at: http://msdn.microsoft.com/en-us/library/System.Windows.Forms.SendKeys(v=vs.100).aspx + +The sequence of keys to send. Info on Key input at: http://msdn.microsoft.com/en-us/library/System.Windows.Forms.SendKeys(v=vs.100).aspx + .PARAMETER WaitSeconds - An optional number of seconds to wait after the sending of the keys. + +An optional number of seconds to wait after the sending of the keys. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Send-Keys -WindowTitle 'foobar - Notepad' -Key 'Hello world' - Send the sequence of keys "Hello world" to the application titled "foobar - Notepad". + +Send-Keys -WindowTitle 'foobar - Notepad' -Key 'Hello world' + +Send the sequence of keys "Hello world" to the application titled "foobar - Notepad". + .EXAMPLE - Send-Keys -WindowTitle 'foobar - Notepad' -Key 'Hello world' -WaitSeconds 5 - Send the sequence of keys "Hello world" to the application titled "foobar - Notepad" and wait 5 seconds. + +Send-Keys -WindowTitle 'foobar - Notepad' -Key 'Hello world' -WaitSeconds 5 + +Send the sequence of keys "Hello world" to the application titled "foobar - Notepad" and wait 5 seconds. + .EXAMPLE - Send-Keys -WindowHandle ([IntPtr]17368294) -Key 'Hello world' - Send the sequence of keys "Hello world" to the application with a Window Handle of '17368294'. + +Send-Keys -WindowHandle ([IntPtr]17368294) -Key 'Hello world' + +Send the sequence of keys "Hello world" to the application with a Window Handle of '17368294'. + .NOTES + .LINK - http://msdn.microsoft.com/en-us/library/System.Windows.Forms.SendKeys(v=vs.100).aspx - http://psappdeploytoolkit.com + +http://msdn.microsoft.com/en-us/library/System.Windows.Forms.SendKeys(v=vs.100).aspx + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false,Position=0)] - [AllowEmptyString()] - [ValidateNotNull()] - [string]$WindowTitle, - [Parameter(Mandatory=$false,Position=1)] - [ValidateNotNullorEmpty()] - [switch]$GetAllWindowTitles = $false, - [Parameter(Mandatory=$false,Position=2)] - [ValidateNotNullorEmpty()] - [IntPtr]$WindowHandle, - [Parameter(Mandatory=$false,Position=3)] - [ValidateNotNullorEmpty()] - [string]$Keys, - [Parameter(Mandatory=$false,Position=4)] - [ValidateNotNullorEmpty()] - [int32]$WaitSeconds - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## Load assembly containing class System.Windows.Forms.SendKeys - Add-Type -AssemblyName 'System.Windows.Forms' -ErrorAction 'Stop' - - [scriptblock]$SendKeys = { - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [IntPtr]$WindowHandle - ) - Try { - ## Bring the window to the foreground - [boolean]$IsBringWindowToFrontSuccess = [PSADT.UiAutomation]::BringWindowToFront($WindowHandle) - If (-not $IsBringWindowToFrontSuccess) { Throw 'Failed to bring window to foreground.'} - - ## Send the Key sequence - If ($Keys) { - [boolean]$IsWindowModal = If ([PSADT.UiAutomation]::IsWindowEnabled($WindowHandle)) { $false } Else { $true } - If ($IsWindowModal) { Throw 'Unable to send keys to window because it may be disabled due to a modal dialog being shown.' } - [Windows.Forms.SendKeys]::SendWait($Keys) - Write-Log -Message "Sent key(s) [$Keys] to window title [$($Window.WindowTitle)] with window handle [$WindowHandle]." -Source ${CmdletName} - - If ($WaitSeconds) { - Write-Log -Message "Sleeping for [$WaitSeconds] seconds." -Source ${CmdletName} - Start-Sleep -Seconds $WaitSeconds - } - } - } - Catch { - Write-Log -Message "Failed to send keys to window title [$($Window.WindowTitle)] with window handle [$WindowHandle]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - } - Process { - Try { - If ($WindowHandle) { - [psobject]$Window = Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.WindowHandle -eq $WindowHandle } - If (-not $Window) { - Write-Log -Message "No windows with Window Handle [$WindowHandle] were discovered." -Severity 2 -Source ${CmdletName} - Return - } - & $SendKeys -WindowHandle $Window.WindowHandle - } - Else { - [hashtable]$GetWindowTitleSplat = @{} - If ($GetAllWindowTitles) { $GetWindowTitleSplat.Add( 'GetAllWindowTitles', $GetAllWindowTitles) } - Else { $GetWindowTitleSplat.Add( 'WindowTitle', $WindowTitle) } - [psobject[]]$AllWindows = Get-WindowTitle @GetWindowTitleSplat - If (-not $AllWindows) { - Write-Log -Message 'No windows with the specified details were discovered.' -Severity 2 -Source ${CmdletName} - Return - } - - ForEach ($Window in $AllWindows) { - & $SendKeys -WindowHandle $Window.WindowHandle - } - } - } - Catch { - Write-Log -Message "Failed to send keys to specified window. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false, Position = 0)] + [AllowEmptyString()] + [ValidateNotNull()] + [String]$WindowTitle, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [Switch]$GetAllWindowTitles = $false, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNullorEmpty()] + [IntPtr]$WindowHandle, + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [String]$Keys, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [Int32]$WaitSeconds + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [ScriptBlock]$SendKeys = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [IntPtr]$WindowHandle + ) + Try { + ## Bring the window to the foreground + [Boolean]$IsBringWindowToFrontSuccess = [PSADT.UiAutomation]::BringWindowToFront($WindowHandle) + If (-not $IsBringWindowToFrontSuccess) { + Throw 'Failed to bring window to foreground.' + } + + ## Send the Key sequence + If ($Keys) { + [Boolean]$IsWindowModal = If ([PSADT.UiAutomation]::IsWindowEnabled($WindowHandle)) { + $false + } + Else { + $true + } + If ($IsWindowModal) { + Throw 'Unable to send keys to window because it may be disabled due to a modal dialog being shown.' + } + Write-Log -Message "Sending key(s) [$Keys] to window title [$($Window.WindowTitle)] with window handle [$WindowHandle]." -Source ${CmdletName} + [Windows.Forms.SendKeys]::SendWait($Keys) + If ($WaitSeconds) { + Write-Log -Message "Sleeping for [$WaitSeconds] seconds." -Source ${CmdletName} + Start-Sleep -Seconds $WaitSeconds + } + } + } + Catch { + Write-Log -Message "Failed to send keys to window title [$($Window.WindowTitle)] with window handle [$WindowHandle]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + } + Process { + Try { + If ($WindowHandle) { + [PSObject]$Window = Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.WindowHandle -eq $WindowHandle } + If (-not $Window) { + Write-Log -Message "No windows with Window Handle [$WindowHandle] were discovered." -Severity 2 -Source ${CmdletName} + Return + } + & $SendKeys -WindowHandle $Window.WindowHandle + } + Else { + [Hashtable]$GetWindowTitleSplat = @{} + If ($GetAllWindowTitles) { + $GetWindowTitleSplat.Add( 'GetAllWindowTitles', $GetAllWindowTitles) + } + Else { + $GetWindowTitleSplat.Add( 'WindowTitle', $WindowTitle) + } + [PSObject[]]$AllWindows = Get-WindowTitle @GetWindowTitleSplat + If (-not $AllWindows) { + Write-Log -Message 'No windows with the specified details were discovered.' -Severity 2 -Source ${CmdletName} + Return + } + + ForEach ($Window in $AllWindows) { + & $SendKeys -WindowHandle $Window.WindowHandle + } + } + } + Catch { + Write-Log -Message "Failed to send keys to specified window. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-Battery Function Test-Battery { -<# + <# .SYNOPSIS - Tests whether the local machine is running on AC power or not. + +Tests whether the local machine is running on AC power or not. + .DESCRIPTION - Tests whether the local machine is running on AC power and returns true/false. For detailed information, use -PassThru option. + +Tests whether the local machine is running on AC power and returns true/false. For detailed information, use -PassThru option. + .PARAMETER PassThru - Outputs a hashtable containing the following properties: - IsLaptop, IsUsingACPower, ACPowerLineStatus, BatteryChargeStatus, BatteryLifePercent, BatteryLifeRemaining, BatteryFullLifetime + +Outputs a hashtable containing the following properties: + +IsLaptop, IsUsingACPower, ACPowerLineStatus, BatteryChargeStatus, BatteryLifePercent, BatteryLifeRemaining, BatteryFullLifetime + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Hashtable. + +Returns a hashtable containing the following properties +- IsLaptop +- IsUsingACPower +- ACPowerLineStatus +- BatteryChargeStatus +- BatteryLifePercent +- BatteryLifeRemaining +- BatteryFullLifetime + .EXAMPLE - Test-Battery + +Test-Battery + .EXAMPLE - (Test-Battery -PassThru).IsLaptop - Determines if the current system is a laptop or not. + +(Test-Battery -PassThru).IsLaptop + +Determines if the current system is a laptop or not. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$PassThru = $false - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## PowerStatus class found in this assembly is more reliable than WMI in cases where the battery is failing. - Add-Type -Assembly 'System.Windows.Forms' -ErrorAction 'SilentlyContinue' - - ## Initialize a hashtable to store information about system type and power status - [hashtable]$SystemTypePowerStatus = @{ } - } - Process { - Write-Log -Message 'Check if system is using AC power or if it is running on battery...' -Source ${CmdletName} - - [Windows.Forms.PowerStatus]$PowerStatus = [Windows.Forms.SystemInformation]::PowerStatus - - ## Get the system power status. Indicates whether the system is using AC power or if the status is unknown. Possible values: - # Offline : The system is not using AC power. - # Online : The system is using AC power. - # Unknown : The power status of the system is unknown. - [string]$PowerLineStatus = $PowerStatus.PowerLineStatus - $SystemTypePowerStatus.Add('ACPowerLineStatus', $PowerStatus.PowerLineStatus) - - ## Get the current battery charge status. Possible values: High, Low, Critical, Charging, NoSystemBattery, Unknown. - [string]$BatteryChargeStatus = $PowerStatus.BatteryChargeStatus - $SystemTypePowerStatus.Add('BatteryChargeStatus', $PowerStatus.BatteryChargeStatus) - - ## Get the approximate amount, from 0.00 to 1.0, of full battery charge remaining. - # This property can report 1.0 when the battery is damaged and Windows can't detect a battery. - # Therefore, this property is only indicative of battery charge remaining if 'BatteryChargeStatus' property is not reporting 'NoSystemBattery' or 'Unknown'. - [single]$BatteryLifePercent = $PowerStatus.BatteryLifePercent - If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { - [single]$BatteryLifePercent = 0.0 - } - $SystemTypePowerStatus.Add('BatteryLifePercent', $PowerStatus.BatteryLifePercent) - - ## The reported approximate number of seconds of battery life remaining. It will report –1 if the remaining life is unknown because the system is on AC power. - [int32]$BatteryLifeRemaining = $PowerStatus.BatteryLifeRemaining - $SystemTypePowerStatus.Add('BatteryLifeRemaining', $PowerStatus.BatteryLifeRemaining) - - ## Get the manufacturer reported full charge lifetime of the primary battery power source in seconds. - # The reported number of seconds of battery life available when the battery is fully charged, or -1 if it is unknown. - # This will only be reported if the battery supports reporting this information. You will most likely get -1, indicating unknown. - [int32]$BatteryFullLifetime = $PowerStatus.BatteryFullLifetime - $SystemTypePowerStatus.Add('BatteryFullLifetime', $PowerStatus.BatteryFullLifetime) - - ## Determine if the system is using AC power - [boolean]$OnACPower = $false - If ($PowerLineStatus -eq 'Online') { - Write-Log -Message 'System is using AC power.' -Source ${CmdletName} - $OnACPower = $true - } - ElseIf ($PowerLineStatus -eq 'Offline') { - Write-Log -Message 'System is using battery power.' -Source ${CmdletName} - } - ElseIf ($PowerLineStatus -eq 'Unknown') { - If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { - Write-Log -Message "System power status is [$PowerLineStatus] and battery charge status is [$BatteryChargeStatus]. This is most likely due to a damaged battery so we will report system is using AC power." -Source ${CmdletName} - $OnACPower = $true - } - Else { - Write-Log -Message "System power status is [$PowerLineStatus] and battery charge status is [$BatteryChargeStatus]. Therefore, we will report system is using battery power." -Source ${CmdletName} - } - } - $SystemTypePowerStatus.Add('IsUsingACPower', $OnACPower) - - ## Determine if the system is a laptop - [boolean]$IsLaptop = $false - If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { - $IsLaptop = $false - } - Else { - $IsLaptop = $true - } - # Chassis Types - [int32[]]$ChassisTypes = Get-WmiObject -Class 'Win32_SystemEnclosure' | Where-Object { $_.ChassisTypes } | Select-Object -ExpandProperty 'ChassisTypes' - Write-Log -Message "The following system chassis types were detected [$($ChassisTypes -join ',')]." -Source ${CmdletName} - ForEach ($ChassisType in $ChassisTypes) { - Switch ($ChassisType) { - { $_ -eq 9 -or $_ -eq 10 -or $_ -eq 14 } { $IsLaptop = $true } # 9=Laptop, 10=Notebook, 14=Sub Notebook - { $_ -eq 3 } { $IsLaptop = $false } # 3=Desktop - } - } - # Add IsLaptop property to hashtable - $SystemTypePowerStatus.Add('IsLaptop', $IsLaptop) - - If ($PassThru) { - Write-Output -InputObject $SystemTypePowerStatus - } - Else { - Write-Output -InputObject $OnACPower - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Initialize a hashtable to store information about system type and power status + [Hashtable]$SystemTypePowerStatus = @{ } + } + Process { + Write-Log -Message 'Checking if system is using AC power or if it is running on battery...' -Source ${CmdletName} + + [Windows.Forms.PowerStatus]$PowerStatus = [Windows.Forms.SystemInformation]::PowerStatus + + ## Get the system power status. Indicates whether the system is using AC power or if the status is unknown. Possible values: + # Offline : The system is not using AC power. + # Online : The system is using AC power. + # Unknown : The power status of the system is unknown. + [String]$PowerLineStatus = $PowerStatus.PowerLineStatus + $SystemTypePowerStatus.Add('ACPowerLineStatus', $PowerStatus.PowerLineStatus) + + ## Get the current battery charge status. Possible values: High, Low, Critical, Charging, NoSystemBattery, Unknown. + [String]$BatteryChargeStatus = $PowerStatus.BatteryChargeStatus + $SystemTypePowerStatus.Add('BatteryChargeStatus', $PowerStatus.BatteryChargeStatus) + + ## Get the approximate amount, from 0.00 to 1.0, of full battery charge remaining. + # This property can report 1.0 when the battery is damaged and Windows can't detect a battery. + # Therefore, this property is only indicative of battery charge remaining if 'BatteryChargeStatus' property is not reporting 'NoSystemBattery' or 'Unknown'. + [Single]$BatteryLifePercent = $PowerStatus.BatteryLifePercent + If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { + [Single]$BatteryLifePercent = 0.0 + } + $SystemTypePowerStatus.Add('BatteryLifePercent', $PowerStatus.BatteryLifePercent) + + ## The reported approximate number of seconds of battery life remaining. It will report -1 if the remaining life is unknown because the system is on AC power. + [Int32]$BatteryLifeRemaining = $PowerStatus.BatteryLifeRemaining + $SystemTypePowerStatus.Add('BatteryLifeRemaining', $PowerStatus.BatteryLifeRemaining) + + ## Get the manufacturer reported full charge lifetime of the primary battery power source in seconds. + # The reported number of seconds of battery life available when the battery is fully charged, or -1 if it is unknown. + # This will only be reported if the battery supports reporting this information. You will most likely get -1, indicating unknown. + [Int32]$BatteryFullLifetime = $PowerStatus.BatteryFullLifetime + $SystemTypePowerStatus.Add('BatteryFullLifetime', $PowerStatus.BatteryFullLifetime) + + ## Determine if the system is using AC power + [Boolean]$OnACPower = $false + Switch ($PowerLineStatus) { + 'Online' { + Write-Log -Message 'System is using AC power.' -Source ${CmdletName} + $OnACPower = $true + } + 'Offline' { + Write-Log -Message 'System is using battery power.' -Source ${CmdletName} + } + 'Unknown' { + If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { + Write-Log -Message "System power status is [$PowerLineStatus] and battery charge status is [$BatteryChargeStatus]. This is most likely due to a damaged battery so we will report system is using AC power." -Source ${CmdletName} + $OnACPower = $true + } + Else { + Write-Log -Message "System power status is [$PowerLineStatus] and battery charge status is [$BatteryChargeStatus]. Therefore, we will report system is using battery power." -Source ${CmdletName} + } + } + } + $SystemTypePowerStatus.Add('IsUsingACPower', $OnACPower) + + ## Determine if the system is a laptop + [Boolean]$IsLaptop = $false + If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { + $IsLaptop = $false + } + Else { + $IsLaptop = $true + } + # Chassis Types + [Int32[]]$ChassisTypes = Get-WmiObject -Class 'Win32_SystemEnclosure' | Where-Object { $_.ChassisTypes } | Select-Object -ExpandProperty 'ChassisTypes' + Write-Log -Message "The following system chassis types were detected [$($ChassisTypes -join ',')]." -Source ${CmdletName} + ForEach ($ChassisType in $ChassisTypes) { + Switch ($ChassisType) { + 9 { + $IsLaptop = $true + } # 9=Laptop + 10 { + $IsLaptop = $true + } # 10=Notebook + 14 { + $IsLaptop = $true + } # 14=Sub Notebook + 3 { + $IsLaptop = $false + } # 3=Desktop + } + } + # Add IsLaptop property to hashtable + $SystemTypePowerStatus.Add('IsLaptop', $IsLaptop) + + If ($PassThru) { + Write-Output -InputObject ($SystemTypePowerStatus) + } + Else { + Write-Output -InputObject ($OnACPower) + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-NetworkConnection Function Test-NetworkConnection { -<# + <# .SYNOPSIS - Tests for an active local network connection, excluding wireless and virtual network adapters. + +Tests for an active local network connection, excluding wireless and virtual network adapters. + .DESCRIPTION - Tests for an active local network connection, excluding wireless and virtual network adapters, by querying the Win32_NetworkAdapter WMI class. + +Tests for an active local network connection, excluding wireless and virtual network adapters, by querying the Win32_NetworkAdapter WMI class. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if a wired network connection is detected, otherwise returns $false. + .EXAMPLE - Test-NetworkConnection + +Test-NetworkConnection + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Write-Log -Message 'Check if system is using a wired network connection...' -Source ${CmdletName} - - [psobject[]]$networkConnected = Get-WmiObject -Class 'Win32_NetworkAdapter' | Where-Object { ($_.NetConnectionStatus -eq 2) -and ($_.NetConnectionID -match 'Local') -and ($_.NetConnectionID -notmatch 'Wireless') -and ($_.Name -notmatch 'Virtual') } -ErrorAction 'SilentlyContinue' - [boolean]$onNetwork = $false - If ($networkConnected) { - Write-Log -Message 'Wired network connection found.' -Source ${CmdletName} - [boolean]$onNetwork = $true - } - Else { - Write-Log -Message 'Wired network connection not found.' -Source ${CmdletName} - } - - Write-Output -InputObject $onNetwork - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Write-Log -Message 'Checking if system is using a wired network connection...' -Source ${CmdletName} + + [PSObject[]]$networkConnected = Get-WmiObject -Class 'Win32_NetworkAdapter' | Where-Object { ($_.NetConnectionStatus -eq 2) -and ($_.NetConnectionID -match 'Local' -or $_.NetConnectionID -match 'Ethernet') -and ($_.NetConnectionID -notmatch 'Wireless') -and ($_.Name -notmatch 'Virtual') } -ErrorAction 'SilentlyContinue' + [Boolean]$onNetwork = $false + If ($networkConnected) { + Write-Log -Message 'Wired network connection found.' -Source ${CmdletName} + [Boolean]$onNetwork = $true + } + Else { + Write-Log -Message 'Wired network connection not found.' -Source ${CmdletName} + } + + Write-Output -InputObject ($onNetwork) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-PowerPoint Function Test-PowerPoint { -<# + <# .SYNOPSIS - Tests whether PowerPoint is running in either fullscreen slideshow mode or presentation mode. + +Tests whether PowerPoint is running in either fullscreen slideshow mode or presentation mode. + .DESCRIPTION - Tests whether someone is presenting using PowerPoint in either fullscreen slideshow mode or presentation mode. + +Tests whether someone is presenting using PowerPoint in either fullscreen slideshow mode or presentation mode. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if PowerPoint is running in either fullscreen slideshow mode or presentation mode, otherwise returns $false. + .EXAMPLE - Test-PowerPoint + +Test-PowerPoint + .NOTES - This function can only execute detection logic if the process is in interactive mode. - There is a possiblity of a false positive if the PowerPoint filename starts with "PowerPoint Slide Show". + +This function can only execute detection logic if the process is in interactive mode. + +There is a possiblity of a false positive if the PowerPoint filename starts with "PowerPoint Slide Show". + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Check if PowerPoint is in either fullscreen slideshow mode or presentation mode...' -Source ${CmdletName} - Try { - [Diagnostics.Process[]]$PowerPointProcess = Get-Process -ErrorAction 'Stop' | Where-Object { $_.ProcessName -eq 'POWERPNT' } - If ($PowerPointProcess) { - [boolean]$IsPowerPointRunning = $true - Write-Log -Message 'PowerPoint application is running.' -Source ${CmdletName} - } - Else { - [boolean]$IsPowerPointRunning = $false - Write-Log -Message 'PowerPoint application is not running.' -Source ${CmdletName} - } - } - Catch { - Throw - } - - [nullable[boolean]]$IsPowerPointFullScreen = $false - If ($IsPowerPointRunning) { - ## Detect if PowerPoint is in fullscreen mode or Presentation Mode, detection method only works if process is interactive - If ([Environment]::UserInteractive) { - # Check if "POWERPNT" process has a window with a title that begins with "PowerPoint Slide Show" or "Powerpoint-" for non-English language systems. - # There is a possiblity of a false positive if the PowerPoint filename starts with "PowerPoint Slide Show" - [psobject]$PowerPointWindow = Get-WindowTitle -GetAllWindowTitles | Where { $_.WindowTitle -match '^PowerPoint Slide Show' -or $_.WindowTitle -match '^PowerPoint-' } | Where-Object { $_.ParentProcess -eq 'POWERPNT'} | Select-Object -First 1 - If ($PowerPointWindow) { - [nullable[boolean]]$IsPowerPointFullScreen = $true - Write-Log -Message 'Detected that PowerPoint process [POWERPNT] has a window with a title that beings with [PowerPoint Slide Show] or [PowerPoint-].' -Source ${CmdletName} - } - Else { - Write-Log -Message 'Detected that PowerPoint process [POWERPNT] does not have a window with a title that beings with [PowerPoint Slide Show] or [PowerPoint-].' -Source ${CmdletName} - Try { - [int32[]]$PowerPointProcessIDs = $PowerPointProcess | Select-Object -ExpandProperty 'Id' -ErrorAction 'Stop' - Write-Log -Message "PowerPoint process [POWERPNT] has process id(s) [$($PowerPointProcessIDs -join ', ')]." -Source ${CmdletName} - } - Catch { - Write-Log -Message "Unable to retrieve process id(s) for [POWERPNT] process. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - } - } - - ## If previous detection method did not detect PowerPoint in fullscreen mode, then check if PowerPoint is in Presentation Mode (check only works on Windows Vista or higher) - If ((-not $IsPowerPointFullScreen) -and (([version]$envOSVersion).Major -gt 5)) { - # Note: below method does not detect PowerPoint presentation mode if the presentation is on a monitor that does not have current mouse input control - [string]$UserNotificationState = [PSADT.UiAutomation]::GetUserNotificationState() - Write-Log -Message "Detected user notification state [$UserNotificationState]." -Source ${CmdletName} - Switch ($UserNotificationState) { - 'PresentationMode' { - Write-Log -Message "Detected that system is in [Presentation Mode]." -Source ${CmdletName} - [nullable[boolean]]$IsPowerPointFullScreen = $true - } - 'FullScreenOrPresentationModeOrLoginScreen' { - If (([string]$PowerPointProcessIDs) -and ($PowerPointProcessIDs -contains [PSADT.UIAutomation]::GetWindowThreadProcessID([PSADT.UIAutomation]::GetForeGroundWindow()))) { - Write-Log -Message "Detected that fullscreen foreground window matches PowerPoint process id." -Source ${CmdletName} - [nullable[boolean]]$IsPowerPointFullScreen = $true - } - } - } - } - } - Else { - [nullable[boolean]]$IsPowerPointFullScreen = $null - Write-Log -Message 'Unable to run check to see if PowerPoint is in fullscreen mode or Presentation Mode because current process is not interactive. Configure script to run in interactive mode in your deployment tool. If using SCCM Application Model, then make sure "Allow users to view and interact with the program installation" is selected. If using SCCM Package Model, then make sure "Allow users to interact with this program" is selected.' -Severity 2 -Source ${CmdletName} - } - } - } - Catch { - [nullable[boolean]]$IsPowerPointFullScreen = $null - Write-Log -Message "Failed check to see if PowerPoint is running in fullscreen slideshow mode. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-Log -Message "PowerPoint is running in fullscreen mode [$IsPowerPointFullScreen]." -Source ${CmdletName} - Write-Output -InputObject $IsPowerPointFullScreen - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Checking if PowerPoint is in either fullscreen slideshow mode or presentation mode...' -Source ${CmdletName} + Try { + [Diagnostics.Process[]]$PowerPointProcess = Get-Process -ErrorAction 'Stop' | Where-Object { $_.ProcessName -eq 'POWERPNT' } + If ($PowerPointProcess) { + [Boolean]$IsPowerPointRunning = $true + Write-Log -Message 'PowerPoint application is running.' -Source ${CmdletName} + } + Else { + [Boolean]$IsPowerPointRunning = $false + Write-Log -Message 'PowerPoint application is not running.' -Source ${CmdletName} + } + } + Catch { + Throw + } + + [Nullable[Boolean]]$IsPowerPointFullScreen = $false + If ($IsPowerPointRunning) { + ## Detect if PowerPoint is in fullscreen mode or Presentation Mode, detection method only works if process is interactive + If ([Environment]::UserInteractive) { + # Check if "POWERPNT" process has a window with a title that begins with "PowerPoint Slide Show" or "Powerpoint-" for non-English language systems. + # There is a possiblity of a false positive if the PowerPoint filename starts with "PowerPoint Slide Show" + [PSObject]$PowerPointWindow = Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.WindowTitle -match '^PowerPoint Slide Show' -or $_.WindowTitle -match '^PowerPoint-' } | Where-Object { $_.ParentProcess -eq 'POWERPNT' } | Select-Object -First 1 + If ($PowerPointWindow) { + [Nullable[Boolean]]$IsPowerPointFullScreen = $true + Write-Log -Message 'Detected that PowerPoint process [POWERPNT] has a window with a title that beings with [PowerPoint Slide Show] or [PowerPoint-].' -Source ${CmdletName} + } + Else { + Write-Log -Message 'Detected that PowerPoint process [POWERPNT] does not have a window with a title that beings with [PowerPoint Slide Show] or [PowerPoint-].' -Source ${CmdletName} + Try { + [Int32[]]$PowerPointProcessIDs = $PowerPointProcess | Select-Object -ExpandProperty 'Id' -ErrorAction 'Stop' + Write-Log -Message "PowerPoint process [POWERPNT] has process id(s) [$($PowerPointProcessIDs -join ', ')]." -Source ${CmdletName} + } + Catch { + Write-Log -Message "Unable to retrieve process id(s) for [POWERPNT] process. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + + ## If previous detection method did not detect PowerPoint in fullscreen mode, then check if PowerPoint is in Presentation Mode (check only works on Windows Vista or higher) + If ((-not $IsPowerPointFullScreen) -and (([Version]$envOSVersion).Major -gt 5)) { + # Note: below method does not detect PowerPoint presentation mode if the presentation is on a monitor that does not have current mouse input control + [String]$UserNotificationState = [PSADT.UiAutomation]::GetUserNotificationState() + Write-Log -Message "Detected user notification state [$UserNotificationState]." -Source ${CmdletName} + Switch ($UserNotificationState) { + 'PresentationMode' { + Write-Log -Message 'Detected that system is in [Presentation Mode].' -Source ${CmdletName} + [Nullable[Boolean]]$IsPowerPointFullScreen = $true + } + 'FullScreenOrPresentationModeOrLoginScreen' { + If (([String]$PowerPointProcessIDs) -and ($PowerPointProcessIDs -contains [PSADT.UIAutomation]::GetWindowThreadProcessID([PSADT.UIAutomation]::GetForeGroundWindow()))) { + Write-Log -Message 'Detected that fullscreen foreground window matches PowerPoint process id.' -Source ${CmdletName} + [Nullable[Boolean]]$IsPowerPointFullScreen = $true + } + } + } + } + } + Else { + [Nullable[Boolean]]$IsPowerPointFullScreen = $null + Write-Log -Message 'Unable to run check to see if PowerPoint is in fullscreen mode or Presentation Mode because current process is not interactive. Configure script to run in interactive mode in your deployment tool. If using SCCM Application Model, then make sure "Allow users to view and interact with the program installation" is selected. If using SCCM Package Model, then make sure "Allow users to interact with this program" is selected.' -Severity 2 -Source ${CmdletName} + } + } + } + Catch { + [Nullable[Boolean]]$IsPowerPointFullScreen = $null + Write-Log -Message "Failed check to see if PowerPoint is running in fullscreen slideshow mode. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-Log -Message "PowerPoint is running in fullscreen mode [$IsPowerPointFullScreen]." -Source ${CmdletName} + Write-Output -InputObject ($IsPowerPointFullScreen) + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Invoke-SCCMTask Function Invoke-SCCMTask { -<# + <# .SYNOPSIS - Triggers SCCM to invoke the requested schedule task id. + +Triggers SCCM to invoke the requested schedule task id. + .DESCRIPTION - Triggers SCCM to invoke the requested schedule task id. + +Triggers SCCM to invoke the requested schedule task id. + .PARAMETER ScheduleId - Name of the schedule id to trigger. - Options: HardwareInventory, SoftwareInventory, HeartbeatDiscovery, SoftwareInventoryFileCollection, RequestMachinePolicy, EvaluateMachinePolicy, - LocationServicesCleanup, SoftwareMeteringReport, SourceUpdate, PolicyAgentCleanup, RequestMachinePolicy2, CertificateMaintenance, PeerDistributionPointStatus, - PeerDistributionPointProvisioning, ComplianceIntervalEnforcement, SoftwareUpdatesAgentAssignmentEvaluation, UploadStateMessage, StateMessageManager, - SoftwareUpdatesScan, AMTProvisionCycle, UpdateStorePolicy, StateSystemBulkSend, ApplicationManagerPolicyAction, PowerManagementStartSummarizer + +Name of the schedule id to trigger. + +Options: HardwareInventory, SoftwareInventory, HeartbeatDiscovery, SoftwareInventoryFileCollection, RequestMachinePolicy, EvaluateMachinePolicy, +LocationServicesCleanup, SoftwareMeteringReport, SourceUpdate, PolicyAgentCleanup, RequestMachinePolicy2, CertificateMaintenance, PeerDistributionPointStatus, +PeerDistributionPointProvisioning, ComplianceIntervalEnforcement, SoftwareUpdatesAgentAssignmentEvaluation, UploadStateMessage, StateMessageManager, +SoftwareUpdatesScan, AMTProvisionCycle, UpdateStorePolicy, StateSystemBulkSend, ApplicationManagerPolicyAction, PowerManagementStartSummarizer + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Invoke-SCCMTask 'SoftwareUpdatesScan' + +Invoke-SCCMTask 'SoftwareUpdatesScan' + .EXAMPLE - Invoke-SCCMTask + +Invoke-SCCMTask + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateSet('HardwareInventory','SoftwareInventory','HeartbeatDiscovery','SoftwareInventoryFileCollection','RequestMachinePolicy','EvaluateMachinePolicy','LocationServicesCleanup','SoftwareMeteringReport','SourceUpdate','PolicyAgentCleanup','RequestMachinePolicy2','CertificateMaintenance','PeerDistributionPointStatus','PeerDistributionPointProvisioning','ComplianceIntervalEnforcement','SoftwareUpdatesAgentAssignmentEvaluation','UploadStateMessage','StateMessageManager','SoftwareUpdatesScan','AMTProvisionCycle','UpdateStorePolicy','StateSystemBulkSend','ApplicationManagerPolicyAction','PowerManagementStartSummarizer')] - [string]$ScheduleID, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Invoke SCCM Schedule Task ID [$ScheduleId]..." -Source ${CmdletName} - - ## Make sure SCCM client is installed and running - Write-Log -Message 'Check to see if SCCM Client service [ccmexec] is installed and running.' -Source ${CmdletName} - If (Test-ServiceExists -Name 'ccmexec') { - If ($(Get-Service -Name 'ccmexec' -ErrorAction 'SilentlyContinue').Status -ne 'Running') { - Throw "SCCM Client Service [ccmexec] exists but it is not in a 'Running' state." - } - } Else { - Throw 'SCCM Client Service [ccmexec] does not exist. The SCCM Client may not be installed.' - } - - ## Determine the SCCM Client Version - Try { - [version]$SCCMClientVersion = Get-WmiObject -Namespace 'ROOT\CCM' -Class 'CCM_InstalledComponent' -ErrorAction 'Stop' | Where-Object { $_.Name -eq 'SmsClient' } | Select-Object -ExpandProperty 'Version' -ErrorAction 'Stop' - Write-Log -Message "Installed SCCM Client Version Number [$SCCMClientVersion]." -Source ${CmdletName} - } - Catch { - Write-Log -Message "Failed to determine the SCCM client version number. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - Throw 'Failed to determine the SCCM client version number.' - } - - ## Create a hashtable of Schedule IDs compatible with SCCM Client 2007 - [hashtable]$ScheduleIds = @{ - HardwareInventory = '{00000000-0000-0000-0000-000000000001}'; # Hardware Inventory Collection Task - SoftwareInventory = '{00000000-0000-0000-0000-000000000002}'; # Software Inventory Collection Task - HeartbeatDiscovery = '{00000000-0000-0000-0000-000000000003}'; # Heartbeat Discovery Cycle - SoftwareInventoryFileCollection = '{00000000-0000-0000-0000-000000000010}'; # Software Inventory File Collection Task - RequestMachinePolicy = '{00000000-0000-0000-0000-000000000021}'; # Request Machine Policy Assignments - EvaluateMachinePolicy = '{00000000-0000-0000-0000-000000000022}'; # Evaluate Machine Policy Assignments - RefreshDefaultMp = '{00000000-0000-0000-0000-000000000023}'; # Refresh Default MP Task - RefreshLocationServices = '{00000000-0000-0000-0000-000000000024}'; # Refresh Location Services Task - LocationServicesCleanup = '{00000000-0000-0000-0000-000000000025}'; # Location Services Cleanup Task - SoftwareMeteringReport = '{00000000-0000-0000-0000-000000000031}'; # Software Metering Report Cycle - SourceUpdate = '{00000000-0000-0000-0000-000000000032}'; # Source Update Manage Update Cycle - PolicyAgentCleanup = '{00000000-0000-0000-0000-000000000040}'; # Policy Agent Cleanup Cycle - RequestMachinePolicy2 = '{00000000-0000-0000-0000-000000000042}'; # Request Machine Policy Assignments - CertificateMaintenance = '{00000000-0000-0000-0000-000000000051}'; # Certificate Maintenance Cycle - PeerDistributionPointStatus = '{00000000-0000-0000-0000-000000000061}'; # Peer Distribution Point Status Task - PeerDistributionPointProvisioning = '{00000000-0000-0000-0000-000000000062}'; # Peer Distribution Point Provisioning Status Task - ComplianceIntervalEnforcement = '{00000000-0000-0000-0000-000000000071}'; # Compliance Interval Enforcement - SoftwareUpdatesAgentAssignmentEvaluation = '{00000000-0000-0000-0000-000000000108}'; # Software Updates Agent Assignment Evaluation Cycle - UploadStateMessage = '{00000000-0000-0000-0000-000000000111}'; # Send Unsent State Messages - StateMessageManager = '{00000000-0000-0000-0000-000000000112}'; # State Message Manager Task - SoftwareUpdatesScan = '{00000000-0000-0000-0000-000000000113}'; # Force Update Scan - AMTProvisionCycle = '{00000000-0000-0000-0000-000000000120}'; # AMT Provision Cycle - } - - ## If SCCM 2012 Client or higher, modify hashtabe containing Schedule IDs so that it only has the ones compatible with this version of the SCCM client - If ($SCCMClientVersion.Major -ge 5) { - $ScheduleIds.Remove('PeerDistributionPointStatus') - $ScheduleIds.Remove('PeerDistributionPointProvisioning') - $ScheduleIds.Remove('ComplianceIntervalEnforcement') - $ScheduleIds.Add('UpdateStorePolicy','{00000000-0000-0000-0000-000000000114}') # Update Store Policy - $ScheduleIds.Add('StateSystemBulkSend','{00000000-0000-0000-0000-000000000116}') # State System Policy Bulk Send Low - $ScheduleIds.Add('ApplicationManagerPolicyAction','{00000000-0000-0000-0000-000000000121}') # Application Manager Policy Action - $ScheduleIds.Add('PowerManagementStartSummarizer','{00000000-0000-0000-0000-000000000131}') # Power Management Start Summarizer - } - - ## Determine if the requested Schedule ID is available on this version of the SCCM Client - If (-not ($ScheduleIds.ContainsKey($ScheduleId))) { - Throw "The requested ScheduleId [$ScheduleId] is not available with this version of the SCCM Client [$SCCMClientVersion]." - } - - ## Trigger SCCM task - Write-Log -Message "Trigger SCCM Task ID [$ScheduleId]." -Source ${CmdletName} - [Management.ManagementClass]$SmsClient = [WMIClass]'ROOT\CCM:SMS_Client' - $null = $SmsClient.TriggerSchedule($ScheduleIds.$ScheduleID) - } - Catch { - Write-Log -Message "Failed to trigger SCCM Schedule Task ID [$($ScheduleIds.$ScheduleId)]. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to trigger SCCM Schedule Task ID [$($ScheduleIds.$ScheduleId)]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateSet('HardwareInventory', 'SoftwareInventory', 'HeartbeatDiscovery', 'SoftwareInventoryFileCollection', 'RequestMachinePolicy', 'EvaluateMachinePolicy', 'LocationServicesCleanup', 'SoftwareMeteringReport', 'SourceUpdate', 'PolicyAgentCleanup', 'RequestMachinePolicy2', 'CertificateMaintenance', 'PeerDistributionPointStatus', 'PeerDistributionPointProvisioning', 'ComplianceIntervalEnforcement', 'SoftwareUpdatesAgentAssignmentEvaluation', 'UploadStateMessage', 'StateMessageManager', 'SoftwareUpdatesScan', 'AMTProvisionCycle', 'UpdateStorePolicy', 'StateSystemBulkSend', 'ApplicationManagerPolicyAction', 'PowerManagementStartSummarizer')] + [String]$ScheduleID, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Invoke SCCM Schedule Task ID [$ScheduleId]..." -Source ${CmdletName} + + ## Make sure SCCM client is installed and running + Write-Log -Message 'Checking to see if SCCM Client service [ccmexec] is installed and running.' -Source ${CmdletName} + If (Test-ServiceExists -Name 'ccmexec') { + If ($(Get-Service -Name 'ccmexec' -ErrorAction 'SilentlyContinue').Status -ne 'Running') { + Throw "SCCM Client Service [ccmexec] exists but it is not in a 'Running' state." + } + } + Else { + Throw 'SCCM Client Service [ccmexec] does not exist. The SCCM Client may not be installed.' + } + + ## Determine the SCCM Client Version + Try { + [Version]$SCCMClientVersion = Get-WmiObject -Namespace 'ROOT\CCM' -Class 'CCM_InstalledComponent' -ErrorAction 'Stop' | Where-Object { $_.Name -eq 'SmsClient' } | Select-Object -ExpandProperty 'Version' -ErrorAction 'Stop' + If ($SCCMClientVersion) { + Write-Log -Message "Installed SCCM Client Version Number [$SCCMClientVersion]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + } + Catch { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + + ## Create a hashtable of Schedule IDs compatible with SCCM Client 2007 + [Hashtable]$ScheduleIds = @{ + HardwareInventory = '{00000000-0000-0000-0000-000000000001}'; # Hardware Inventory Collection Task + SoftwareInventory = '{00000000-0000-0000-0000-000000000002}'; # Software Inventory Collection Task + HeartbeatDiscovery = '{00000000-0000-0000-0000-000000000003}'; # Heartbeat Discovery Cycle + SoftwareInventoryFileCollection = '{00000000-0000-0000-0000-000000000010}'; # Software Inventory File Collection Task + RequestMachinePolicy = '{00000000-0000-0000-0000-000000000021}'; # Request Machine Policy Assignments + EvaluateMachinePolicy = '{00000000-0000-0000-0000-000000000022}'; # Evaluate Machine Policy Assignments + RefreshDefaultMp = '{00000000-0000-0000-0000-000000000023}'; # Refresh Default MP Task + RefreshLocationServices = '{00000000-0000-0000-0000-000000000024}'; # Refresh Location Services Task + LocationServicesCleanup = '{00000000-0000-0000-0000-000000000025}'; # Location Services Cleanup Task + SoftwareMeteringReport = '{00000000-0000-0000-0000-000000000031}'; # Software Metering Report Cycle + SourceUpdate = '{00000000-0000-0000-0000-000000000032}'; # Source Update Manage Update Cycle + PolicyAgentCleanup = '{00000000-0000-0000-0000-000000000040}'; # Policy Agent Cleanup Cycle + RequestMachinePolicy2 = '{00000000-0000-0000-0000-000000000042}'; # Request Machine Policy Assignments + CertificateMaintenance = '{00000000-0000-0000-0000-000000000051}'; # Certificate Maintenance Cycle + PeerDistributionPointStatus = '{00000000-0000-0000-0000-000000000061}'; # Peer Distribution Point Status Task + PeerDistributionPointProvisioning = '{00000000-0000-0000-0000-000000000062}'; # Peer Distribution Point Provisioning Status Task + ComplianceIntervalEnforcement = '{00000000-0000-0000-0000-000000000071}'; # Compliance Interval Enforcement + SoftwareUpdatesAgentAssignmentEvaluation = '{00000000-0000-0000-0000-000000000108}'; # Software Updates Agent Assignment Evaluation Cycle + UploadStateMessage = '{00000000-0000-0000-0000-000000000111}'; # Send Unsent State Messages + StateMessageManager = '{00000000-0000-0000-0000-000000000112}'; # State Message Manager Task + SoftwareUpdatesScan = '{00000000-0000-0000-0000-000000000113}'; # Force Update Scan + AMTProvisionCycle = '{00000000-0000-0000-0000-000000000120}'; # AMT Provision Cycle + } + + ## If SCCM 2012 Client or higher, modify hashtabe containing Schedule IDs so that it only has the ones compatible with this version of the SCCM client + If ($SCCMClientVersion.Major -ge 5) { + $ScheduleIds.Remove('PeerDistributionPointStatus') + $ScheduleIds.Remove('PeerDistributionPointProvisioning') + $ScheduleIds.Remove('ComplianceIntervalEnforcement') + $ScheduleIds.Add('UpdateStorePolicy', '{00000000-0000-0000-0000-000000000114}') # Update Store Policy + $ScheduleIds.Add('StateSystemBulkSend', '{00000000-0000-0000-0000-000000000116}') # State System Policy Bulk Send Low + $ScheduleIds.Add('ApplicationManagerPolicyAction', '{00000000-0000-0000-0000-000000000121}') # Application Manager Policy Action + $ScheduleIds.Add('PowerManagementStartSummarizer', '{00000000-0000-0000-0000-000000000131}') # Power Management Start Summarizer + } + + ## Determine if the requested Schedule ID is available on this version of the SCCM Client + If (-not $ScheduleIds.ContainsKey($ScheduleId)) { + Throw "The requested ScheduleId [$ScheduleId] is not available with this version of the SCCM Client [$SCCMClientVersion]." + } + + ## Trigger SCCM task + Write-Log -Message "Triggering SCCM Task ID [$ScheduleId]." -Source ${CmdletName} + [Management.ManagementClass]$SmsClient = [WMIClass]'ROOT\CCM:SMS_Client' + $null = $SmsClient.TriggerSchedule($ScheduleIds.$ScheduleID) + } + Catch { + Write-Log -Message "Failed to trigger SCCM Schedule Task ID [$($ScheduleIds.$ScheduleId)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to trigger SCCM Schedule Task ID [$($ScheduleIds.$ScheduleId)]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Install-SCCMSoftwareUpdates Function Install-SCCMSoftwareUpdates { -<# + <# .SYNOPSIS - Scans for outstanding SCCM updates to be installed and installs the pending updates. + +Scans for outstanding SCCM updates to be installed and installs the pending updates. + .DESCRIPTION - Scans for outstanding SCCM updates to be installed and installs the pending updates. - Only compatible with SCCM 2012 Client or higher. This function can take several minutes to run. + +Scans for outstanding SCCM updates to be installed and installs the pending updates. + +Only compatible with SCCM 2012 Client or higher. This function can take several minutes to run. + .PARAMETER SoftwareUpdatesScanWaitInSeconds - The amount of time to wait in seconds for the software updates scan to complete. Default is: 180 seconds. + +The amount of time to wait in seconds for the software updates scan to complete. Default is: 180 seconds. + .PARAMETER WaitForPendingUpdatesTimeout - The amount of time to wait for missing and pending updates to install before exiting the function. Default is: 45 minutes. + +The amount of time to wait for missing and pending updates to install before exiting the function. Default is: 45 minutes. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Install-SCCMSoftwareUpdates + +Install-SCCMSoftwareUpdates + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [int32]$SoftwareUpdatesScanWaitInSeconds = 180, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [timespan]$WaitForPendingUpdatesTimeout = $(New-TimeSpan -Minutes 45), - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Scan for and install pending SCCM software updates.' -Source ${CmdletName} - - ## Make sure SCCM client is installed and running - Write-Log -Message 'Check to see if SCCM Client service [ccmexec] is installed and running.' -Source ${CmdletName} - If (Test-ServiceExists -Name 'ccmexec') { - If ($(Get-Service -Name 'ccmexec' -ErrorAction 'SilentlyContinue').Status -ne 'Running') { - Throw "SCCM Client Service [ccmexec] exists but it is not in a 'Running' state." - } - } Else { - Throw 'SCCM Client Service [ccmexec] does not exist. The SCCM Client may not be installed.' - } - - ## Determine the SCCM Client Version - Try { - [version]$SCCMClientVersion = Get-WmiObject -Namespace 'ROOT\CCM' -Class 'CCM_InstalledComponent' -ErrorAction 'Stop' | Where-Object { $_.Name -eq 'SmsClient' } | Select-Object -ExpandProperty 'Version' -ErrorAction 'Stop' - Write-Log -Message "Installed SCCM Client Version Number [$SCCMClientVersion]." -Source ${CmdletName} - } - Catch { - Write-Log -Message "Failed to determine the SCCM client version number. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - Throw 'Failed to determine the SCCM client version number.' - } - # If SCCM 2007 Client or lower, exit function - If ($SCCMClientVersion.Major -le 4) { - Throw 'SCCM 2007 or lower, which is incompatible with this function, was detected on this system.' - } - - $StartTime = Get-Date - ## Trigger SCCM client scan for Software Updates - Write-Log -Message 'Trigger SCCM client scan for Software Updates...' -Source ${CmdletName} - Invoke-SCCMTask -ScheduleId 'SoftwareUpdatesScan' - - Write-Log -Message "The SCCM client scan for Software Updates has been triggered. The script is suspended for [$SoftwareUpdatesScanWaitInSeconds] seconds to let the update scan finish." -Source ${CmdletName} - Start-Sleep -Seconds $SoftwareUpdatesScanWaitInSeconds - - ## Find the number of missing updates - Try { - [Management.ManagementObject[]]$CMMissingUpdates = @(Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Query "SELECT * FROM CCM_SoftwareUpdate WHERE ComplianceState = '0'" -ErrorAction 'Stop') - } - Catch { - Write-Log -Message "Failed to find the number of missing software updates. `n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} - Throw 'Failed to find the number of missing software updates.' - } - - ## Install missing updates and wait for pending updates to finish installing - If ($CMMissingUpdates.Count) { - # Install missing updates - Write-Log -Message "Install missing updates. The number of missing updates is [$($CMMissingUpdates.Count)]." -Source ${CmdletName} - $CMInstallMissingUpdates = (Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Class 'CCM_SoftwareUpdatesManager' -List).InstallUpdates($CMMissingUpdates) - - # Wait for pending updates to finish installing or the timeout value to expire - Do { - Start-Sleep -Seconds 60 - [array]$CMInstallPendingUpdates = @(Get-WmiObject -Namespace "ROOT\CCM\ClientSDK" -Query "SELECT * FROM CCM_SoftwareUpdate WHERE EvaluationState = 6 or EvaluationState = 7") - Write-Log -Message "The number of updates pending installation is [$($CMInstallPendingUpdates.Count)]." -Source ${CmdletName} - } While (($CMInstallPendingUpdates.Count -ne 0) -and ((New-TimeSpan -Start $StartTime -End $(Get-Date)) -lt $WaitForPendingUpdatesTimeout)) - } - Else { - Write-Log -Message 'There are no missing updates.' -Source ${CmdletName} - } - } - Catch { - Write-Log -Message "Failed to trigger installation of missing software updates. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to trigger installation of missing software updates: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$SoftwareUpdatesScanWaitInSeconds = 180, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Timespan]$WaitForPendingUpdatesTimeout = $(New-TimeSpan -Minutes 45), + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Scanning for and installing pending SCCM software updates.' -Source ${CmdletName} + + ## Make sure SCCM client is installed and running + Write-Log -Message 'Checking to see if SCCM Client service [ccmexec] is installed and running.' -Source ${CmdletName} + If (Test-ServiceExists -Name 'ccmexec') { + If ($(Get-Service -Name 'ccmexec' -ErrorAction 'SilentlyContinue').Status -ne 'Running') { + Throw "SCCM Client Service [ccmexec] exists but it is not in a 'Running' state." + } + } + Else { + Throw 'SCCM Client Service [ccmexec] does not exist. The SCCM Client may not be installed.' + } + + ## Determine the SCCM Client Version + Try { + [Version]$SCCMClientVersion = Get-WmiObject -Namespace 'ROOT\CCM' -Class 'CCM_InstalledComponent' -ErrorAction 'Stop' | Where-Object { $_.Name -eq 'SmsClient' } | Select-Object -ExpandProperty 'Version' -ErrorAction 'Stop' + If ($SCCMClientVersion) { + Write-Log -Message "Installed SCCM Client Version Number [$SCCMClientVersion]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + } + Catch { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + # If SCCM 2007 Client or lower, exit function + If ($SCCMClientVersion.Major -le 4) { + Throw 'SCCM 2007 or lower, which is incompatible with this function, was detected on this system.' + } + + $StartTime = Get-Date + ## Trigger SCCM client scan for Software Updates + Write-Log -Message 'Triggering SCCM client scan for Software Updates...' -Source ${CmdletName} + Invoke-SCCMTask -ScheduleId 'SoftwareUpdatesScan' + + Write-Log -Message "The SCCM client scan for Software Updates has been triggered. The script is suspended for [$SoftwareUpdatesScanWaitInSeconds] seconds to let the update scan finish." -Source ${CmdletName} + Start-Sleep -Seconds $SoftwareUpdatesScanWaitInSeconds + + ## Find the number of missing updates + Try { + Write-Log -Message 'Getting the number of missing updates...' -Source ${CmdletName} + [Management.ManagementObject[]]$CMMissingUpdates = @(Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Query "SELECT * FROM CCM_SoftwareUpdate WHERE ComplianceState = '0'" -ErrorAction 'Stop') + } + Catch { + Write-Log -Message "Failed to find the number of missing software updates. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to find the number of missing software updates.' + } + + ## Install missing updates and wait for pending updates to finish installing + If ($CMMissingUpdates.Count) { + # Install missing updates + Write-Log -Message "Installing missing updates. The number of missing updates is [$($CMMissingUpdates.Count)]." -Source ${CmdletName} + $CMInstallMissingUpdates = (Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Class 'CCM_SoftwareUpdatesManager' -List).InstallUpdates($CMMissingUpdates) + + # Wait for pending updates to finish installing or the timeout value to expire + Do { + Start-Sleep -Seconds 60 + [Array]$CMInstallPendingUpdates = @(Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Query 'SELECT * FROM CCM_SoftwareUpdate WHERE EvaluationState = 6 or EvaluationState = 7') + Write-Log -Message "The number of updates pending installation is [$($CMInstallPendingUpdates.Count)]." -Source ${CmdletName} + } While (($CMInstallPendingUpdates.Count -ne 0) -and ((New-TimeSpan -Start $StartTime -End $(Get-Date)) -lt $WaitForPendingUpdatesTimeout)) + } + Else { + Write-Log -Message 'There are no missing updates.' -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to trigger installation of missing software updates. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to trigger installation of missing software updates: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Update-GroupPolicy Function Update-GroupPolicy { -<# + <# .SYNOPSIS - Performs a gpupdate command to refresh Group Policies on the local machine. + +Performs a gpupdate command to refresh Group Policies on the local machine. + .DESCRIPTION - Performs a gpupdate command to refresh Group Policies on the local machine. + +Performs a gpupdate command to refresh Group Policies on the local machine. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Update-GroupPolicy + +Update-GroupPolicy + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - [string[]]$GPUpdateCmds = '/C echo N | gpupdate.exe /Target:Computer /Force', '/C echo N | gpupdate.exe /Target:User /Force' - [int32]$InstallCount = 0 - ForEach ($GPUpdateCmd in $GPUpdateCmds) { - Try { - If ($InstallCount -eq 0) { - [string]$InstallMsg = 'Update Group Policies for the Machine' - Write-Log -Message "$($InstallMsg)..." -Source ${CmdletName} - } - Else { - [string]$InstallMsg = 'Update Group Policies for the User' - Write-Log -Message "$($InstallMsg)..." -Source ${CmdletName} - } - [psobject]$ExecuteResult = Execute-Process -Path "$envWindir\system32\cmd.exe" -Parameters $GPUpdateCmd -WindowStyle 'Hidden' -PassThru - - If ($ExecuteResult.ExitCode -ne 0) { - If ($ExecuteResult.ExitCode -eq 60002) { - Throw "Execute-Process function failed with exit code [$($ExecuteResult.ExitCode)]." - } - Else { - Throw "gpupdate.exe failed with exit code [$($ExecuteResult.ExitCode)]." - } - } - $InstallCount++ - } - Catch { - Write-Log -Message "Failed to $($InstallMsg). `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to $($InstallMsg): $($_.Exception.Message)" - } - Continue - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + [String[]]$GPUpdateCmds = '/C echo N | gpupdate.exe /Target:Computer /Force', '/C echo N | gpupdate.exe /Target:User /Force' + [Int32]$InstallCount = 0 + ForEach ($GPUpdateCmd in $GPUpdateCmds) { + Try { + If ($InstallCount -eq 0) { + [String]$InstallMsg = 'Updating Group Policies for the Machine' + } + Else { + [String]$InstallMsg = 'Updating Group Policies for the User' + } + Write-Log -Message "$($InstallMsg)..." -Source ${CmdletName} + [PSObject]$ExecuteResult = Execute-Process -Path "$envWinDir\System32\cmd.exe" -Parameters $GPUpdateCmd -WindowStyle 'Hidden' -PassThru -ExitOnProcessFailure $false + + If ($ExecuteResult.ExitCode -ne 0) { + If ($ExecuteResult.ExitCode -eq 60002) { + Throw "Execute-Process function failed with exit code [$($ExecuteResult.ExitCode)]." + } + Else { + Throw "gpupdate.exe failed with exit code [$($ExecuteResult.ExitCode)]." + } + } + $InstallCount++ + } + Catch { + Write-Log -Message "$($InstallMsg) failed. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "$($InstallMsg) failed: $($_.Exception.Message)" + } + Continue + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Enable-TerminalServerInstallMode Function Enable-TerminalServerInstallMode { -<# + <# .SYNOPSIS - Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + .DESCRIPTION - Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Enable-TerminalServerInstall + +Enable-TerminalServerInstallMode + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Change terminal server into user install mode...' -Source ${CmdletName} - $terminalServerResult = & change.exe User /Install - - If ($global:LastExitCode -ne 1) { Throw $terminalServerResult } - } - Catch { - Write-Log -Message "Failed to change terminal server into user install mode. `n$(Resolve-Error) " -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to change terminal server into user install mode: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Changing terminal server into user install mode...' -Source ${CmdletName} + $terminalServerResult = & "$envWinDir\System32\change.exe" User /Install + + If ($global:LastExitCode -ne 1) { + Throw $terminalServerResult + } + } + Catch { + Write-Log -Message "Failed to change terminal server into user install mode. `r`n$(Resolve-Error) " -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to change terminal server into user install mode: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Disable-TerminalServerInstallMode Function Disable-TerminalServerInstallMode { -<# + <# .SYNOPSIS - Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + .DESCRIPTION - Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Disable-TerminalServerInstall + +Disable-TerminalServerInstallMode + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Change terminal server into user execute mode...' -Source ${CmdletName} - $terminalServerResult = & change.exe User /Execute - - If ($global:LastExitCode -ne 1) { Throw $terminalServerResult } - } - Catch { - Write-Log -Message "Failed to change terminal server into user execute mode. `n$(Resolve-Error) " -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to change terminal server into user execute mode: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Changing terminal server into user execute mode...' -Source ${CmdletName} + $terminalServerResult = & "$envWinDir\System32\change.exe" User /Execute + + If ($global:LastExitCode -ne 1) { + Throw $terminalServerResult + } + } + Catch { + Write-Log -Message "Failed to change terminal server into user execute mode. `r`n$(Resolve-Error) " -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to change terminal server into user execute mode: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-ActiveSetup Function Set-ActiveSetup { -<# + <# .SYNOPSIS - Creates an Active Setup entry in the registry to execute a file for each user upon login. + +Creates an Active Setup entry in the registry to execute a file for each user upon login. + .DESCRIPTION - Active Setup allows handling of per-user changes registry/file changes upon login. - A registry key is created in the HKLM registry hive which gets replicated to the HKCU hive when a user logs in. - If the "Version" value of the Active Setup entry in HKLM is higher than the version value in HKCU, the file referenced in "StubPath" is executed. - This Function: - - Creates the registry entries in HKLM:SOFTWARE\Microsoft\Active Setup\Installed Components\$installName. - - Creates StubPath value depending on the file extension of the $StubExePath parameter. - - Handles Version value with YYYYMMDDHHMMSS granularity to permit re-installs on the same day and still trigger Active Setup after Version increase. - - Copies/overwrites the StubPath file to $StubExePath destination path if file exists in 'Files' subdirectory of script directory. - - Executes the StubPath file for the current user as long as not in Session 0 (no need to logout/login to trigger Active Setup). + +Active Setup allows handling of per-user changes registry/file changes upon login. +A registry key is created in the HKLM registry hive which gets replicated to the HKCU hive when a user logs in. +If the "Version" value of the Active Setup entry in HKLM is higher than the version value in HKCU, the file referenced in "StubPath" is executed. + +This Function: + - Creates the registry entries in HKLM:SOFTWARE\Microsoft\Active Setup\Installed Components\$installName. + - Creates StubPath value depending on the file extension of the $StubExePath parameter. + - Handles Version value with YYYYMMDDHHMMSS granularity to permit re-installs on the same day and still trigger Active Setup after Version increase. + - Copies/overwrites the StubPath file to $StubExePath destination path if file exists in 'Files' subdirectory of script directory. + - Executes the StubPath file for the current user based on $ExecuteForCurrentUser (no need to logout/login to trigger Active Setup). + .PARAMETER StubExePath - Full destination path to the file that will be executed for each user that logs in. - If this file exists in the 'Files' subdirectory of the script directory, it will be copied to the destination path. + +Full destination path to the file that will be executed for each user that logs in. + +If this file exists in the 'Files' subdirectory of the script directory, it will be copied to the destination path. + .PARAMETER Arguments - Arguments to pass to the file being executed. + +Arguments to pass to the file being executed. + .PARAMETER Description - Description for the Active Setup. Users will see "Setting up personalized settings for: $Description" at logon. Default is: $installName. + +Description for the Active Setup. Users will see "Setting up personalized settings for: $Description" at logon. Default is: $installName. + .PARAMETER Key - Name of the registry key for the Active Setup entry. Default is: $installName. + +Name of the registry key for the Active Setup entry. Default is: $installName. + .PARAMETER Version - Optional. Specify version for Active setup entry. Active Setup is not triggered if Version value has more than 8 consecutive digits. Use commas to get around this limitation. + +Optional. Specify version for Active setup entry. Active Setup is not triggered if Version value has more than 8 consecutive digits. Use commas to get around this limitation. Default: YYYYMMDDHHMMSS + .PARAMETER Locale - Optional. Arbitrary string used to specify the installation language of the file being executed. Not replicated to HKCU. + +Optional. Arbitrary string used to specify the installation language of the file being executed. Not replicated to HKCU. + .PARAMETER PurgeActiveSetupKey - Remove Active Setup entry from HKLM registry hive. Will also load each logon user's HKCU registry hive to remove Active Setup entry. + +Remove Active Setup entry from HKLM registry hive. Will also load each logon user's HKCU registry hive to remove Active Setup entry. Function returns after purging. + .PARAMETER DisableActiveSetup - Disables the Active Setup entry so that the StubPath file will not be executed. + +Disables the Active Setup entry so that the StubPath file will not be executed. This also disables -ExecuteForCurrentUser + +.PARAMETER ExecuteForCurrentUser + +Specifies whether the StubExePath should be executed for the current user. Since this user is already logged in, the user won't have the application started without logging out and logging back in. Default: $true + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if Active Setup entry was created or updated, $false if Active Setup entry was not created or updated. + .EXAMPLE - Set-ActiveSetup -StubExePath 'C:\Users\Public\Company\ProgramUserConfig.vbs' -Arguments '/Silent' -Description 'Program User Config' -Key 'ProgramUserConfig' -Locale 'en' + +Set-ActiveSetup -StubExePath 'C:\Users\Public\Company\ProgramUserConfig.vbs' -Arguments '/Silent' -Description 'Program User Config' -Key 'ProgramUserConfig' -Locale 'en' + .EXAMPLE - Set-ActiveSetup -StubExePath "$envWinDir\regedit.exe" -Arguments "/S `"%SystemDrive%\Program Files (x86)\PS App Deploy\PSAppDeployHKCUSettings.reg`"" -Description 'PS App Deploy Config' -Key 'PS_App_Deploy_Config' -ContinueOnError $true + +Set-ActiveSetup -StubExePath "$envWinDir\regedit.exe" -Arguments "/S `"%SystemDrive%\Program Files (x86)\PS App Deploy\PSAppDeployHKCUSettings.reg`"" -Description 'PS App Deploy Config' -Key 'PS_App_Deploy_Config' -ContinueOnError $true + .EXAMPLE - Set-ActiveSetup -Key 'ProgramUserConfig' -PurgeActiveSetupKey - Deletes "ProgramUserConfig" active setup entry from all registry hives. + +Set-ActiveSetup -Key 'ProgramUserConfig' -PurgeActiveSetupKey + +Deletes "ProgramUserConfig" active setup entry from all registry hives. + .NOTES - Original code borrowed from: Denis St-Pierre (Ottawa, Canada), Todd MacNaught (Ottawa, Canada) + +Original code borrowed from: Denis St-Pierre (Ottawa, Canada), Todd MacNaught (Ottawa, Canada) + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true,ParameterSetName='Create')] - [ValidateNotNullorEmpty()] - [string]$StubExePath, - [Parameter(Mandatory=$false,ParameterSetName='Create')] - [ValidateNotNullorEmpty()] - [string]$Arguments, - [Parameter(Mandatory=$false,ParameterSetName='Create')] - [ValidateNotNullorEmpty()] - [string]$Description = $installName, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$Key = $installName, - [Parameter(Mandatory=$false,ParameterSetName='Create')] - [ValidateNotNullorEmpty()] - [string]$Version = ((Get-Date -Format 'yyMM,ddHH,mmss').ToString()), # Ex: 1405,1515,0522 - [Parameter(Mandatory=$false,ParameterSetName='Create')] - [ValidateNotNullorEmpty()] - [string]$Locale, - [Parameter(Mandatory=$false,ParameterSetName='Create')] - [ValidateNotNullorEmpty()] - [switch]$DisableActiveSetup = $false, - [Parameter(Mandatory=$true,ParameterSetName='Purge')] - [switch]$PurgeActiveSetupKey, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [boolean]$ContinueOnError = $true - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - [string]$ActiveSetupKey = "HKLM:SOFTWARE\Microsoft\Active Setup\Installed Components\$Key" - [string]$HKCUActiveSetupKey = "HKCU:Software\Microsoft\Active Setup\Installed Components\$Key" - - ## Delete Active Setup registry entry from the HKLM hive and for all logon user registry hives on the system - If ($PurgeActiveSetupKey) { - Write-Log -Message "Remove Active Setup entry [$ActiveSetupKey]." -Source ${CmdletName} - Remove-RegistryKey -Key $ActiveSetupKey -Recurse - - Write-Log -Message "Remove Active Setup entry [$HKCUActiveSetupKey] for all log on user registry hives on the system." -Source ${CmdletName} - [scriptblock]$RemoveHKCUActiveSetupKey = { Remove-RegistryKey -Key $HKCUActiveSetupKey -SID $UserProfile.SID -Recurse } - Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $RemoveHKCUActiveSetupKey -UserProfiles (Get-UserProfiles -ExcludeDefaultUser) - Return - } - - ## Verify a file with a supported file extension was specified in $StubExePath - [string[]]$StubExePathFileExtensions = '.exe', '.vbs', '.cmd', '.ps1', '.js' - [string]$StubExeExt = [IO.Path]::GetExtension($StubExePath) - If ($StubExePathFileExtensions -notcontains $StubExeExt) { - Throw "Unsupported Active Setup StubPath file extension [$StubExeExt]." - } - - ## Copy file to $StubExePath from the 'Files' subdirectory of the script directory (if it exists there) - [string]$StubExePath = [Environment]::ExpandEnvironmentVariables($StubExePath) - [string]$ActiveSetupFileName = [IO.Path]::GetFileName($StubExePath) - [string]$StubExeFile = Join-Path -Path $dirFiles -ChildPath $ActiveSetupFileName - If (Test-Path -LiteralPath $StubExeFile -PathType 'Leaf') { - # This will overwrite the StubPath file if $StubExePath already exists on target - Copy-File -Path $StubExeFile -Destination $StubExePath -ContinueOnError $false - } - - ## Check if the $StubExePath file exists - If (-not (Test-Path -LiteralPath $StubExePath -PathType 'Leaf')) { Throw "Active Setup StubPath file [$ActiveSetupFileName] is missing." } - - ## Define Active Setup StubPath according to file extension of $StubExePath - Switch ($StubExeExt) { - '.exe' { - [string]$CUStubExePath = $StubExePath - [string]$CUArguments = $Arguments - [string]$StubPath = "$CUStubExePath" - } - {'.vbs','.js' -contains $StubExeExt} { - [string]$CUStubExePath = "$envWinDir\system32\cscript.exe" - [string]$CUArguments = "//nologo `"$StubExePath`"" - [string]$StubPath = "$CUStubExePath $CUArguments" - } - '.cmd' { - [string]$CUStubExePath = "$envWinDir\system32\CMD.exe" - [string]$CUArguments = "/C `"$StubExePath`"" - [string]$StubPath = "$CUStubExePath $CUArguments" - } - '.ps1' { - [string]$CUStubExePath = "$PSHOME\powershell.exe" - [string]$CUArguments = "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & { & `\`"$StubExePath`\`"}" - [string]$StubPath = "$CUStubExePath $CUArguments" - } - } - If ($Arguments) { - [string]$StubPath = "$StubPath $Arguments" - If ($StubExeExt -ne '.exe') { [string]$CUArguments = "$CUArguments $Arguments" } - } - - ## Create the Active Setup entry in the registry - [scriptblock]$SetActiveSetupRegKeys = { - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullorEmpty()] - [string]$ActiveSetupRegKey, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$SID - ) - If ($SID) { - Set-RegistryKey -Key $ActiveSetupRegKey -Name '(Default)' -Value $Description -SID $SID -ContinueOnError $false - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'StubPath' -Value $StubPath -Type 'String' -SID $SID -ContinueOnError $false - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Version' -Value $Version -SID $SID -ContinueOnError $false - If ($Locale) { Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Locale' -Value $Locale -SID $SID -ContinueOnError $false } - If ($DisableActiveSetup) { - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 0 -Type 'DWord' -SID $SID -ContinueOnError $false - } - Else { - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 1 -Type 'DWord' -SID $SID -ContinueOnError $false - } - } - Else { - Set-RegistryKey -Key $ActiveSetupRegKey -Name '(Default)' -Value $Description -ContinueOnError $false - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'StubPath' -Value $StubPath -Type 'String' -ContinueOnError $false - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Version' -Value $Version -ContinueOnError $false - If ($Locale) { Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Locale' -Value $Locale -ContinueOnError $false } - If ($DisableActiveSetup) { - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 0 -Type 'DWord' -ContinueOnError $false - } - Else { - Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 1 -Type 'DWord' -ContinueOnError $false - } - } - - } - & $SetActiveSetupRegKeys -ActiveSetupRegKey $ActiveSetupKey - - ## Execute the StubPath file for the current user as long as not in Session 0 - If ($SessionZero) { - If ($RunAsActiveUser) { - Write-Log -Message "Session 0 detected: Execute Active Setup StubPath file for currently logged in user [$($RunAsActiveUser.NTAccount)]." -Source ${CmdletName} - If ($CUArguments) { - Execute-ProcessAsUser -Path $CUStubExePath -Parameters $CUArguments -Wait -ContinueOnError $true - } - Else { - Execute-ProcessAsUser -Path $CUStubExePath -Wait -ContinueOnError $true - } - & $SetActiveSetupRegKeys -ActiveSetupRegKey $HKCUActiveSetupKey -SID $RunAsActiveUser.SID - } - Else { - Write-Log -Message 'Session 0 detected: No logged in users detected. Active Setup StubPath file will execute when users first log into their account.' -Source ${CmdletName} - } - } - Else { - Write-Log -Message 'Execute Active Setup StubPath file for the current user.' -Source ${CmdletName} - If ($CUArguments) { - $ExecuteResults = Execute-Process -FilePath $CUStubExePath -Parameters $CUArguments -PassThru - } - Else { - $ExecuteResults = Execute-Process -FilePath $CUStubExePath -PassThru - } - & $SetActiveSetupRegKeys -ActiveSetupRegKey $HKCUActiveSetupKey - } - } - Catch { - Write-Log -Message "Failed to set Active Setup registry entry. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed to set Active Setup registry entry: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$StubExePath, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Arguments, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Description = $installName, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Key = $installName, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Version = ((Get-Date -Format 'yyMM,ddHH,mmss').ToString()), # Ex: 1405,1515,0522 + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Locale, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [Switch]$DisableActiveSetup = $false, + [Parameter(Mandatory = $true, ParameterSetName = 'Purge')] + [Switch]$PurgeActiveSetupKey, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [Boolean]$ExecuteForCurrentUser = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + [String]$ActiveSetupKey = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\$Key" + [String]$HKCUActiveSetupKey = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Active Setup\Installed Components\$Key" + + ## Delete Active Setup registry entry from the HKLM hive and for all logon user registry hives on the system + If ($PurgeActiveSetupKey) { + Write-Log -Message "Removing Active Setup entry [$ActiveSetupKey]." -Source ${CmdletName} + Remove-RegistryKey -Key $ActiveSetupKey -Recurse + + Write-Log -Message "Removing Active Setup entry [$HKCUActiveSetupKey] for all log on user registry hives on the system." -Source ${CmdletName} + [ScriptBlock]$RemoveHKCUActiveSetupKey = { + If (Get-RegistryKey -Key $HKCUActiveSetupKey -SID $RunAsActiveUser.SID) { + Remove-RegistryKey -Key $HKCUActiveSetupKey -SID $RunAsActiveUser.SID -Recurse + } + } + Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $RemoveHKCUActiveSetupKey -UserProfiles (Get-UserProfiles -ExcludeDefaultUser) + Return + } + + ## Verify a file with a supported file extension was specified in $StubExePath + [String[]]$StubExePathFileExtensions = '.exe', '.vbs', '.cmd', '.ps1', '.js' + [String]$StubExeExt = [IO.Path]::GetExtension($StubExePath) + If ($StubExePathFileExtensions -notcontains $StubExeExt) { + Throw "Unsupported Active Setup StubPath file extension [$StubExeExt]." + } + + ## Copy file to $StubExePath from the 'Files' subdirectory of the script directory (if it exists there) + [String]$StubExePath = [Environment]::ExpandEnvironmentVariables($StubExePath) + [String]$ActiveSetupFileName = [IO.Path]::GetFileName($StubExePath) + [String]$StubExeFile = Join-Path -Path $dirFiles -ChildPath $ActiveSetupFileName + If (Test-Path -LiteralPath $StubExeFile -PathType 'Leaf') { + # This will overwrite the StubPath file if $StubExePath already exists on target + Copy-File -Path $StubExeFile -Destination $StubExePath -ContinueOnError $false + } + + ## Check if the $StubExePath file exists + If (-not (Test-Path -LiteralPath $StubExePath -PathType 'Leaf')) { + Throw "Active Setup StubPath file [$ActiveSetupFileName] is missing." + } + + ## Define Active Setup StubPath according to file extension of $StubExePath + Switch ($StubExeExt) { + '.exe' { + [String]$CUStubExePath = "$StubExePath" + [String]$CUArguments = $Arguments + [String]$StubPath = "`"$CUStubExePath`"" + } + '.js' { + [String]$CUStubExePath = "$envWinDir\System32\cscript.exe" + [String]$CUArguments = "//nologo `"$StubExePath`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + '.vbs' { + [String]$CUStubExePath = "$envWinDir\System32\cscript.exe" + [String]$CUArguments = "//nologo `"$StubExePath`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + '.cmd' { + [String]$CUStubExePath = "$envWinDir\System32\cmd.exe" + [String]$CUArguments = "/C `"$StubExePath`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + '.ps1' { + [String]$CUStubExePath = "$PSHOME\powershell.exe" + [String]$CUArguments = "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command `"& {& `\`"$StubExePath`\`"}`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + } + If ($Arguments) { + [String]$StubPath = "$StubPath $Arguments" + If ($StubExeExt -ne '.exe') { + [String]$CUArguments = "$CUArguments $Arguments" + } + } + + [ScriptBlock]$TestActiveSetup = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$HKLMKey, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$HKCUKey, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$UserSID + ) + If ($UserSID) { + $HKCUProps = (Get-RegistryKey -Key $HKCUKey -SID $UserSID -ContinueOnError $true) + } + Else { + $HKCUProps = (Get-RegistryKey -Key $HKCUKey -ContinueOnError $true) + } + $HKLMProps = (Get-RegistryKey -Key $HKLMKey -ContinueOnError $true) + [String]$HKCUVer = $HKCUProps.Version + [String]$HKLMVer = $HKLMProps.Version + [Int32]$HKLMInst = $HKLMProps.IsInstalled + # HKLM entry not present. Nothing to run + If (-not $HKLMProps) { + Write-Log 'HKLM active setup entry is not present.' -Source ${CmdletName} + Return ($false) + } + # HKLM entry present, but disabled. Nothing to run + If ($HKLMInst -eq 0) { + Write-Log 'HKLM active setup entry is present, but it is disabled (IsInstalled set to 0).' -Source ${CmdletName} + Return ($false) + } + # HKLM entry present and HKCU entry is not. Run the StubPath + If (-not $HKCUProps) { + Write-Log 'HKLM active setup entry is present. HKCU active setup entry is not present.' -Source ${CmdletName} + Return ($true) + } + # Both entries present. HKLM entry does not have Version property. Nothing to run + If (-not $HKLMVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKLM Version property is missing.' -Source ${CmdletName} + Return ($false) + } + # Both entries present. HKLM entry has Version property, but HKCU entry does not. Run the StubPath + If (-not $HKCUVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKCU Version property is missing.' -Source ${CmdletName} + Return ($true) + } + # Both entries present, with a Version property. Compare the Versions + ## Remove invalid characters from Version. Only digits and commas are allowed + [String]$HKLMValidVer = '' + For ($i = 0; $i -lt $HKLMVer.Length; $i++) { + If ([Char]::IsDigit($HKLMVer[$i]) -or ($HKLMVer[$i] -eq ',')) { + $HKLMValidVer += $HKLMVer[$i] + } + } + + [String]$HKCUValidVer = '' + For ($i = 0; $i -lt $HKCUVer.Length; $i++) { + If ([Char]::IsDigit($HKCUVer[$i]) -or ($HKCUVer[$i] -eq ',')) { + $HKCUValidVer += $HKCUVer[$i] + } + } + # After cleanup, the HKLM Version is empty. Considering it missing. HKCU is present so nothing to run. + If (-not $HKLMValidVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKLM Version property is invalid.' -Source ${CmdletName} + Return ($false) + } + # the HKCU Version property is empty while HKLM Version property is not. Run the StubPath + If (-not $HKCUValidVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKCU Version property is invalid.' -Source ${CmdletName} + Return ($true) + } + # Both Version properties are present + # Split the version by commas + [String[]]$SplitHKLMValidVer = $HKLMValidVer.Split(',') + [String[]]$SplitHKCUValidVer = $HKCUValidVer.Split(',') + # Check whether the Versions were split in the same number of strings + If ($SplitHKLMValidVer.Count -ne $SplitHKCUValidVer.Count) { + # The versions are different length - more commas + If ($SplitHKLMValidVer.Count -gt $SplitHKCUValidVer.Count) { + #HKLM is longer, Run the StubPath + Write-Log "HKLM and HKCU active setup entries are present. Both contain Version properties, however they don't contain the same amount of sub versions. HKLM Version has more sub versions." -Source ${CmdletName} + Return ($true) + } + Else { + #HKCU is longer, Nothing to run + Write-Log "HKLM and HKCU active setup entries are present. Both contain Version properties, however they don't contain the same amount of sub versions. HKCU Version has more sub versions." -Source ${CmdletName} + Return ($false) + } + } + # The Versions have the same number of strings. Compare them + Try { + For ($i = 0; $i -lt $SplitHKLMValidVer.Count; $i++) { + # Parse the version is UINT64 + [UInt64]$ParsedHKLMVer = [UInt64]::Parse($SplitHKLMValidVer[$i]) + [UInt64]$ParsedHKCUVer = [UInt64]::Parse($SplitHKCUValidVer[$i]) + # The HKCU ver is lower, Run the StubPath + If ($ParsedHKCUVer -lt $ParsedHKLMVer) { + Write-Log 'HKLM and HKCU active setup entries are present. Both Version properties are present and valid, however HKCU Version property is lower.' -Source ${CmdletName} + Return ($true) + } + } + # The HKCU version is equal or higher than HKLM version, Nothing to run + Write-Log 'HKLM and HKCU active setup entries are present. Both Version properties are present and valid, however they are either the same or HKCU Version property is higher.' -Source ${CmdletName} + Return ($false) + } + Catch { + # Failed to parse strings as UInts, Run the StubPath + Write-Log 'HKLM and HKCU active setup entries are present. Both Version properties are present and valid, however parsing strings to uintegers failed.' -Severity 2 -Source ${CmdletName} + Return ($true) + } + } + + ## Create the Active Setup entry in the registry + [ScriptBlock]$SetActiveSetupRegKeys = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$ActiveSetupRegKey, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID + ) + If ($SID) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name '(Default)' -Value $Description -SID $SID -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Version' -Value $Version -SID $SID -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'StubPath' -Value $StubPath -Type 'String' -SID $SID -ContinueOnError $false + If ($Locale) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Locale' -Value $Locale -SID $SID -ContinueOnError $false + } + # Only Add IsInstalled to HKLM + If ($ActiveSetupRegKey.Contains('HKEY_LOCAL_MACHINE')) { + If ($DisableActiveSetup) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 0 -Type 'DWord' -SID $SID -ContinueOnError $false + } + Else { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 1 -Type 'DWord' -SID $SID -ContinueOnError $false + } + } + } + Else { + Set-RegistryKey -Key $ActiveSetupRegKey -Name '(Default)' -Value $Description -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Version' -Value $Version -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'StubPath' -Value $StubPath -Type 'String' -ContinueOnError $false + If ($Locale) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Locale' -Value $Locale -ContinueOnError $false + } + # Only Add IsInstalled to HKLM + If ($ActiveSetupRegKey.Contains('HKEY_LOCAL_MACHINE')) { + If ($DisableActiveSetup) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 0 -Type 'DWord' -ContinueOnError $false + } + Else { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 1 -Type 'DWord' -ContinueOnError $false + } + } + } + } + + Write-Log -Message "Adding Active Setup Key for local machine: [$ActiveSetupKey]." -Source ${CmdletName} + & $SetActiveSetupRegKeys -ActiveSetupRegKey $ActiveSetupKey + + ## Execute the StubPath file for the current user as long as not in Session 0 + If ($ExecuteForCurrentUser) { + If ($SessionZero) { + If ($RunAsActiveUser) { + # Skip if Active Setup reg key is present and Version is equal or higher + [Boolean]$InstallNeeded = (& $TestActiveSetup -HKLMKey $ActiveSetupKey -HKCUKey $HKCUActiveSetupKey -UserSID $RunAsActiveUser.SID) + If ($InstallNeeded) { + Write-Log -Message "Session 0 detected: Executing Active Setup StubPath file for currently logged in user [$($RunAsActiveUser.NTAccount)]." -Source ${CmdletName} + If ($CUArguments) { + Execute-ProcessAsUser -Path $CUStubExePath -Parameters $CUArguments -Wait -ContinueOnError $true + } + Else { + Execute-ProcessAsUser -Path $CUStubExePath -Wait -ContinueOnError $true + } + + Write-Log -Message "Adding Active Setup Key for the current user: [$HKCUActiveSetupKey]." -Source ${CmdletName} + & $SetActiveSetupRegKeys -ActiveSetupRegKey $HKCUActiveSetupKey -SID $RunAsActiveUser.SID + } + Else { + Write-Log -Message "Session 0 detected: Skipping executing Active Setup StubPath file for currently logged in user [$($RunAsActiveUser.NTAccount)]." -Source ${CmdletName} -Severity 2 + } + } + Else { + Write-Log -Message 'Session 0 detected: No logged in users detected. Active Setup StubPath file will execute when users first log into their account.' -Source ${CmdletName} + } + } + Else { + # Skip if Active Setup reg key is present and Version is equal or higher + [Boolean]$InstallNeeded = (& $TestActiveSetup -HKLMKey $ActiveSetupKey -HKCUKey $HKCUActiveSetupKey) + If ($InstallNeeded) { + Write-Log -Message 'Executing Active Setup StubPath file for the current user.' -Source ${CmdletName} + If ($CUArguments) { + Execute-Process -FilePath $CUStubExePath -Parameters $CUArguments -ExitOnProcessFailure $false + } + Else { + Execute-Process -FilePath $CUStubExePath -ExitOnProcessFailure $false + } + + Write-Log -Message "Adding Active Setup Key for the current user: [$HKCUActiveSetupKey]." -Source ${CmdletName} + & $SetActiveSetupRegKeys -ActiveSetupRegKey $HKCUActiveSetupKey + } + Else { + Write-Log -Message 'Skipping executing Active Setup StubPath file for current user.' -Source ${CmdletName} -Severity 2 + } + } + } + } + Catch { + Write-Log -Message "Failed to set Active Setup registry entry. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to set Active Setup registry entry: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Test-ServiceExists Function Test-ServiceExists { -<# + <# .SYNOPSIS - Check to see if a service exists. + +Check to see if a service exists. + .DESCRIPTION - Check to see if a service exists (using WMI method because Get-Service will generate ErrorRecord if service doesn't exist). + +Check to see if a service exists (using WMI method because Get-Service will generate ErrorRecord if service doesn't exist). + .PARAMETER Name - Specify the name of the service. - Note: Service name can be found by executing "Get-Service | Format-Table -AutoSize -Wrap" or by using the properties screen of a service in services.msc. + +Specify the name of the service. + +Note: Service name can be found by executing "Get-Service | Format-Table -AutoSize -Wrap" or by using the properties screen of a service in services.msc. + .PARAMETER ComputerName - Specify the name of the computer. Default is: the local computer. + +Specify the name of the computer. Default is: the local computer. + .PARAMETER PassThru - Return the WMI service object. + +Return the WMI service object. To see all the properties use: Test-ServiceExists -Name 'spooler' -PassThru | Get-Member + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Test-ServiceExists -Name 'wuauserv' + +Test-ServiceExists -Name 'wuauserv' + .EXAMPLE - Test-ServiceExists -Name 'testservice' -PassThru | Where-Object { $_ } | ForEach-Object { $_.Delete() } - Check if a service exists and then delete it by using the -PassThru parameter. + +Test-ServiceExists -Name 'testservice' -PassThru | Where-Object { $_ } | ForEach-Object { $_.Delete() } + +Check if a service exists and then delete it by using the -PassThru parameter. + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$ComputerName = $env:ComputerName, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$PassThru, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - Begin { - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - $ServiceObject = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_Service' -Filter "Name='$Name'" -ErrorAction 'Stop' - # If nothing is returned from Win32_Service, check Win32_BaseService - If (-not ($ServiceObject) ) { - $ServiceObject = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_BaseService' -Filter "Name='$Name'" -ErrorAction 'Stop' - } - - If ($ServiceObject) { - Write-Log -Message "Service [$Name] exists." -Source ${CmdletName} - If ($PassThru) { Write-Output -InputObject $ServiceObject } Else { Write-Output -InputObject $true } - } - Else { - Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} - If ($PassThru) { Write-Output -InputObject $ServiceObject } Else { Write-Output -InputObject $false } - } - } - Catch { - Write-Log -Message "Failed check to see if service [$Name] exists." -Severity 3 -Source ${CmdletName} - If (-not $ContinueOnError) { - Throw "Failed check to see if service [$Name] exists: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + $ServiceObject = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_Service' -Filter "Name='$Name'" -ErrorAction 'Stop' + # If nothing is returned from Win32_Service, check Win32_BaseService + If (-not $ServiceObject) { + $ServiceObject = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_BaseService' -Filter "Name='$Name'" -ErrorAction 'Stop' + } + + If ($ServiceObject) { + Write-Log -Message "Service [$Name] exists." -Source ${CmdletName} + If ($PassThru) { + Write-Output -InputObject ($ServiceObject) + } + Else { + Write-Output -InputObject ($true) + } + } + Else { + Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} + If ($PassThru) { + Write-Output -InputObject ($ServiceObject) + } + Else { + Write-Output -InputObject ($false) + } + } + } + Catch { + Write-Log -Message "Failed check to see if service [$Name] exists." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed check to see if service [$Name] exists: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Stop-ServiceAndDependencies Function Stop-ServiceAndDependencies { -<# + <# .SYNOPSIS - Stop Windows service and its dependencies. + +Stop Windows service and its dependencies. + .DESCRIPTION - Stop Windows service and its dependencies. + +Stop Windows service and its dependencies. + .PARAMETER Name - Specify the name of the service. + +Specify the name of the service. + .PARAMETER ComputerName - Specify the name of the computer. Default is: the local computer. + +Specify the name of the computer. Default is: the local computer. + .PARAMETER SkipServiceExistsTest - Choose to skip the test to check whether or not the service exists if it was already done outside of this function. + +Choose to skip the test to check whether or not the service exists if it was already done outside of this function. + .PARAMETER SkipDependentServices - Choose to skip checking for and stopping dependent services. Default is: $false. + +Choose to skip checking for and stopping dependent services. Default is: $false. + .PARAMETER PendingStatusWait - The amount of time to wait for a service to get out of a pending state before continuing. Default is 60 seconds. + +The amount of time to wait for a service to get out of a pending state before continuing. Default is 60 seconds. + .PARAMETER PassThru - Return the System.ServiceProcess.ServiceController service object. + +Return the System.ServiceProcess.ServiceController service object. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.ServiceProcess.ServiceController. + +Returns the service object. + .EXAMPLE - Stop-ServiceAndDependencies -Name 'wuauserv' + +Stop-ServiceAndDependencies -Name 'wuauserv' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$ComputerName = $env:ComputerName, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$SkipServiceExistsTest, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$SkipDependentServices, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [timespan]$PendingStatusWait = (New-TimeSpan -Seconds 60), - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$PassThru, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - Begin { - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## Check to see if the service exists - If ((-not $SkipServiceExistsTest) -and (-not (Test-ServiceExists -ComputerName $ComputerName -Name $Name -ContinueOnError $false))) { - Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} -Severity 2 - Throw "Service [$Name] does not exist." - } - - ## Get the service object - Write-Log -Message "Get the service object for service [$Name]." -Source ${CmdletName} - [ServiceProcess.ServiceController]$Service = Get-Service -ComputerName $ComputerName -Name $Name -ErrorAction 'Stop' - ## Wait up to 60 seconds if service is in a pending state - [string[]]$PendingStatus = 'ContinuePending', 'PausePending', 'StartPending', 'StopPending' - If ($PendingStatus -contains $Service.Status) { - Switch ($Service.Status) { - 'ContinuePending' { $DesiredStatus = 'Running' } - 'PausePending' { $DesiredStatus = 'Paused' } - 'StartPending' { $DesiredStatus = 'Running' } - 'StopPending' { $DesiredStatus = 'Stopped' } - } - Write-Log -Message "Waiting for up to [$($PendingStatusWait.TotalSeconds)] seconds to allow service pending status [$($Service.Status)] to reach desired status [$DesiredStatus]." -Source ${CmdletName} - $Service.WaitForStatus([ServiceProcess.ServiceControllerStatus]$DesiredStatus, $PendingStatusWait) - $Service.Refresh() - } - ## Discover if the service is currently running - Write-Log -Message "Service [$($Service.ServiceName)] with display name [$($Service.DisplayName)] has a status of [$($Service.Status)]." -Source ${CmdletName} - If ($Service.Status -ne 'Stopped') { - # Discover all dependent services that are running and stop them - If (-not $SkipDependentServices) { - Write-Log -Message "Discover all dependent service(s) for service [$Name] which are not 'Stopped'." -Source ${CmdletName} - [ServiceProcess.ServiceController[]]$DependentServices = Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -DependentServices -ErrorAction 'Stop' | Where-Object { $_.Status -ne 'Stopped' } - If ($DependentServices) { - ForEach ($DependentService in $DependentServices) { - Write-Log -Message "Stop dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]." -Source ${CmdletName} - Try { - Stop-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $DependentService.ServiceName -ErrorAction 'Stop') -Force -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to start dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]. Continue..." -Severity 2 -Source ${CmdletName} - Continue - } - } - } - Else { - Write-Log -Message "Dependent service(s) were not discovered for service [$Name]." -Source ${CmdletName} - } - } - # Stop the parent service - Write-Log -Message "Stop parent service [$($Service.ServiceName)] with display name [$($Service.DisplayName)]." -Source ${CmdletName} - [ServiceProcess.ServiceController]$Service = Stop-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -ErrorAction 'Stop') -Force -PassThru -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' - } - } - Catch { - Write-Log -Message "Failed to stop the service [$Name]. `n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 - If (-not $ContinueOnError) { - Throw "Failed to stop the service [$Name]: $($_.Exception.Message)" - } - } - Finally { - # Return the service object if option selected - If ($PassThru -and $Service) { Write-Output -InputObject $Service } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipServiceExistsTest, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipDependentServices, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Timespan]$PendingStatusWait = (New-TimeSpan -Seconds 60), + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## Check to see if the service exists + If ((-not $SkipServiceExistsTest) -and (-not (Test-ServiceExists -ComputerName $ComputerName -Name $Name -ContinueOnError $false))) { + Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} -Severity 2 + Throw "Service [$Name] does not exist." + } + + ## Get the service object + Write-Log -Message "Getting the service object for service [$Name]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Get-Service -ComputerName $ComputerName -Name $Name -ErrorAction 'Stop' + ## Wait up to 60 seconds if service is in a pending state + [String[]]$PendingStatus = 'ContinuePending', 'PausePending', 'StartPending', 'StopPending' + If ($PendingStatus -contains $Service.Status) { + Switch ($Service.Status) { + 'ContinuePending' { + $DesiredStatus = 'Running' + } + 'PausePending' { + $DesiredStatus = 'Paused' + } + 'StartPending' { + $DesiredStatus = 'Running' + } + 'StopPending' { + $DesiredStatus = 'Stopped' + } + } + Write-Log -Message "Waiting for up to [$($PendingStatusWait.TotalSeconds)] seconds to allow service pending status [$($Service.Status)] to reach desired status [$DesiredStatus]." -Source ${CmdletName} + $Service.WaitForStatus([ServiceProcess.ServiceControllerStatus]$DesiredStatus, $PendingStatusWait) + $Service.Refresh() + } + ## Discover if the service is currently running + Write-Log -Message "Service [$($Service.ServiceName)] with display name [$($Service.DisplayName)] has a status of [$($Service.Status)]." -Source ${CmdletName} + If ($Service.Status -ne 'Stopped') { + # Discover all dependent services that are running and stop them + If (-not $SkipDependentServices) { + Write-Log -Message "Discovering all dependent service(s) for service [$Name] which are not 'Stopped'." -Source ${CmdletName} + [ServiceProcess.ServiceController[]]$DependentServices = Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -DependentServices -ErrorAction 'Stop' | Where-Object { $_.Status -ne 'Stopped' } + If ($DependentServices) { + ForEach ($DependentService in $DependentServices) { + Write-Log -Message "Stopping dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]." -Source ${CmdletName} + Try { + Stop-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $DependentService.ServiceName -ErrorAction 'Stop') -Force -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to stop dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]. Continue..." -Severity 2 -Source ${CmdletName} + Continue + } + } + } + Else { + Write-Log -Message "Dependent service(s) were not discovered for service [$Name]." -Source ${CmdletName} + } + } + # Stop the parent service + Write-Log -Message "Stopping parent service [$($Service.ServiceName)] with display name [$($Service.DisplayName)]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Stop-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -ErrorAction 'Stop') -Force -PassThru -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + } + } + Catch { + Write-Log -Message "Failed to stop the service [$Name]. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to stop the service [$Name]: $($_.Exception.Message)" + } + } + Finally { + # Return the service object if option selected + If ($PassThru -and $Service) { + Write-Output -InputObject ($Service) + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Start-ServiceAndDependencies Function Start-ServiceAndDependencies { -<# + <# .SYNOPSIS - Start Windows service and its dependencies. + +Start Windows service and its dependencies. + .DESCRIPTION - Start Windows service and its dependencies. + +Start Windows service and its dependencies. + .PARAMETER Name - Specify the name of the service. + +Specify the name of the service. + .PARAMETER ComputerName - Specify the name of the computer. Default is: the local computer. + +Specify the name of the computer. Default is: the local computer. + .PARAMETER SkipServiceExistsTest - Choose to skip the test to check whether or not the service exists if it was already done outside of this function. + +Choose to skip the test to check whether or not the service exists if it was already done outside of this function. + .PARAMETER SkipDependentServices - Choose to skip checking for and starting dependent services. Default is: $false. + +Choose to skip checking for and starting dependent services. Default is: $false. + .PARAMETER PendingStatusWait - The amount of time to wait for a service to get out of a pending state before continuing. Default is 60 seconds. + +The amount of time to wait for a service to get out of a pending state before continuing. Default is 60 seconds. + .PARAMETER PassThru - Return the System.ServiceProcess.ServiceController service object. + +Return the System.ServiceProcess.ServiceController service object. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.ServiceProcess.ServiceController. + +Returns the service object. + .EXAMPLE - Start-ServiceAndDependencies -Name 'wuauserv' + +Start-ServiceAndDependencies -Name 'wuauserv' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$ComputerName = $env:ComputerName, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$SkipServiceExistsTest, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$SkipDependentServices, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [timespan]$PendingStatusWait = (New-TimeSpan -Seconds 60), - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [switch]$PassThru, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - Begin { - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## Check to see if the service exists - If ((-not $SkipServiceExistsTest) -and (-not (Test-ServiceExists -ComputerName $ComputerName -Name $Name -ContinueOnError $false))) { - Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} -Severity 2 - Throw "Service [$Name] does not exist." - } - - ## Get the service object - Write-Log -Message "Get the service object for service [$Name]." -Source ${CmdletName} - [ServiceProcess.ServiceController]$Service = Get-Service -ComputerName $ComputerName -Name $Name -ErrorAction 'Stop' - ## Wait up to 60 seconds if service is in a pending state - [string[]]$PendingStatus = 'ContinuePending', 'PausePending', 'StartPending', 'StopPending' - If ($PendingStatus -contains $Service.Status) { - Switch ($Service.Status) { - 'ContinuePending' { $DesiredStatus = 'Running' } - 'PausePending' { $DesiredStatus = 'Paused' } - 'StartPending' { $DesiredStatus = 'Running' } - 'StopPending' { $DesiredStatus = 'Stopped' } - } - Write-Log -Message "Waiting for up to [$($PendingStatusWait.TotalSeconds)] seconds to allow service pending status [$($Service.Status)] to reach desired status [$DesiredStatus]." -Source ${CmdletName} - $Service.WaitForStatus([ServiceProcess.ServiceControllerStatus]$DesiredStatus, $PendingStatusWait) - $Service.Refresh() - } - ## Discover if the service is currently stopped - Write-Log -Message "Service [$($Service.ServiceName)] with display name [$($Service.DisplayName)] has a status of [$($Service.Status)]." -Source ${CmdletName} - If ($Service.Status -ne 'Running') { - # Start the parent service - Write-Log -Message "Start parent service [$($Service.ServiceName)] with display name [$($Service.DisplayName)]." -Source ${CmdletName} - [ServiceProcess.ServiceController]$Service = Start-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -ErrorAction 'Stop') -PassThru -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' - - # Discover all dependent services that are stopped and start them - If (-not $SkipDependentServices) { - Write-Log -Message "Discover all dependent service(s) for service [$Name] which are not 'Running'." -Source ${CmdletName} - [ServiceProcess.ServiceController[]]$DependentServices = Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -DependentServices -ErrorAction 'Stop' | Where-Object { $_.Status -ne 'Running' } - If ($DependentServices) { - ForEach ($DependentService in $DependentServices) { - Write-Log -Message "Start dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]." -Source ${CmdletName} - Try { - Start-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $DependentService.ServiceName -ErrorAction 'Stop') -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' - } - Catch { - Write-Log -Message "Failed to start dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]. Continue..." -Severity 2 -Source ${CmdletName} - Continue - } - } - } - Else { - Write-Log -Message "Dependent service(s) were not discovered for service [$Name]." -Source ${CmdletName} - } - } - } - } - Catch { - Write-Log -Message "Failed to start the service [$Name]. `n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 - If (-not $ContinueOnError) { - Throw "Failed to start the service [$Name]: $($_.Exception.Message)" - } - } - Finally { - # Return the service object if option selected - If ($PassThru -and $Service) { Write-Output -InputObject $Service } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipServiceExistsTest, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipDependentServices, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Timespan]$PendingStatusWait = (New-TimeSpan -Seconds 60), + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## Check to see if the service exists + If ((-not $SkipServiceExistsTest) -and (-not (Test-ServiceExists -ComputerName $ComputerName -Name $Name -ContinueOnError $false))) { + Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} -Severity 2 + Throw "Service [$Name] does not exist." + } + + ## Get the service object + Write-Log -Message "Getting the service object for service [$Name]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Get-Service -ComputerName $ComputerName -Name $Name -ErrorAction 'Stop' + ## Wait up to 60 seconds if service is in a pending state + [String[]]$PendingStatus = 'ContinuePending', 'PausePending', 'StartPending', 'StopPending' + If ($PendingStatus -contains $Service.Status) { + Switch ($Service.Status) { + 'ContinuePending' { + $DesiredStatus = 'Running' + } + 'PausePending' { + $DesiredStatus = 'Paused' + } + 'StartPending' { + $DesiredStatus = 'Running' + } + 'StopPending' { + $DesiredStatus = 'Stopped' + } + } + Write-Log -Message "Waiting for up to [$($PendingStatusWait.TotalSeconds)] seconds to allow service pending status [$($Service.Status)] to reach desired status [$DesiredStatus]." -Source ${CmdletName} + $Service.WaitForStatus([ServiceProcess.ServiceControllerStatus]$DesiredStatus, $PendingStatusWait) + $Service.Refresh() + } + ## Discover if the service is currently stopped + Write-Log -Message "Service [$($Service.ServiceName)] with display name [$($Service.DisplayName)] has a status of [$($Service.Status)]." -Source ${CmdletName} + If ($Service.Status -ne 'Running') { + # Start the parent service + Write-Log -Message "Starting parent service [$($Service.ServiceName)] with display name [$($Service.DisplayName)]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Start-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -ErrorAction 'Stop') -PassThru -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + + # Discover all dependent services that are stopped and start them + If (-not $SkipDependentServices) { + Write-Log -Message "Discover all dependent service(s) for service [$Name] which are not 'Running'." -Source ${CmdletName} + [ServiceProcess.ServiceController[]]$DependentServices = Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -DependentServices -ErrorAction 'Stop' | Where-Object { $_.Status -ne 'Running' } + If ($DependentServices) { + ForEach ($DependentService in $DependentServices) { + Write-Log -Message "Starting dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]." -Source ${CmdletName} + Try { + Start-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $DependentService.ServiceName -ErrorAction 'Stop') -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to start dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]. Continue..." -Severity 2 -Source ${CmdletName} + Continue + } + } + } + Else { + Write-Log -Message "Dependent service(s) were not discovered for service [$Name]." -Source ${CmdletName} + } + } + } + } + Catch { + Write-Log -Message "Failed to start the service [$Name]. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to start the service [$Name]: $($_.Exception.Message)" + } + } + Finally { + # Return the service object if option selected + If ($PassThru -and $Service) { + Write-Output -InputObject ($Service) + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-ServiceStartMode -Function Get-ServiceStartMode -{ -<# +Function Get-ServiceStartMode { + <# .SYNOPSIS - Get the service startup mode. + +Get the service startup mode. + .DESCRIPTION - Get the service startup mode. + +Get the service startup mode. + .PARAMETER Name - Specify the name of the service. + +Specify the name of the service. + .PARAMETER ComputerName - Specify the name of the computer. Default is: the local computer. + +Specify the name of the computer. Default is: the local computer. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.ServiceProcess.ServiceController. + +Returns the service object. + .EXAMPLE - Get-ServiceStartMode -Name 'wuauserv' + +Get-ServiceStartMode -Name 'wuauserv' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdLetBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$ComputerName = $env:ComputerName, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - Begin { - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message "Get the service [$Name] startup mode." -Source ${CmdletName} - [string]$ServiceStartMode = (Get-WmiObject -ComputerName $ComputerName -Class 'Win32_Service' -Filter "Name='$Name'" -Property 'StartMode' -ErrorAction 'Stop').StartMode - ## If service start mode is set to 'Auto', change value to 'Automatic' to be consistent with 'Set-ServiceStartMode' function - If ($ServiceStartMode -eq 'Auto') { $ServiceStartMode = 'Automatic'} - - ## If on Windows Vista or higher, check to see if service is set to Automatic (Delayed Start) - If (($ServiceStartMode -eq 'Automatic') -and (([version]$envOSVersion).Major -gt 5)) { - Try { - [string]$ServiceRegistryPath = "HKLM:SYSTEM\CurrentControlSet\Services\$Name" - [int32]$DelayedAutoStart = Get-ItemProperty -LiteralPath $ServiceRegistryPath -ErrorAction 'Stop' | Select-Object -ExpandProperty 'DelayedAutoStart' -ErrorAction 'Stop' - If ($DelayedAutoStart -eq 1) { $ServiceStartMode = 'Automatic (Delayed Start)' } - } - Catch { } - } - - Write-Log -Message "Service [$Name] startup mode is set to [$ServiceStartMode]." -Source ${CmdletName} - Write-Output -InputObject $ServiceStartMode - } - Catch { - Write-Log -Message "Failed to get the service [$Name] startup mode. `n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 - If (-not $ContinueOnError) { - Throw "Failed to get the service [$Name] startup mode: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdLetBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Getting the service [$Name] startup mode." -Source ${CmdletName} + [String]$ServiceStartMode = (Get-WmiObject -ComputerName $ComputerName -Class 'Win32_Service' -Filter "Name='$Name'" -Property 'StartMode' -ErrorAction 'Stop').StartMode + ## If service start mode is set to 'Auto', change value to 'Automatic' to be consistent with 'Set-ServiceStartMode' function + If ($ServiceStartMode -eq 'Auto') { + $ServiceStartMode = 'Automatic' + } + + ## If on Windows Vista or higher, check to see if service is set to Automatic (Delayed Start) + If (($ServiceStartMode -eq 'Automatic') -and (([Version]$envOSVersion).Major -gt 5)) { + Try { + [String]$ServiceRegistryPath = "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\$Name" + [Int32]$DelayedAutoStart = Get-ItemProperty -LiteralPath $ServiceRegistryPath -ErrorAction 'Stop' | Select-Object -ExpandProperty 'DelayedAutoStart' -ErrorAction 'Stop' + If ($DelayedAutoStart -eq 1) { + $ServiceStartMode = 'Automatic (Delayed Start)' + } + } + Catch { + } + } + + Write-Log -Message "Service [$Name] startup mode is set to [$ServiceStartMode]." -Source ${CmdletName} + Write-Output -InputObject ($ServiceStartMode) + } + Catch { + Write-Log -Message "Failed to get the service [$Name] startup mode. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to get the service [$Name] startup mode: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Set-ServiceStartMode -Function Set-ServiceStartMode -{ -<# +Function Set-ServiceStartMode { + <# .SYNOPSIS - Set the service startup mode. + +Set the service startup mode. + .DESCRIPTION - Set the service startup mode. + +Set the service startup mode. + .PARAMETER Name - Specify the name of the service. + +Specify the name of the service. + .PARAMETER ComputerName - Specify the name of the computer. Default is: the local computer. + +Specify the name of the computer. Default is: the local computer. + .PARAMETER StartMode - Specify startup mode for the service. Options: Automatic, Automatic (Delayed Start), Manual, Disabled, Boot, System. + +Specify startup mode for the service. Options: Automatic, Automatic (Delayed Start), Manual, Disabled, Boot, System. + .PARAMETER ContinueOnError - Continue if an error is encountered. Default is: $true. + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Set-ServiceStartMode -Name 'wuauserv' -StartMode 'Automatic (Delayed Start)' + +Set-ServiceStartMode -Name 'wuauserv' -StartMode 'Automatic (Delayed Start)' + .NOTES + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdLetBinding()] - Param ( - [Parameter(Mandatory=$true)] - [ValidateNotNullOrEmpty()] - [string]$Name, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [string]$ComputerName = $env:ComputerName, - [Parameter(Mandatory=$true)] - [ValidateSet('Automatic','Automatic (Delayed Start)','Manual','Disabled','Boot','System')] - [string]$StartMode, - [Parameter(Mandatory=$false)] - [ValidateNotNullOrEmpty()] - [boolean]$ContinueOnError = $true - ) - Begin { - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - ## If on lower than Windows Vista and 'Automatic (Delayed Start)' selected, then change to 'Automatic' because 'Delayed Start' is not supported. - If (($StartMode -eq 'Automatic (Delayed Start)') -and (([version]$envOSVersion).Major -lt 6)) { $StartMode = 'Automatic' } - - Write-Log -Message "Set service [$Name] startup mode to [$StartMode]." -Source ${CmdletName} - - ## Set the name of the start up mode that will be passed to sc.exe - [string]$ScExeStartMode = $StartMode - If ($StartMode -eq 'Automatic') { $ScExeStartMode = 'Auto' } - If ($StartMode -eq 'Automatic (Delayed Start)') { $ScExeStartMode = 'Delayed-Auto' } - If ($StartMode -eq 'Manual') { $ScExeStartMode = 'Demand' } - - ## Set the start up mode using sc.exe. Note: we found that the ChangeStartMode method in the Win32_Service WMI class set services to 'Automatic (Delayed Start)' even when you specified 'Automatic' on Win7, Win8, and Win10. - $ChangeStartMode = & sc.exe config $Name start= $ScExeStartMode - - If ($global:LastExitCode -ne 0) { - Throw "sc.exe failed with exit code [$($global:LastExitCode)] and message [$ChangeStartMode]." - } - - Write-Log -Message "Successfully set service [$Name] startup mode to [$StartMode]." -Source ${CmdletName} - } - Catch { - Write-Log -Message "Failed to set service [$Name] startup mode to [$StartMode]. `n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 - If (-not $ContinueOnError) { - Throw "Failed to set service [$Name] startup mode to [$StartMode]: $($_.Exception.Message)" - } - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdLetBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $true)] + [ValidateSet('Automatic', 'Automatic (Delayed Start)', 'Manual', 'Disabled', 'Boot', 'System')] + [String]$StartMode, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If on lower than Windows Vista and 'Automatic (Delayed Start)' selected, then change to 'Automatic' because 'Delayed Start' is not supported. + If (($StartMode -eq 'Automatic (Delayed Start)') -and (([Version]$envOSVersion).Major -lt 6)) { + $StartMode = 'Automatic' + } + + Write-Log -Message "Set service [$Name] startup mode to [$StartMode]." -Source ${CmdletName} + + ## Set the name of the start up mode that will be passed to sc.exe + [String]$ScExeStartMode = $StartMode + Switch ($StartMode) { + 'Automatic' { + $ScExeStartMode = 'Auto'; Break + } + 'Automatic (Delayed Start)' { + $ScExeStartMode = 'Delayed-Auto'; Break + } + 'Manual' { + $ScExeStartMode = 'Demand'; Break + } + } + + ## Set the start up mode using sc.exe. Note: we found that the ChangeStartMode method in the Win32_Service WMI class set services to 'Automatic (Delayed Start)' even when you specified 'Automatic' on Win7, Win8, and Win10. + $ChangeStartMode = & "$envWinDir\System32\sc.exe" config $Name start= $ScExeStartMode + + If ($global:LastExitCode -ne 0) { + Throw "sc.exe failed with exit code [$($global:LastExitCode)] and message [$ChangeStartMode]." + } + + Write-Log -Message "Successfully set service [$Name] startup mode to [$StartMode]." -Source ${CmdletName} + } + Catch { + Write-Log -Message "Failed to set service [$Name] startup mode to [$StartMode]. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to set service [$Name] startup mode to [$StartMode]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-LoggedOnUser Function Get-LoggedOnUser { -<# + <# .SYNOPSIS - Get session details for all local and RDP logged on users. + +Get session details for all local and RDP logged on users. + .DESCRIPTION - Get session details for all local and RDP logged on users using Win32 APIs. Get the following session details: - NTAccount, SID, UserName, DomainName, SessionId, SessionName, ConnectState, IsCurrentSession, IsConsoleSession, IsUserSession, IsActiveUserSession - IsRdpSession, IsLocalAdmin, LogonTime, IdleTime, DisconnectTime, ClientName, ClientProtocolType, ClientDirectory, ClientBuildNumber + +Get session details for all local and RDP logged on users using Win32 APIs. Get the following session details: + NTAccount, SID, UserName, DomainName, SessionId, SessionName, ConnectState, IsCurrentSession, IsConsoleSession, IsUserSession, IsActiveUserSession + IsRdpSession, IsLocalAdmin, LogonTime, IdleTime, DisconnectTime, ClientName, ClientProtocolType, ClientDirectory, ClientBuildNumber + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + .EXAMPLE - Get-LoggedOnUser + +Get-LoggedOnUser + .NOTES - Description of ConnectState property: - Value Description - ----- ----------- - Active A user is logged on to the session. - ConnectQuery The session is in the process of connecting to a client. - Connected A client is connected to the session. - Disconnected The session is active, but the client has disconnected from it. - Down The session is down due to an error. - Idle The session is waiting for a client to connect. - Initializing The session is initializing. - Listening The session is listening for connections. - Reset The session is being reset. - Shadowing This session is shadowing another session. - - Description of IsActiveUserSession property: - If a console user exists, then that will be the active user session. - If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that is either 'Active' or 'Connected' is the active user. - - Description of IsRdpSession property: - Gets a value indicating whether the user is associated with an RDP client session. + +Description of ConnectState property: + +Value Description +----- ----------- +Active A user is logged on to the session. +ConnectQuery The session is in the process of connecting to a client. +Connected A client is connected to the session. +Disconnected The session is active, but the client has disconnected from it. +Down The session is down due to an error. +Idle The session is waiting for a client to connect. +Initializing The session is initializing. +Listening The session is listening for connections. +Reset The session is being reset. +Shadowing This session is shadowing another session. + +Description of IsActiveUserSession property: + +- If a console user exists, then that will be the active user session. +- If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that has ConnectState either 'Active' or 'Connected' is the active user. + +Description of IsRdpSession property: +- Gets a value indicating whether the user is associated with an RDP client session. + +Description of IsLocalAdmin property: +- Checks whether the user is a member of the Administrators group + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - } - Process { - Try { - Write-Log -Message 'Get session information for all logged on users.' -Source ${CmdletName} - Write-Output -InputObject ([PSADT.QueryUser]::GetUserSessionInfo("$env:ComputerName")) - } - Catch { - Write-Log -Message "Failed to get session information for all logged on users. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - End { - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Getting session information for all logged on users.' -Source ${CmdletName} + Write-Output -InputObject ([PSADT.QueryUser]::GetUserSessionInfo("$env:ComputerName")) + } + Catch { + Write-Log -Message "Failed to get session information for all logged on users. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion #region Function Get-PendingReboot Function Get-PendingReboot { -<# + <# .SYNOPSIS - Get the pending reboot status on a local computer. + +Get the pending reboot status on a local computer. + .DESCRIPTION - Check WMI and the registry to determine if the system has a pending reboot operation from any of the following: - a) Component Based Servicing (Vista, Windows 2008) - b) Windows Update / Auto Update (XP, Windows 2003 / 2008) - c) SCCM 2012 Clients (DetermineIfRebootPending WMI method) - d) App-V Pending Tasks (global based Appv 5.0 SP2) - e) Pending File Rename Operations (XP, Windows 2003 / 2008) -.EXAMPLE - Get-PendingReboot - - Returns custom object with following properties: - ComputerName, LastBootUpTime, IsSystemRebootPending, IsCBServicingRebootPending, IsWindowsUpdateRebootPending, IsSCCMClientRebootPending, IsFileRenameRebootPending, PendingFileRenameOperations, ErrorMsg - - *Notes: ErrorMsg only contains something if an error occurred -.EXAMPLE - (Get-PendingReboot).IsSystemRebootPending - Returns boolean value determining whether or not there is a pending reboot operation. + +Check WMI and the registry to determine if the system has a pending reboot operation from any of the following: +a) Component Based Servicing (Vista, Windows 2008) +b) Windows Update / Auto Update (XP, Windows 2003 / 2008) +c) SCCM 2012 Clients (DetermineIfRebootPending WMI method) +d) App-V Pending Tasks (global based Appv 5.0 SP2) +e) Pending File Rename Operations (XP, Windows 2003 / 2008) + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns a custom object with the following properties +- ComputerName +- LastBootUpTime +- IsSystemRebootPending +- IsCBServicingRebootPending +- IsWindowsUpdateRebootPending +- IsSCCMClientRebootPending +- IsFileRenameRebootPending +- PendingFileRenameOperations +- ErrorMsg + +.EXAMPLE + +Get-PendingReboot + +Returns custom object with following properties: +- ComputerName +- LastBootUpTime +- IsSystemRebootPending +- IsCBServicingRebootPending +- IsWindowsUpdateRebootPending +- IsSCCMClientRebootPending +- IsFileRenameRebootPending +- PendingFileRenameOperations +- ErrorMsg + +.EXAMPLE + +(Get-PendingReboot).IsSystemRebootPending + +Returns boolean value determining whether or not there is a pending reboot operation. + .NOTES + +ErrorMsg only contains something if an error occurred + .LINK - http://psappdeploytoolkit.com + +https://psappdeploytoolkit.com #> - [CmdletBinding()] - Param ( - ) - - Begin { - ## Get the name of this function and write header - [string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header - - ## Initialize variables - [string]$private:ComputerName = ([Net.Dns]::GetHostEntry('')).HostName - $PendRebootErrorMsg = $null - } - Process { - Write-Log -Message "Get the pending reboot status on the local computer [$ComputerName]." -Source ${CmdletName} - - ## Get the date/time that the system last booted up - Try { - [nullable[datetime]]$LastBootUpTime = (Get-Date -ErrorAction 'Stop') - ([timespan]::FromMilliseconds([math]::Abs([Environment]::TickCount))) - } - Catch { - [nullable[datetime]]$LastBootUpTime = $null - [string[]]$PendRebootErrorMsg += "Failed to get LastBootUpTime: $($_.Exception.Message)" - Write-Log -Message "Failed to get LastBootUpTime. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - - ## Determine if a Windows Vista/Server 2008 and above machine has a pending reboot from a Component Based Servicing (CBS) operation - Try { - If (([version]$envOSVersion).Major -ge 5) { - If (Test-Path -LiteralPath 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending' -ErrorAction 'Stop') { - [nullable[boolean]]$IsCBServicingRebootPending = $true - } - Else { - [nullable[boolean]]$IsCBServicingRebootPending = $false - } - } - } - Catch { - [nullable[boolean]]$IsCBServicingRebootPending = $null - [string[]]$PendRebootErrorMsg += "Failed to get IsCBServicingRebootPending: $($_.Exception.Message)" - Write-Log -Message "Failed to get IsCBServicingRebootPending. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - - ## Determine if there is a pending reboot from a Windows Update - Try { - If (Test-Path -LiteralPath 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' -ErrorAction 'Stop') { - [nullable[boolean]]$IsWindowsUpdateRebootPending = $true - } - Else { - [nullable[boolean]]$IsWindowsUpdateRebootPending = $false - } - } - Catch { - [nullable[boolean]]$IsWindowsUpdateRebootPending = $null - [string[]]$PendRebootErrorMsg += "Failed to get IsWindowsUpdateRebootPending: $($_.Exception.Message)" - Write-Log -Message "Failed to get IsWindowsUpdateRebootPending. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - - ## Determine if there is a pending reboot from a pending file rename operation - [boolean]$IsFileRenameRebootPending = $false - $PendingFileRenameOperations = $null - If (Test-RegistryValue -Key 'HKLM:SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations') { - # If PendingFileRenameOperations value exists, set $IsFileRenameRebootPending variable to $true - [boolean]$IsFileRenameRebootPending = $true - # Get the value of PendingFileRenameOperations - Try { - [string[]]$PendingFileRenameOperations = Get-ItemProperty -LiteralPath 'HKLM:SYSTEM\CurrentControlSet\Control\Session Manager' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'PendingFileRenameOperations' -ErrorAction 'Stop' - } - Catch { - [string[]]$PendRebootErrorMsg += "Failed to get PendingFileRenameOperations: $($_.Exception.Message)" - Write-Log -Message "Failed to get PendingFileRenameOperations. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - } - - ## Determine SCCM 2012 Client reboot pending status - Try { - [boolean]$IsSccmClientNamespaceExists = $false - [psobject]$SCCMClientRebootStatus = Invoke-WmiMethod -ComputerName $ComputerName -NameSpace 'ROOT\CCM\ClientSDK' -Class 'CCM_ClientUtilities' -Name 'DetermineIfRebootPending' -ErrorAction 'Stop' - [boolean]$IsSccmClientNamespaceExists = $true - If ($SCCMClientRebootStatus.ReturnValue -ne 0) { - Throw "'DetermineIfRebootPending' method of 'ROOT\CCM\ClientSDK\CCM_ClientUtilities' class returned error code [$($SCCMClientRebootStatus.ReturnValue)]" - } - Else { - Write-Log -Message 'Successfully queried SCCM client for reboot status.' -Source ${CmdletName} - [nullable[boolean]]$IsSCCMClientRebootPending = $false - If ($SCCMClientRebootStatus.IsHardRebootPending -or $SCCMClientRebootStatus.RebootPending) { - [nullable[boolean]]$IsSCCMClientRebootPending = $true - Write-Log -Message 'Pending SCCM reboot detected.' -Source ${CmdletName} - } - Else { - Write-Log -Message 'Pending SCCM reboot not detected.' -Source ${CmdletName} - } - } - } - Catch [System.Management.ManagementException] { - [nullable[boolean]]$IsSCCMClientRebootPending = $null - [boolean]$IsSccmClientNamespaceExists = $false - Write-Log -Message "Failed to get IsSCCMClientRebootPending. Failed to detect the SCCM client WMI class." -Severity 3 -Source ${CmdletName} - } - Catch { - [nullable[boolean]]$IsSCCMClientRebootPending = $null - [string[]]$PendRebootErrorMsg += "Failed to get IsSCCMClientRebootPending: $($_.Exception.Message)" - Write-Log -Message "Failed to get IsSCCMClientRebootPending. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - - ## Determine if there is a pending reboot from an App-V global Pending Task. (User profile based tasks will complete on logoff/logon) - Try { - If (Test-Path -LiteralPath 'HKLM:SOFTWARE\Software\Microsoft\AppV\Client\PendingTasks' -ErrorAction 'Stop') { - - [nullable[boolean]]$IsAppVRebootPending = $true - } - Else { - [nullable[boolean]]$IsAppVRebootPending = $false - } - } - Catch { - [nullable[boolean]]$IsAppVRebootPending = $null - [string[]]$PendRebootErrorMsg += "Failed to get IsAppVRebootPending: $($_.Exception.Message)" - Write-Log -Message "Failed to get IsAppVRebootPending. `n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} - } - - ## Determine if there is a pending reboot for the system - [boolean]$IsSystemRebootPending = $false - If ($IsCBServicingRebootPending -or $IsWindowsUpdateRebootPending -or $IsSCCMClientRebootPending -or $IsFileRenameRebootPending) { - [boolean]$IsSystemRebootPending = $true - } - - ## Create a custom object containing pending reboot information for the system - [psobject]$PendingRebootInfo = New-Object -TypeName 'PSObject' -Property @{ - ComputerName = $ComputerName - LastBootUpTime = $LastBootUpTime - IsSystemRebootPending = $IsSystemRebootPending - IsCBServicingRebootPending = $IsCBServicingRebootPending - IsWindowsUpdateRebootPending = $IsWindowsUpdateRebootPending - IsSCCMClientRebootPending = $IsSCCMClientRebootPending - IsAppVRebootPending = $IsAppVRebootPending - IsFileRenameRebootPending = $IsFileRenameRebootPending - PendingFileRenameOperations = $PendingFileRenameOperations - ErrorMsg = $PendRebootErrorMsg - } - Write-Log -Message "Pending reboot status on the local computer [$ComputerName]: `n$($PendingRebootInfo | Format-List | Out-String)" -Source ${CmdletName} - } - End { - Write-Output -InputObject ($PendingRebootInfo | Select-Object -Property 'ComputerName','LastBootUpTime','IsSystemRebootPending','IsCBServicingRebootPending','IsWindowsUpdateRebootPending','IsSCCMClientRebootPending','IsAppVRebootPending','IsFileRenameRebootPending','PendingFileRenameOperations','ErrorMsg') - - Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer - } + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Initialize variables + [String]$private:ComputerName = $envComputerNameFQDN + $PendRebootErrorMsg = $null + } + Process { + Write-Log -Message "Getting the pending reboot status on the local computer [$ComputerName]." -Source ${CmdletName} + + ## Get the date/time that the system last booted up + Try { + [Nullable[DateTime]]$LastBootUpTime = (Get-Date -ErrorAction 'Stop') - ([Timespan]::FromMilliseconds([Math]::Abs([Environment]::TickCount))) + } + Catch { + [Nullable[DateTime]]$LastBootUpTime = $null + [String[]]$PendRebootErrorMsg += "Failed to get LastBootUpTime: $($_.Exception.Message)" + Write-Log -Message "Failed to get LastBootUpTime. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if a Windows Vista/Server 2008 and above machine has a pending reboot from a Component Based Servicing (CBS) operation + Try { + If (([Version]$envOSVersion).Major -ge 5) { + If (Test-Path -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending' -ErrorAction 'Stop') { + [Nullable[Boolean]]$IsCBServicingRebootPending = $true + } + Else { + [Nullable[Boolean]]$IsCBServicingRebootPending = $false + } + } + } + Catch { + [Nullable[Boolean]]$IsCBServicingRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsCBServicingRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsCBServicingRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot from a Windows Update + Try { + If (Test-Path -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' -ErrorAction 'Stop') { + [Nullable[Boolean]]$IsWindowsUpdateRebootPending = $true + } + Else { + [Nullable[Boolean]]$IsWindowsUpdateRebootPending = $false + } + } + Catch { + [Nullable[Boolean]]$IsWindowsUpdateRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsWindowsUpdateRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsWindowsUpdateRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot from a pending file rename operation + [Boolean]$IsFileRenameRebootPending = $false + $PendingFileRenameOperations = $null + If (Test-RegistryValue -Key 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations') { + # If PendingFileRenameOperations value exists, set $IsFileRenameRebootPending variable to $true + [Boolean]$IsFileRenameRebootPending = $true + # Get the value of PendingFileRenameOperations + Try { + [String[]]$PendingFileRenameOperations = Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'PendingFileRenameOperations' -ErrorAction 'Stop' + } + Catch { + [String[]]$PendRebootErrorMsg += "Failed to get PendingFileRenameOperations: $($_.Exception.Message)" + Write-Log -Message "Failed to get PendingFileRenameOperations. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + + ## Determine SCCM 2012 Client reboot pending status + Try { + [Boolean]$IsSccmClientNamespaceExists = $false + [PSObject]$SCCMClientRebootStatus = Invoke-WmiMethod -ComputerName $ComputerName -Namespace 'ROOT\CCM\ClientSDK' -Class 'CCM_ClientUtilities' -Name 'DetermineIfRebootPending' -ErrorAction 'Stop' + [Boolean]$IsSccmClientNamespaceExists = $true + If ($SCCMClientRebootStatus.ReturnValue -ne 0) { + Throw "'DetermineIfRebootPending' method of 'ROOT\CCM\ClientSDK\CCM_ClientUtilities' class returned error code [$($SCCMClientRebootStatus.ReturnValue)]" + } + Else { + Write-Log -Message 'Successfully queried SCCM client for reboot status.' -Source ${CmdletName} + [Nullable[Boolean]]$IsSCCMClientRebootPending = $false + If ($SCCMClientRebootStatus.IsHardRebootPending -or $SCCMClientRebootStatus.RebootPending) { + [Nullable[Boolean]]$IsSCCMClientRebootPending = $true + Write-Log -Message 'Pending SCCM reboot detected.' -Source ${CmdletName} + } + Else { + Write-Log -Message 'Pending SCCM reboot not detected.' -Source ${CmdletName} + } + } + } + Catch [System.Management.ManagementException] { + [Nullable[Boolean]]$IsSCCMClientRebootPending = $null + [Boolean]$IsSccmClientNamespaceExists = $false + Write-Log -Message 'Failed to get IsSCCMClientRebootPending. Failed to detect the SCCM client WMI class.' -Severity 3 -Source ${CmdletName} + } + Catch { + [Nullable[Boolean]]$IsSCCMClientRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsSCCMClientRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsSCCMClientRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot from an App-V global Pending Task. (User profile based tasks will complete on logoff/logon) + Try { + If (Test-Path -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Software\Microsoft\AppV\Client\PendingTasks' -ErrorAction 'Stop') { + [Nullable[Boolean]]$IsAppVRebootPending = $true + } + Else { + [Nullable[Boolean]]$IsAppVRebootPending = $false + } + } + Catch { + [Nullable[Boolean]]$IsAppVRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsAppVRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsAppVRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot for the system + [Boolean]$IsSystemRebootPending = $false + If ($IsCBServicingRebootPending -or $IsWindowsUpdateRebootPending -or $IsSCCMClientRebootPending -or $IsFileRenameRebootPending) { + [Boolean]$IsSystemRebootPending = $true + } + + ## Create a custom object containing pending reboot information for the system + [PSObject]$PendingRebootInfo = New-Object -TypeName 'PSObject' -Property @{ + ComputerName = $ComputerName + LastBootUpTime = $LastBootUpTime + IsSystemRebootPending = $IsSystemRebootPending + IsCBServicingRebootPending = $IsCBServicingRebootPending + IsWindowsUpdateRebootPending = $IsWindowsUpdateRebootPending + IsSCCMClientRebootPending = $IsSCCMClientRebootPending + IsAppVRebootPending = $IsAppVRebootPending + IsFileRenameRebootPending = $IsFileRenameRebootPending + PendingFileRenameOperations = $PendingFileRenameOperations + ErrorMsg = $PendRebootErrorMsg + } + Write-Log -Message "Pending reboot status on the local computer [$ComputerName]: `r`n$($PendingRebootInfo | Format-List | Out-String)" -Source ${CmdletName} + } + End { + Write-Output -InputObject ($PendingRebootInfo | Select-Object -Property 'ComputerName', 'LastBootUpTime', 'IsSystemRebootPending', 'IsCBServicingRebootPending', 'IsWindowsUpdateRebootPending', 'IsSCCMClientRebootPending', 'IsAppVRebootPending', 'IsFileRenameRebootPending', 'PendingFileRenameOperations', 'ErrorMsg') + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } } #endregion +#region Function Set-ItemPermission +Function Set-ItemPermission { + <# +.SYNOPSIS + + Allow you to easily change permissions on files or folders + +.PARAMETER Path + + Path to the folder or file you want to modify (ex: C:\Temp) + +.PARAMETER User + + One or more user names (ex: BUILTIN\Users, DOMAIN\Admin) to give the permissions to. If you want to use SID, prefix it with an asterisk * (ex: *S-1-5-18) + +.PARAMETER Permission + + Permission or list of permissions to be set/added/removed/replaced. To see all the possible permissions go to 'http://technet.microsoft.com/fr-fr/library/ff730951.aspx'. + + Permission DeleteSubdirectoriesAndFiles does not apply to files. + +.PARAMETER PermissionType + + Sets Access Control Type of the permissions. Allowed options: Allow, Deny Default: Allow + +.PARAMETER Inheritance + + Sets permission inheritance. Does not apply to files. Multiple options can be specified. Allowed options: ObjectInherit, ContainerInherit, None Default: None + + None - The permission entry is not inherited by child objects, ObjectInherit - The permission entry is inherited by child leaf objects. ContainerInherit - The permission entry is inherited by child container objects. + +.PARAMETER Propagation + + Sets how to propagate inheritance. Does not apply to files. Allowed options: None, InheritOnly, NoPropagateInherit Default: None + + None - Specifies that no inheritance flags are set. NoPropagateInherit - Specifies that the permission entry is not propagated to child objects. InheritOnly - Specifies that the permission entry is propagated only to child objects. This includes both container and leaf child objects. + +.PARAMETER Method + + Specifies which method will be used to apply the permissions. Allowed options: Add, Set, Reset. + + Add - adds permissions rules but it does not remove previous permissions, Set - overwrites matching permission rules with new ones, Reset - removes matching permissions rules and then adds permission rules, Remove - Removes matching permission rules, RemoveSpecific - Removes specific permissions, RemoveAll - Removes all permission rules for specified user/s + Default: Add + +.PARAMETER EnableInheritance + + Enables inheritance on the files/folders. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + + Will grant FullControl permissions to 'John' and 'Users' on 'C:\Temp' and its files and folders children. + + PS C:\>Set-ItemPermission -Path 'C:\Temp' -User 'DOMAIN\John', 'BUILTIN\Utilisateurs' -Permission FullControl -Inheritance ObjectInherit,ContainerInherit + +.EXAMPLE + + Will grant Read permissions to 'John' on 'C:\Temp\pic.png' + + PS C:\>Set-ItemPermission -Path 'C:\Temp\pic.png' -User 'DOMAIN\John' -Permission 'Read' + +.EXAMPLE + + Will remove all permissions to 'John' on 'C:\Temp\Private' + + PS C:\>Set-ItemPermission -Path 'C:\Temp\Private' -User 'DOMAIN\John' -Permission 'None' -Method 'RemoveAll' + +.NOTES + + Original Author: Julian DA CUNHA - dacunha.julian@gmail.com, used with permission + +.LINK + + https://psappdeploytoolkit.com +#> + + [CmdletBinding()] + Param ( + [Parameter( Mandatory = $true, Position = 0, HelpMessage = 'Path to the folder or file you want to modify (ex: C:\Temp)', ParameterSetName = 'DisableInheritance' )] + [Parameter( Mandatory = $true, Position = 0, HelpMessage = 'Path to the folder or file you want to modify (ex: C:\Temp)', ParameterSetName = 'EnableInheritance' )] + [ValidateNotNullOrEmpty()] + [Alias('File', 'Folder')] + [String]$Path, + + [Parameter( Mandatory = $true, Position = 1, HelpMessage = 'One or more user names (ex: BUILTIN\Users, DOMAIN\Admin). If you want to use SID, prefix it with an asterisk * (ex: *S-1-5-18)', ParameterSetName = 'DisableInheritance')] + [Alias('Username', 'Users', 'SID', 'Usernames')] + [String[]]$User, + + [Parameter( Mandatory = $true, Position = 2, HelpMessage = "Permission or list of permissions to be set/added/removed/replaced. To see all the possible permissions go to 'http://technet.microsoft.com/fr-fr/library/ff730951.aspx'", ParameterSetName = 'DisableInheritance')] + [Alias('Acl', 'Grant', 'Permissions', 'Deny')] + [ValidateSet('AppendData', 'ChangePermissions', 'CreateDirectories', 'CreateFiles', 'Delete', ` + 'DeleteSubdirectoriesAndFiles', 'ExecuteFile', 'FullControl', 'ListDirectory', 'Modify', ` + 'Read', 'ReadAndExecute', 'ReadAttributes', 'ReadData', 'ReadExtendedAttributes', 'ReadPermissions', ` + 'Synchronize', 'TakeOwnership', 'Traverse', 'Write', 'WriteAttributes', 'WriteData', 'WriteExtendedAttributes', 'None')] + [String[]]$Permission, + + [Parameter( Mandatory = $false, Position = 3, HelpMessage = 'Whether you want to set Allow or Deny permissions', ParameterSetName = 'DisableInheritance')] + [Alias('AccessControlType')] + [ValidateSet('Allow', 'Deny')] + [String]$PermissionType = 'Allow', + + [Parameter( Mandatory = $false, Position = 4, HelpMessage = 'Sets how permissions are inherited', ParameterSetName = 'DisableInheritance')] + [ValidateSet('ContainerInherit', 'None', 'ObjectInherit')] + [String[]]$Inheritance = 'None', + + [Parameter( Mandatory = $false, Position = 5, HelpMessage = 'Sets how to propage inheritance flags', ParameterSetName = 'DisableInheritance')] + [ValidateSet('None', 'InheritOnly', 'NoPropagateInherit')] + [String]$Propagation = 'None', + + [Parameter( Mandatory = $false, Position = 6, HelpMessage = 'Specifies which method will be used to add/remove/replace permissions.', ParameterSetName = 'DisableInheritance')] + [ValidateSet('Add', 'Set', 'Reset', 'Remove', 'RemoveSpecific', 'RemoveAll')] + [Alias('ApplyMethod', 'ApplicationMethod')] + [String]$Method = 'Add', + + [Parameter( Mandatory = $true, Position = 1, HelpMessage = 'Enables inheritance, which removes explicit permissions.', ParameterSetName = 'EnableInheritance')] + [Switch]$EnableInheritance + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + + Process { + # Test elevated perms + If (-not $IsAdmin) { + Write-Log -Message 'Unable to use the function [Set-ItemPermission] without elevated permissions.' -Source ${CmdletName} + Throw 'Unable to use the function [Set-ItemPermission] without elevated permissions.' + } + + # Check path existence + If (-not (Test-Path -Path $Path -ErrorAction 'Stop')) { + Write-Log -Message "Specified path does not exist [$Path]." -Source ${CmdletName} + Throw "Specified path does not exist [$Path]." + } + + If ($EnableInheritance) { + # Get object acls + $Acl = (Get-Item -Path $Path -ErrorAction 'Stop').GetAccessControl('Access') + # Enable inherance + $Acl.SetAccessRuleProtection($false, $true) + Write-Log -Message "Enabling Inheritance on path [$Path]." -Source ${CmdletName} + $null = Set-Acl -Path $Path -AclObject $Acl -ErrorAction 'Stop' + Return + } + # Permissions + [System.Security.AccessControl.FileSystemRights]$FileSystemRights = New-Object -TypeName 'System.Security.AccessControl.FileSystemRights' + If ($Permission -ne 'None') { + ForEach ($Entry in $Permission) { + $FileSystemRights = $FileSystemRights -bor [System.Security.AccessControl.FileSystemRights]$Entry + } + } + + # InheritanceFlags + $InheritanceFlag = New-Object -TypeName 'System.Security.AccessControl.InheritanceFlags' + ForEach ($IFlag in $Inheritance) { + $InheritanceFlag = $InheritanceFlag -bor [System.Security.AccessControl.InheritanceFlags]$IFlag + } + + # PropagationFlags + $PropagationFlag = [System.Security.AccessControl.PropagationFlags]$Propagation + + # Access Control Type + $Allow = [System.Security.AccessControl.AccessControlType]$PermissionType + + # Modify variables to remove file incompatible flags if this is a file + If (Test-Path -Path $Path -ErrorAction 'Stop' -PathType 'Leaf') { + $FileSystemRights = $FileSystemRights -band (-bnot [System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) + $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None + $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None + } + + # Get object acls + $Acl = (Get-Item -Path $Path -ErrorAction 'Stop').GetAccessControl('Access') + # Disable inherance, Preserve inherited permissions + $Acl.SetAccessRuleProtection($true, $true) + $null = Set-Acl -Path $Path -AclObject $Acl -ErrorAction 'Stop' + # Get updated acls - without inheritance + $Acl = $null + $Acl = (Get-Item -Path $Path -ErrorAction 'Stop').GetAccessControl('Access') + # Apply permissions on Users + ForEach ($U in $User) { + # Trim whitespace and skip if empty + $U = $U.Trim() + If ($U.Length -eq 0) { + Continue + } + # Set Username + If ($U.StartsWith('*')) { + # This is a SID, remove the * + $U = $U.remove(0, 1) + Try { + # Translate the SID + $UsersAccountName = ConvertTo-NTAccountOrSID -SID $U + } + Catch { + Write-Log "Failed to translate SID [$U]. Skipping..." -Source ${CmdletName} -Severity 2 + Continue + } + + $Username = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList ($UsersAccountName) + } + Else { + $Username = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList ($U) + } + + # Set/Add/Remove/Replace permissions and log the changes + $Rule = New-Object -TypeName 'System.Security.AccessControl.FileSystemAccessRule' -ArgumentList ($Username, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $Allow) + Switch ($Method) { + 'Add' { + Write-Log -Message "Setting permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.AddAccessRule($Rule) + Break + } + 'Set' { + Write-Log -Message "Setting permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.SetAccessRule($Rule) + Break + } + 'Reset' { + Write-Log -Message "Setting permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.ResetAccessRule($Rule) + Break + } + 'Remove' { + Write-Log -Message "Removing permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.RemoveAccessRule($Rule) + Break + } + 'RemoveSpecific' { + Write-Log -Message "Removing permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.RemoveAccessRuleSpecific($Rule) + Break + } + 'RemoveAll' { + Write-Log -Message "Removing permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.RemoveAccessRuleAll($Rule) + Break + } + } + } + # Use the prepared ACL + $null = Set-Acl -Path $Path -AclObject $Acl -ErrorAction 'Stop' + } + + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion #endregion ##*============================================= @@ -10366,159 +15721,210 @@ Function Get-PendingReboot { ## If the script was invoked by the Help Console, exit the script now If ($invokingScript) { - If ((Split-Path -Path $invokingScript -Leaf) -eq 'AppDeployToolkitHelp.ps1') { Return } + If ((Split-Path -Path $invokingScript -Leaf) -eq 'AppDeployToolkitHelp.ps1') { + Return + } } ## Add the custom types required for the toolkit If (-not ([Management.Automation.PSTypeName]'PSADT.UiAutomation').Type) { - [string[]]$ReferencedAssemblies = 'System.Drawing', 'System.Windows.Forms', 'System.DirectoryServices' - Add-Type -Path $appDeployCustomTypesSourceCode -ReferencedAssemblies $ReferencedAssemblies -IgnoreWarnings -ErrorAction 'Stop' + [String[]]$ReferencedAssemblies = 'System.Drawing', 'System.Windows.Forms', 'System.DirectoryServices' + Add-Type -Path $appDeployCustomTypesSourceCode -ReferencedAssemblies $ReferencedAssemblies -IgnoreWarnings -ErrorAction 'Stop' } ## Define ScriptBlocks to disable/revert script logging -[scriptblock]$DisableScriptLogging = { $OldDisableLoggingValue = $DisableLogging ; $DisableLogging = $true } -[scriptblock]$RevertScriptLogging = { $DisableLogging = $OldDisableLoggingValue } +[ScriptBlock]$DisableScriptLogging = { $OldDisableLoggingValue = $DisableLogging ; $DisableLogging = $true } +[ScriptBlock]$RevertScriptLogging = { $DisableLogging = $OldDisableLoggingValue } ## Define ScriptBlock for getting details for all logged on users -[scriptblock]$GetLoggedOnUserDetails = { - [psobject[]]$LoggedOnUserSessions = Get-LoggedOnUser - [string[]]$usersLoggedOn = $LoggedOnUserSessions | ForEach-Object { $_.NTAccount } - - If ($usersLoggedOn) { - # Get account and session details for the logged on user session that the current process is running under. Note that the account used to execute the current process may be different than the account that is logged into the session (i.e. you can use "RunAs" to launch with different credentials when logged into an account). - [psobject]$CurrentLoggedOnUserSession = $LoggedOnUserSessions | Where-Object { $_.IsCurrentSession } - - # Get account and session details for the account running as the console user (user with control of the physical monitor, keyboard, and mouse) - [psobject]$CurrentConsoleUserSession = $LoggedOnUserSessions | Where-Object { $_.IsConsoleSession } - - ## Determine the account that will be used to execute commands in the user session when toolkit is running under the SYSTEM account - # If a console user exists, then that will be the active user session. - # If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that is either 'Active' or 'Connected' is the active user. - [psobject]$RunAsActiveUser = $LoggedOnUserSessions | Where-Object { $_.IsActiveUserSession } - } -} - -## Define ScriptBlock to test for and attempt to make a service healthy by checking if it exists, is currently running, and has the specified start mode. -[scriptblock]$TestServiceHealth = { - Param ( - [string]$ServiceName, - [string]$ServiceStartMode = 'Automatic' - ) - Try { - [boolean]$IsServiceHealthy = $true - If (Test-ServiceExists -Name $ServiceName -ContinueOnError $false) { - If ((Get-ServiceStartMode -Name $ServiceName -ContinueOnError $false) -ne $ServiceStartMode) { - Set-ServiceStartMode -Name $ServiceName -StartMode $ServiceStartMode -ContinueOnError $false - } - Start-ServiceAndDependencies -Name $ServiceName -SkipServiceExistsTest -ContinueOnError $false - } - Else { - [boolean]$IsServiceHealthy = $false - } - } - Catch { - [boolean]$IsServiceHealthy = $false - } - Write-Output -InputObject $IsServiceHealthy +[ScriptBlock]$GetLoggedOnUserDetails = { + [PSObject[]]$LoggedOnUserSessions = Get-LoggedOnUser + [String[]]$usersLoggedOn = $LoggedOnUserSessions | ForEach-Object { $_.NTAccount } + + If ($usersLoggedOn) { + # Get account and session details for the logged on user session that the current process is running under. Note that the account used to execute the current process may be different than the account that is logged into the session (i.e. you can use "RunAs" to launch with different credentials when logged into an account). + [PSObject]$CurrentLoggedOnUserSession = $LoggedOnUserSessions | Where-Object { $_.IsCurrentSession } + + # Get account and session details for the account running as the console user (user with control of the physical monitor, keyboard, and mouse) + [PSObject]$CurrentConsoleUserSession = $LoggedOnUserSessions | Where-Object { $_.IsConsoleSession } + + ## Determine the account that will be used to execute commands in the user session when toolkit is running under the SYSTEM account + # If a console user exists, then that will be the active user session. + # If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that is either 'Active' or 'Connected' is the active user. + [PSObject]$RunAsActiveUser = $LoggedOnUserSessions | Where-Object { $_.IsActiveUserSession } + } +} + +[ScriptBlock]$GetLoggedOnUserTempPath = { + # When running in system context we can derive the native "C:\Users" base path from the Public environment variable + [String]$dirUserProfile = Split-path $envPublic -ErrorAction 'SilentlyContinue' + If ($null -ne $RunAsActiveUser.NTAccount) { + [String]$userProfileName = $RunAsActiveUser.UserName + If (Test-Path (Join-Path -Path $dirUserProfile -ChildPath $userProfileName -ErrorAction 'SilentlyContinue')) { + [String]$runasUserProfile = Join-Path -Path $dirUserProfile -ChildPath $userProfileName -ErrorAction 'SilentlyContinue' + [String]$loggedOnUserTempPath = Join-Path -Path $runasUserProfile -ChildPath (Join-Path -Path $appDeployToolkitName -ChildPath 'ExecuteAsUser') + If (-not (Test-Path -LiteralPath $loggedOnUserTempPath -PathType 'Container' -ErrorAction 'SilentlyContinue')) { + $null = New-Item -Path $loggedOnUserTempPath -ItemType 'Directory' -Force -ErrorAction 'SilentlyContinue' + } + } + } + Else { + [String]$loggedOnUserTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'ExecuteAsUser' + } } ## Disable logging until log file details are available . $DisableScriptLogging ## If the default Deploy-Application.ps1 hasn't been modified, and the main script was not called by a referring script, check for MSI / MST and modify the install accordingly -If ((-not $appName) -and (-not $ReferredInstallName)){ - # Find the first MSI file in the Files folder and use that as our install - [string]$defaultMsiFile = Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msi') } | Select-Object -ExpandProperty 'FullName' -First 1 - If ($defaultMsiFile) { - Try { - [boolean]$useDefaultMsi = $true - Write-Log -Message "Discovered Zero-Config MSI installation file [$defaultMsiFile]." -Source $appDeployToolkitName - # Discover if there is a zero-config MST file - [string]$defaultMstFile = [IO.Path]::ChangeExtension($defaultMsiFile, 'mst') - If (Test-Path -LiteralPath $defaultMstFile -PathType 'Leaf') { - Write-Log -Message "Discovered Zero-Config MST installation file [$defaultMstFile]." -Source $appDeployToolkitName - } - Else { - [string]$defaultMstFile = '' - } - # Discover if there are zero-config MSP files. Name multiple MSP files in alphabetical order to control order in which they are installed. - [string[]]$defaultMspFiles = Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msp') } | Select-Object -ExpandProperty 'FullName' - If ($defaultMspFiles) { - Write-Log -Message "Discovered Zero-Config MSP installation file(s) [$($defaultMspFiles -join ',')]." -Source $appDeployToolkitName - } - - ## Read the MSI and get the installation details - [hashtable]$GetDefaultMsiTablePropertySplat = @{ Path = $defaultMsiFile; Table = 'Property'; ContinueOnError = $false; ErrorAction = 'Stop' } - If ($defaultMstFile) { $GetDefaultMsiTablePropertySplat.Add('TransformPath', $defaultMstFile) } - [psobject]$defaultMsiPropertyList = Get-MsiTableProperty @GetDefaultMsiTablePropertySplat - [string]$appVendor = $defaultMsiPropertyList.Manufacturer - [string]$appName = $defaultMsiPropertyList.ProductName - [string]$appVersion = $defaultMsiPropertyList.ProductVersion - $GetDefaultMsiTablePropertySplat.Set_Item('Table', 'File') - [psobject]$defaultMsiFileList = Get-MsiTableProperty @GetDefaultMsiTablePropertySplat - [string[]]$defaultMsiExecutables = Get-Member -InputObject $defaultMsiFileList -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Name' -ErrorAction 'Stop' | Where-Object { [IO.Path]::GetExtension($_) -eq '.exe' } | ForEach-Object { [IO.Path]::GetFileNameWithoutExtension($_) } - [string]$defaultMsiExecutablesList = $defaultMsiExecutables -join ',' - Write-Log -Message "App Vendor [$appVendor]." -Source $appDeployToolkitName - Write-Log -Message "App Name [$appName]." -Source $appDeployToolkitName - Write-Log -Message "App Version [$appVersion]." -Source $appDeployToolkitName - Write-Log -Message "MSI Executable List [$defaultMsiExecutablesList]." -Source $appDeployToolkitName - } - Catch { - Write-Log -Message "Failed to process Zero-Config MSI Deployment. `n$(Resolve-Error)" -Source $appDeployToolkitName - $useDefaultMsi = $false ; $appVendor = '' ; $appName = '' ; $appVersion = '' - } - } -} - -## Set up sample variables if Dot Sourcing the script, app details have not been specified, or InstallName not passed as parameter to the script +If ((-not $appName) -and (-not $ReferredInstallName)) { + # Build properly formatted Architecture String + Switch ($Is64Bit) { + $false { + $formattedOSArch = 'x86' + } + $true { + $formattedOSArch = 'x64' + } + } + # Find the first MSI file in the Files folder and use that as our install + If ([String]$defaultMsiFile = (Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msi') -and ($_.Name.EndsWith(".$formattedOSArch.msi")) } | Select-Object -ExpandProperty 'FullName' -First 1)) { + Write-Log -Message "Discovered $formattedOSArch Zerotouch MSI under $defaultMSIFile" -Source $appDeployToolkitName + } + ElseIf ([String]$defaultMsiFile = (Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msi') } | Select-Object -ExpandProperty 'FullName' -First 1)) { + Write-Log -Message "Discovered Arch-Independent Zerotouch MSI under $defaultMSIFile" -Source $appDeployToolkitName + } + If ($defaultMsiFile) { + Try { + [Boolean]$useDefaultMsi = $true + Write-Log -Message "Discovered Zero-Config MSI installation file [$defaultMsiFile]." -Source $appDeployToolkitName + # Discover if there is a zero-config MST file + [String]$defaultMstFile = [IO.Path]::ChangeExtension($defaultMsiFile, 'mst') + If (Test-Path -LiteralPath $defaultMstFile -PathType 'Leaf') { + Write-Log -Message "Discovered Zero-Config MST installation file [$defaultMstFile]." -Source $appDeployToolkitName + } + Else { + [String]$defaultMstFile = '' + } + # Discover if there are zero-config MSP files. Name multiple MSP files in alphabetical order to control order in which they are installed. + [String[]]$defaultMspFiles = Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msp') } | Select-Object -ExpandProperty 'FullName' + If ($defaultMspFiles) { + Write-Log -Message "Discovered Zero-Config MSP installation file(s) [$($defaultMspFiles -join ',')]." -Source $appDeployToolkitName + } + + ## Read the MSI and get the installation details + [Hashtable]$GetDefaultMsiTablePropertySplat = @{ Path = $defaultMsiFile; Table = 'Property'; ContinueOnError = $false; ErrorAction = 'Stop' } + If ($defaultMstFile) { + $GetDefaultMsiTablePropertySplat.Add('TransformPath', $defaultMstFile) + } + [PSObject]$defaultMsiPropertyList = Get-MsiTableProperty @GetDefaultMsiTablePropertySplat + [String]$appVendor = $defaultMsiPropertyList.Manufacturer + [String]$appName = $defaultMsiPropertyList.ProductName + [String]$appVersion = $defaultMsiPropertyList.ProductVersion + $GetDefaultMsiTablePropertySplat.Set_Item('Table', 'File') + [PSObject]$defaultMsiFileList = Get-MsiTableProperty @GetDefaultMsiTablePropertySplat + [String[]]$defaultMsiExecutables = Get-Member -InputObject $defaultMsiFileList -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Name' -ErrorAction 'Stop' | Where-Object { [IO.Path]::GetExtension($_) -eq '.exe' } | ForEach-Object { [IO.Path]::GetFileNameWithoutExtension($_) } + [String]$defaultMsiExecutablesList = $defaultMsiExecutables -join ',' + Write-Log -Message "App Vendor [$appVendor]." -Source $appDeployToolkitName + Write-Log -Message "App Name [$appName]." -Source $appDeployToolkitName + Write-Log -Message "App Version [$appVersion]." -Source $appDeployToolkitName + Write-Log -Message "MSI Executable List [$defaultMsiExecutablesList]." -Source $appDeployToolkitName + } + Catch { + Write-Log -Message "Failed to process Zero-Config MSI Deployment. `r`n$(Resolve-Error)" -Source $appDeployToolkitName + $useDefaultMsi = $false ; $appVendor = '' ; $appName = '' ; $appVersion = '' + } + } +} + +## Set up sample variables if Dot Sourcing the script, app details have not been specified If (-not $appName) { - [string]$appName = $appDeployMainScriptFriendlyName - If (-not $appVendor) { [string]$appVendor = 'PS' } - If (-not $appVersion) { [string]$appVersion = $appDeployMainScriptVersion } - If (-not $appLang) { [string]$appLang = $currentLanguage } - If (-not $appRevision) { [string]$appRevision = '01' } - If (-not $appArch) { [string]$appArch = '' } -} -If ($ReferredInstallTitle) { [string]$installTitle = $ReferredInstallTitle } -If (-not $installTitle) { - [string]$installTitle = ("$appVendor $appName $appVersion").Trim() + [String]$appName = $appDeployMainScriptFriendlyName + If (-not $appVendor) { + [String]$appVendor = 'PS' + } + If (-not $appVersion) { + [String]$appVersion = $appDeployMainScriptVersion + } + If (-not $appLang) { + [String]$appLang = $currentLanguage + } + If (-not $appRevision) { + [String]$appRevision = '01' + } + If (-not $appArch) { + [String]$appArch = '' + } +} +Else { + If (-not $appVendor) { + [String]$appVendor = '' + } + If (-not $appVersion) { + [String]$appVersion = '' + } + If (-not $appLang) { + [String]$appLang = '' + } + If (-not $appRevision) { + [String]$appRevision = '' + } + If (-not $appArch) { + [String]$appArch = '' + } } ## Sanitize the application details, as they can cause issues in the script -[char[]]$invalidFileNameChars = [IO.Path]::GetInvalidFileNameChars() -[string]$appVendor = $appVendor -replace "[$invalidFileNameChars]",'' -replace ' ','' -[string]$appName = $appName -replace "[$invalidFileNameChars]",'' -replace ' ','' -[string]$appVersion = $appVersion -replace "[$invalidFileNameChars]",'' -replace ' ','' -[string]$appArch = $appArch -replace "[$invalidFileNameChars]",'' -replace ' ','' -[string]$appLang = $appLang -replace "[$invalidFileNameChars]",'' -replace ' ','' -[string]$appRevision = $appRevision -replace "[$invalidFileNameChars]",'' -replace ' ','' +[String]$appVendor = (Remove-InvalidFileNameChars -Name ($appVendor.Trim())) +[String]$appName = (Remove-InvalidFileNameChars -Name ($appName.Trim())) +[String]$appVersion = (Remove-InvalidFileNameChars -Name ($appVersion.Trim())) +[String]$appArch = (Remove-InvalidFileNameChars -Name ($appArch.Trim())) +[String]$appLang = (Remove-InvalidFileNameChars -Name ($appLang.Trim())) +[String]$appRevision = (Remove-InvalidFileNameChars -Name ($appRevision.Trim())) + +## Build the Installation Title +If ($ReferredInstallTitle) { + [String]$installTitle = (Remove-InvalidFileNameChars -Name ($ReferredInstallTitle.Trim())) +} +If (-not $installTitle) { + [String]$installTitle = "$appVendor $appName $appVersion" +} + +## Set Powershell window title, in case the window is visible +[String]$oldPSWindowTitle = $Host.UI.RawUI.WindowTitle +$Host.UI.RawUI.WindowTitle = "$installTitle - $DeploymentType" ## Build the Installation Name -If ($ReferredInstallName) { [string]$installName = $ReferredInstallName } +If ($ReferredInstallName) { + [String]$installName = (Remove-InvalidFileNameChars -Name $ReferredInstallName) +} If (-not $installName) { - If ($appArch) { - [string]$installName = $appVendor + '_' + $appName + '_' + $appVersion + '_' + $appArch + '_' + $appLang + '_' + $appRevision - } - Else { - [string]$installName = $appVendor + '_' + $appName + '_' + $appVersion + '_' + $appLang + '_' + $appRevision - } + If ($appArch) { + [String]$installName = $appVendor + '_' + $appName + '_' + $appVersion + '_' + $appArch + '_' + $appLang + '_' + $appRevision + } + Else { + [String]$installName = $appVendor + '_' + $appName + '_' + $appVersion + '_' + $appLang + '_' + $appRevision + } } -[string]$installName = $installName -replace "[$invalidFileNameChars]",'' -replace ' ','' -[string]$installName = $installName.Trim('_') -replace '[_]+','_' +[String]$installName = (($installName -replace ' ', '').Trim('_') -replace '[_]+', '_') ## Set the Defer History registry path -[string]$regKeyDeferHistory = "$configToolkitRegPath\$appDeployToolkitName\DeferHistory\$installName" +[String]$regKeyDeferHistory = "$configToolkitRegPath\$appDeployToolkitName\DeferHistory\$installName" ## Variables: Log Files -If ($ReferredLogName) { [string]$logName = $ReferredLogName } -If (-not $logName) { [string]$logName = $installName + '_' + $appDeployToolkitName + '_' + $deploymentType + '.log' } +If ($ReferredLogName) { + [String]$logName = $ReferredLogName +} +If (-not $logName) { + [String]$logName = $installName + '_' + $appDeployToolkitName + '_' + $deploymentType + '.log' +} # If option to compress logs is selected, then log will be created in temp log folder ($logTempFolder) and then copied to actual log folder ($configToolkitLogDir) after being zipped. -[string]$logTempFolder = Join-Path -Path $envTemp -ChildPath "${installName}_$deploymentType" +[String]$logTempFolder = Join-Path -Path $envTemp -ChildPath "${installName}_$deploymentType" If ($configToolkitCompressLogs) { - # If the temp log folder already exists from a previous ZIP operation, then delete all files in it to avoid issues - If (Test-Path -LiteralPath $logTempFolder -PathType 'Container' -ErrorAction 'SilentlyContinue') { - $null = Remove-Item -LiteralPath $logTempFolder -Recurse -Force -ErrorAction 'SilentlyContinue' - } + # If the temp log folder already exists from a previous ZIP operation, then delete all files in it to avoid issues + If (Test-Path -LiteralPath $logTempFolder -PathType 'Container' -ErrorAction 'SilentlyContinue') { + $null = Remove-Item -LiteralPath $logTempFolder -Recurse -Force -ErrorAction 'SilentlyContinue' + } } ## Revert script logging to original setting @@ -10527,70 +15933,107 @@ If ($configToolkitCompressLogs) { ## Initialize Logging $installPhase = 'Initialization' $scriptSeparator = '*' * 79 -Write-Log -Message ($scriptSeparator,$scriptSeparator) -Source $appDeployToolkitName +Write-Log -Message ($scriptSeparator, $scriptSeparator) -Source $appDeployToolkitName Write-Log -Message "[$installName] setup started." -Source $appDeployToolkitName ## Assemblies: Load Try { - Add-Type -AssemblyName 'System.Windows.Forms' -ErrorAction 'Stop' - Add-Type -AssemblyName 'PresentationFramework' -ErrorAction 'Stop' - Add-Type -AssemblyName 'Microsoft.VisualBasic' -ErrorAction 'Stop' - Add-Type -AssemblyName 'System.Drawing' -ErrorAction 'Stop' - Add-Type -AssemblyName 'PresentationCore' -ErrorAction 'Stop' - Add-Type -AssemblyName 'WindowsBase' -ErrorAction 'Stop' + Add-Type -AssemblyName ('System.Drawing', 'System.Windows.Forms', 'PresentationFramework', 'Microsoft.VisualBasic', 'PresentationCore', 'WindowsBase') -ErrorAction 'Stop' +} +Catch { + Write-Log -Message "Failed to load assembly. `r`n$(Resolve-Error)" -Severity 3 -Source $appDeployToolkitName + If ($deployModeNonInteractive) { + Write-Log -Message "Continue despite assembly load error since deployment mode is [$deployMode]." -Source $appDeployToolkitName + } + Else { + Exit-Script -ExitCode 60004 + } +} + +# Calculate banner height +[Int32]$appDeployLogoBannerHeight = 0 +Try { + [System.Drawing.Bitmap]$appDeployLogoBannerObject = New-Object -TypeName 'System.Drawing.Bitmap' -ArgumentList ($appDeployLogoBanner) + [Int32]$appDeployLogoBannerHeight = $appDeployLogoBannerObject.Height + If ($appDeployLogoBannerHeight -gt $appDeployLogoBannerMaxHeight) { + $appDeployLogoBannerHeight = $appDeployLogoBannerMaxHeight + } + $appDeployLogoBannerObject.Dispose($true) # Must dispose() when installing from local cache or else AppDeployToolkitBanner.png is locked and cannot be removed } Catch { - Write-Log -Message "Failed to load assembly. `n$(Resolve-Error)" -Severity 3 -Source $appDeployToolkitName - If ($deployModeNonInteractive) { - Write-Log -Message "Continue despite assembly load error since deployment mode is [$deployMode]." -Source $appDeployToolkitName - } - Else { - Exit-Script -ExitCode 60004 - } } +## Get the default font to use in the user interface +[System.Drawing.Font]$defaultFont = [System.Drawing.SystemFonts]::MessageBoxFont + ## Check how the script was invoked If ($invokingScript) { - Write-Log -Message "Script [$scriptPath] dot-source invoked by [$invokingScript]" -Source $appDeployToolkitName + Write-Log -Message "Script [$scriptPath] dot-source invoked by [$invokingScript]" -Source $appDeployToolkitName } Else { - Write-Log -Message "Script [$scriptPath] invoked directly" -Source $appDeployToolkitName + Write-Log -Message "Script [$scriptPath] invoked directly" -Source $appDeployToolkitName } ## Dot Source script extensions If (Test-Path -LiteralPath "$scriptRoot\$appDeployToolkitDotSourceExtensions" -PathType 'Leaf') { - . "$scriptRoot\$appDeployToolkitDotSourceExtensions" + . "$scriptRoot\$appDeployToolkitDotSourceExtensions" } ## Evaluate non-default parameters passed to the scripts -If ($deployAppScriptParameters) { [string]$deployAppScriptParameters = ($deployAppScriptParameters.GetEnumerator() | ForEach-Object { If ($_.Value.GetType().Name -eq 'SwitchParameter') { "-$($_.Key):`$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Boolean') { "-$($_.Key) `$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Int32') { "-$($_.Key) $($_.Value)" } Else { "-$($_.Key) `"$($_.Value)`"" } }) -join ' ' } +If ($deployAppScriptParameters) { + [String]$deployAppScriptParameters = ($deployAppScriptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' +} # Save main script parameters hashtable for async execution of the toolkit -[hashtable]$appDeployMainScriptAsyncParameters = $appDeployMainScriptParameters -If ($appDeployMainScriptParameters) { [string]$appDeployMainScriptParameters = ($appDeployMainScriptParameters.GetEnumerator() | ForEach-Object { If ($_.Value.GetType().Name -eq 'SwitchParameter') { "-$($_.Key):`$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Boolean') { "-$($_.Key) `$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Int32') { "-$($_.Key) $($_.Value)" } Else { "-$($_.Key) `"$($_.Value)`"" } }) -join ' ' } -If ($appDeployExtScriptParameters) { [string]$appDeployExtScriptParameters = ($appDeployExtScriptParameters.GetEnumerator() | ForEach-Object { If ($_.Value.GetType().Name -eq 'SwitchParameter') { "-$($_.Key):`$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Boolean') { "-$($_.Key) `$" + "$($_.Value)".ToLower() } ElseIf ($_.Value.GetType().Name -eq 'Int32') { "-$($_.Key) $($_.Value)" } Else { "-$($_.Key) `"$($_.Value)`"" } }) -join ' ' } +[Hashtable]$appDeployMainScriptAsyncParameters = $appDeployMainScriptParameters +If ($appDeployMainScriptParameters) { + [String]$appDeployMainScriptParameters = ($appDeployMainScriptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' +} +If ($appDeployExtScriptParameters) { + [String]$appDeployExtScriptParameters = ($appDeployExtScriptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' +} ## Check the XML config file version If ($configConfigVersion -lt $appDeployMainScriptMinimumConfigVersion) { - [string]$XMLConfigVersionErr = "The XML configuration file version [$configConfigVersion] is lower than the supported version required by the Toolkit [$appDeployMainScriptMinimumConfigVersion]. Please upgrade the configuration file." - Write-Log -Message $XMLConfigVersionErr -Severity 3 -Source $appDeployToolkitName - Throw $XMLConfigVersionErr + [String]$XMLConfigVersionErr = "The XML configuration file version [$configConfigVersion] is lower than the supported version required by the Toolkit [$appDeployMainScriptMinimumConfigVersion]. Please upgrade the configuration file." + Write-Log -Message $XMLConfigVersionErr -Severity 3 -Source $appDeployToolkitName + Throw $XMLConfigVersionErr } ## Log system/script information -If ($appScriptVersion) { Write-Log -Message "[$installName] script version is [$appScriptVersion]" -Source $appDeployToolkitName } -If ($deployAppScriptFriendlyName) { Write-Log -Message "[$deployAppScriptFriendlyName] script version is [$deployAppScriptVersion]" -Source $appDeployToolkitName } -If ($deployAppScriptParameters) { Write-Log -Message "The following non-default parameters were passed to [$deployAppScriptFriendlyName]: [$deployAppScriptParameters]" -Source $appDeployToolkitName } -If ($appDeployMainScriptFriendlyName) { Write-Log -Message "[$appDeployMainScriptFriendlyName] script version is [$appDeployMainScriptVersion]" -Source $appDeployToolkitName } -If ($appDeployMainScriptParameters) { Write-Log -Message "The following non-default parameters were passed to [$appDeployMainScriptFriendlyName]: [$appDeployMainScriptParameters]" -Source $appDeployToolkitName } -If ($appDeployExtScriptFriendlyName) { Write-Log -Message "[$appDeployExtScriptFriendlyName] version is [$appDeployExtScriptVersion]" -Source $appDeployToolkitName } -If ($appDeployExtScriptParameters) { Write-Log -Message "The following non-default parameters were passed to [$appDeployExtScriptFriendlyName]: [$appDeployExtScriptParameters]" -Source $appDeployToolkitName } +If ($appScriptVersion) { + Write-Log -Message "[$installName] script version is [$appScriptVersion]" -Source $appDeployToolkitName +} +If ($appScriptDate) { + Write-Log -Message "[$installName] script date is [$appScriptDate]" -Source $appDeployToolkitName +} +If ($appScriptAuthor) { + Write-Log -Message "[$installName] script author is [$appScriptAuthor]" -Source $appDeployToolkitName +} +If ($deployAppScriptFriendlyName) { + Write-Log -Message "[$deployAppScriptFriendlyName] script version is [$deployAppScriptVersion]" -Source $appDeployToolkitName +} +If ($deployAppScriptParameters) { + Write-Log -Message "The following non-default parameters were passed to [$deployAppScriptFriendlyName]: [$deployAppScriptParameters]" -Source $appDeployToolkitName +} +If ($appDeployMainScriptFriendlyName) { + Write-Log -Message "[$appDeployMainScriptFriendlyName] script version is [$appDeployMainScriptVersion]" -Source $appDeployToolkitName +} +If ($appDeployMainScriptParameters) { + Write-Log -Message "The following non-default parameters were passed to [$appDeployMainScriptFriendlyName]: [$appDeployMainScriptParameters]" -Source $appDeployToolkitName +} +If ($appDeployExtScriptFriendlyName) { + Write-Log -Message "[$appDeployExtScriptFriendlyName] version is [$appDeployExtScriptVersion]" -Source $appDeployToolkitName +} +If ($appDeployExtScriptParameters) { + Write-Log -Message "The following non-default parameters were passed to [$appDeployExtScriptFriendlyName]: [$appDeployExtScriptParameters]" -Source $appDeployToolkitName +} Write-Log -Message "Computer Name is [$envComputerNameFQDN]" -Source $appDeployToolkitName Write-Log -Message "Current User is [$ProcessNTAccount]" -Source $appDeployToolkitName If ($envOSServicePack) { - Write-Log -Message "OS Version is [$envOSName $envOSServicePack $envOSArchitecture $envOSVersion]" -Source $appDeployToolkitName + Write-Log -Message "OS Version is [$envOSName $envOSServicePack $envOSArchitecture $envOSVersion]" -Source $appDeployToolkitName } Else { - Write-Log -Message "OS Version is [$envOSName $envOSArchitecture $envOSVersion]" -Source $appDeployToolkitName + Write-Log -Message "OS Version is [$envOSName $envOSArchitecture $envOSVersion]" -Source $appDeployToolkitName } Write-Log -Message "OS Type is [$envOSProductTypeName]" -Source $appDeployToolkitName Write-Log -Message "Current Culture is [$($culture.Name)], language is [$currentLanguage] and UI language is [$currentUILanguage]" -Source $appDeployToolkitName @@ -10606,6 +16049,9 @@ Write-Log -Message $scriptSeparator -Source $appDeployToolkitName ## Dot source ScriptBlock to get a list of all users logged on to the system (both local and RDP users), and discover session details for account executing script . $GetLoggedOnUserDetails +## Dot source ScriptBlock to create temporary directory of logged on user +. $GetLoggedOnUserTempPath + ## Dot source ScriptBlock to load localized UI messages from config XML . $xmlLoadLocalizedUIMessages @@ -10617,212 +16063,257 @@ Write-Log -Message $scriptSeparator -Source $appDeployToolkitName ## Set the install phase to asynchronous if the script was not dot sourced, i.e. called with parameters If ($AsyncToolkitLaunch) { - $installPhase = 'Asynchronous' + $installPhase = 'Asynchronous' } ## If the ShowInstallationPrompt Parameter is specified, only call that function. If ($showInstallationPrompt) { - Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowInstallationPrompt]." -Source $appDeployToolkitName - $appDeployMainScriptAsyncParameters.Remove('ShowInstallationPrompt') - $appDeployMainScriptAsyncParameters.Remove('AsyncToolkitLaunch') - $appDeployMainScriptAsyncParameters.Remove('ReferredInstallName') - $appDeployMainScriptAsyncParameters.Remove('ReferredInstallTitle') - $appDeployMainScriptAsyncParameters.Remove('ReferredLogName') - Show-InstallationPrompt @appDeployMainScriptAsyncParameters - Exit 0 + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowInstallationPrompt]." -Source $appDeployToolkitName + $appDeployMainScriptAsyncParameters.Remove('ShowInstallationPrompt') + $appDeployMainScriptAsyncParameters.Remove('AsyncToolkitLaunch') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallName') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallTitle') + $appDeployMainScriptAsyncParameters.Remove('ReferredLogName') + Show-InstallationPrompt @appDeployMainScriptAsyncParameters + Exit 0 } ## If the ShowInstallationRestartPrompt Parameter is specified, only call that function. If ($showInstallationRestartPrompt) { - Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowInstallationRestartPrompt]." -Source $appDeployToolkitName - $appDeployMainScriptAsyncParameters.Remove('ShowInstallationRestartPrompt') - $appDeployMainScriptAsyncParameters.Remove('AsyncToolkitLaunch') - $appDeployMainScriptAsyncParameters.Remove('ReferredInstallName') - $appDeployMainScriptAsyncParameters.Remove('ReferredInstallTitle') - $appDeployMainScriptAsyncParameters.Remove('ReferredLogName') - Show-InstallationRestartPrompt @appDeployMainScriptAsyncParameters - Exit 0 + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowInstallationRestartPrompt]." -Source $appDeployToolkitName + $appDeployMainScriptAsyncParameters.Remove('ShowInstallationRestartPrompt') + $appDeployMainScriptAsyncParameters.Remove('AsyncToolkitLaunch') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallName') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallTitle') + $appDeployMainScriptAsyncParameters.Remove('ReferredLogName') + Show-InstallationRestartPrompt @appDeployMainScriptAsyncParameters + Exit 0 } ## If the CleanupBlockedApps Parameter is specified, only call that function. If ($cleanupBlockedApps) { - $deployModeSilent = $true - Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-CleanupBlockedApps]." -Source $appDeployToolkitName - Unblock-AppExecution - Exit 0 + $deployModeSilent = $true + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-CleanupBlockedApps]." -Source $appDeployToolkitName + Unblock-AppExecution + Exit 0 } ## If the ShowBlockedAppDialog Parameter is specified, only call that function. If ($showBlockedAppDialog) { - Try { - . $DisableScriptLogging - Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowBlockedAppDialog]." -Source $appDeployToolkitName - # Create a mutex and specify a name without acquiring a lock on the mutex - [boolean]$showBlockedAppDialogMutexLocked = $false - [string]$showBlockedAppDialogMutexName = 'Global\PSADT_ShowBlockedAppDialog_Message' - [Threading.Mutex]$showBlockedAppDialogMutex = New-Object -TypeName 'System.Threading.Mutex' -ArgumentList ($false, $showBlockedAppDialogMutexName) - # Attempt to acquire an exclusive lock on the mutex, attempt will fail after 1 millisecond if unable to acquire exclusive lock - If ((Test-IsMutexAvailable -MutexName $showBlockedAppDialogMutexName -MutexWaitTimeInMilliseconds 1) -and ($showBlockedAppDialogMutex.WaitOne(1))) { - [boolean]$showBlockedAppDialogMutexLocked = $true - Show-InstallationPrompt -Title $installTitle -Message $configBlockExecutionMessage -Icon 'Warning' -ButtonRightText 'OK' - Exit 0 - } - Else { - # If attempt to acquire an exclusive lock on the mutex failed, then exit script as another blocked app dialog window is already open - Write-Log -Message "Unable to acquire an exclusive lock on mutex [$showBlockedAppDialogMutexName] because another blocked application dialog window is already open. Exiting script..." -Severity 2 -Source $appDeployToolkitName - Exit 0 - } - } - Catch { - Write-Log -Message "There was an error in displaying the Installation Prompt. `n$(Resolve-Error)" -Severity 3 -Source $appDeployToolkitName - Exit 60005 - } - Finally { - If ($showBlockedAppDialogMutexLocked) { $null = $showBlockedAppDialogMutex.ReleaseMutex() } - If ($showBlockedAppDialogMutex) { $showBlockedAppDialogMutex.Close() } - } + Try { + . $DisableScriptLogging + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowBlockedAppDialog]." -Source $appDeployToolkitName + # Create a mutex and specify a name without acquiring a lock on the mutex + [Boolean]$showBlockedAppDialogMutexLocked = $false + [String]$showBlockedAppDialogMutexName = 'Global\PSADT_ShowBlockedAppDialog_Message' + [Threading.Mutex]$showBlockedAppDialogMutex = New-Object -TypeName 'System.Threading.Mutex' -ArgumentList ($false, $showBlockedAppDialogMutexName) + # Attempt to acquire an exclusive lock on the mutex, attempt will fail after 1 millisecond if unable to acquire exclusive lock + If ((Test-IsMutexAvailable -MutexName $showBlockedAppDialogMutexName -MutexWaitTimeInMilliseconds 1) -and ($showBlockedAppDialogMutex.WaitOne(1))) { + [Boolean]$showBlockedAppDialogMutexLocked = $true + Show-InstallationPrompt -Title $installTitle -Message $configBlockExecutionMessage -Icon 'Warning' -ButtonRightText 'OK' + Exit 0 + } + Else { + # If attempt to acquire an exclusive lock on the mutex failed, then exit script as another blocked app dialog window is already open + Write-Log -Message "Unable to acquire an exclusive lock on mutex [$showBlockedAppDialogMutexName] because another blocked application dialog window is already open. Exiting script..." -Severity 2 -Source $appDeployToolkitName + Exit 0 + } + } + Catch { + Write-Log -Message "There was an error in displaying the Installation Prompt. `r`n$(Resolve-Error)" -Severity 3 -Source $appDeployToolkitName + Exit 60005 + } + Finally { + If ($showBlockedAppDialogMutexLocked) { + $null = $showBlockedAppDialogMutex.ReleaseMutex() + } + If ($showBlockedAppDialogMutex) { + $showBlockedAppDialogMutex.Close() + } + } } ## Log details for all currently logged in users -Write-Log -Message "Display session information for all logged on users: `n$($LoggedOnUserSessions | Format-List | Out-String)" -Source $appDeployToolkitName +Write-Log -Message "Display session information for all logged on users: `r`n$($LoggedOnUserSessions | Format-List | Out-String)" -Source $appDeployToolkitName If ($usersLoggedOn) { - Write-Log -Message "The following users are logged on to the system: [$($usersLoggedOn -join ', ')]." -Source $appDeployToolkitName - - # Check if the current process is running in the context of one of the logged in users - If ($CurrentLoggedOnUserSession) { - Write-Log -Message "Current process is running with user account [$ProcessNTAccount] under logged in user session for [$($CurrentLoggedOnUserSession.NTAccount)]." -Source $appDeployToolkitName - } - Else { - Write-Log -Message "Current process is running under a system account [$ProcessNTAccount]." -Source $appDeployToolkitName - } - - # Display account and session details for the account running as the console user (user with control of the physical monitor, keyboard, and mouse) - If ($CurrentConsoleUserSession) { - Write-Log -Message "The following user is the console user [$($CurrentConsoleUserSession.NTAccount)] (user with control of physical monitor, keyboard, and mouse)." -Source $appDeployToolkitName - } - Else { - Write-Log -Message 'There is no console user logged in (user with control of physical monitor, keyboard, and mouse).' -Source $appDeployToolkitName - } - - # Display the account that will be used to execute commands in the user session when toolkit is running under the SYSTEM account - If ($RunAsActiveUser) { - Write-Log -Message "The active logged on user is [$($RunAsActiveUser.NTAccount)]." -Source $appDeployToolkitName - } + Write-Log -Message "The following users are logged on to the system: [$($usersLoggedOn -join ', ')]." -Source $appDeployToolkitName + + # Check if the current process is running in the context of one of the logged in users + If ($CurrentLoggedOnUserSession) { + Write-Log -Message "Current process is running with user account [$ProcessNTAccount] under logged in user session for [$($CurrentLoggedOnUserSession.NTAccount)]." -Source $appDeployToolkitName + } + Else { + Write-Log -Message "Current process is running under a system account [$ProcessNTAccount]." -Source $appDeployToolkitName + } + + # Check if user session is running under defaultuser0 account (Autopilot OOBE) or if application is installing during ESP and if so change deployment to run silently + If ($RunAsActiveUser.NTAccount -like '*\defaultuser0' -and (((Get-Process -Name 'wwahost' -ErrorAction 'SilentlyContinue').count) -gt 0)) { + Write-Log -Message "Autopilot OOBE user [$($CurrentLoggedOnUserSession.UserName)] or ESP process 'wwahost' detected, changing deployment mode to silent." -Source $appDeployToolkitExtName + $deployMode = 'Silent' + } + + # Display account and session details for the account running as the console user (user with control of the physical monitor, keyboard, and mouse) + If ($CurrentConsoleUserSession) { + Write-Log -Message "The following user is the console user [$($CurrentConsoleUserSession.NTAccount)] (user with control of physical monitor, keyboard, and mouse)." -Source $appDeployToolkitName + } + Else { + Write-Log -Message 'There is no console user logged in (user with control of physical monitor, keyboard, and mouse).' -Source $appDeployToolkitName + } + + # Display the account that will be used to execute commands in the user session when toolkit is running under the SYSTEM account + If ($RunAsActiveUser) { + Write-Log -Message "The active logged on user is [$($RunAsActiveUser.NTAccount)]." -Source $appDeployToolkitName + } } Else { - Write-Log -Message 'No users are logged on to the system.' -Source $appDeployToolkitName + Write-Log -Message 'No users are logged on to the system.' -Source $appDeployToolkitName } ## Log which language's UI messages are loaded from the config XML file If ($HKUPrimaryLanguageShort) { - Write-Log -Message "The active logged on user [$($RunAsActiveUser.NTAccount)] has a primary UI language of [$HKUPrimaryLanguageShort]." -Source $appDeployToolkitName + Write-Log -Message "The active logged on user [$($RunAsActiveUser.NTAccount)] has a primary UI language of [$HKUPrimaryLanguageShort]." -Source $appDeployToolkitName } Else { - Write-Log -Message "The current system account [$ProcessNTAccount] has a primary UI language of [$currentLanguage]." -Source $appDeployToolkitName + Write-Log -Message "The current system account [$ProcessNTAccount] has a primary UI language of [$currentLanguage]." -Source $appDeployToolkitName +} +If ($configInstallationUILanguageOverride) { + Write-Log -Message "The config XML file was configured to override the detected primary UI language with the following UI language: [$configInstallationUILanguageOverride]." -Source $appDeployToolkitName } -If ($configInstallationUILanguageOverride) { Write-Log -Message "The config XML file was configured to override the detected primary UI language with the following UI language: [$configInstallationUILanguageOverride]." -Source $appDeployToolkitName } Write-Log -Message "The following UI messages were imported from the config XML file: [$xmlUIMessageLanguage]." -Source $appDeployToolkitName ## Log system DPI scale factor of active logged on user If ($UserDisplayScaleFactor) { - Write-Log -Message "The active logged on user [$($RunAsActiveUser.NTAccount)] has a DPI scale factor of [$dpiScale] with DPI pixels [$dpiPixels]." -Source $appDeployToolkitName + Write-Log -Message "The active logged on user [$($RunAsActiveUser.NTAccount)] has a DPI scale factor of [$dpiScale] with DPI pixels [$dpiPixels]." -Source $appDeployToolkitName } Else { - Write-Log -Message "The system has a DPI scale factor of [$dpiScale] with DPI pixels [$dpiPixels]." -Source $appDeployToolkitName + Write-Log -Message "The system has a DPI scale factor of [$dpiScale] with DPI pixels [$dpiPixels]." -Source $appDeployToolkitName } ## Check if script is running from a SCCM Task Sequence Try { - [__comobject]$SMSTSEnvironment = New-Object -ComObject 'Microsoft.SMS.TSEnvironment' -ErrorAction 'Stop' - Write-Log -Message 'Successfully loaded COM Object [Microsoft.SMS.TSEnvironment]. Therefore, script is currently running from a SCCM Task Sequence.' -Source $appDeployToolkitName - $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SMSTSEnvironment) - $runningTaskSequence = $true + [__ComObject]$SMSTSEnvironment = New-Object -ComObject 'Microsoft.SMS.TSEnvironment' -ErrorAction 'Stop' + Write-Log -Message 'Successfully loaded COM Object [Microsoft.SMS.TSEnvironment]. Therefore, script is currently running from a SCCM Task Sequence.' -Source $appDeployToolkitName + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SMSTSEnvironment) + $runningTaskSequence = $true } Catch { - Write-Log -Message 'Unable to load COM Object [Microsoft.SMS.TSEnvironment]. Therefore, script is not currently running from a SCCM Task Sequence.' -Source $appDeployToolkitName - $runningTaskSequence = $false + Write-Log -Message 'Unable to load COM Object [Microsoft.SMS.TSEnvironment]. Therefore, script is not currently running from a SCCM Task Sequence.' -Source $appDeployToolkitName + $runningTaskSequence = $false } - ## Check to see if the Task Scheduler service is in a healthy state by checking its services to see if they exist, are currently running, and have a start mode of 'Automatic'. ## The task scheduler service and the services it is dependent on can/should only be started/stopped/modified when running in the SYSTEM context. -[boolean]$IsTaskSchedulerHealthy = $true +[Boolean]$IsTaskSchedulerHealthy = $true If ($IsLocalSystemAccount) { - # Check the health of the 'COM+ Event System' service - [boolean]$IsTaskSchedulerHealthy = & $TestServiceHealth -ServiceName 'EventSystem' - # Check the health of the 'Remote Procedure Call (RPC)' service - [boolean]$IsTaskSchedulerHealthy = & $TestServiceHealth -ServiceName 'RpcSs' - # Check the health of the 'Windows Event Log' service - [boolean]$IsTaskSchedulerHealthy = & $TestServiceHealth -ServiceName 'EventLog' - # Check the health of the 'Task Scheduler' service - [boolean]$IsTaskSchedulerHealthy = & $TestServiceHealth -ServiceName 'Schedule' - - Write-Log -Message "The task scheduler service is in a healthy state: $IsTaskSchedulerHealthy." -Source $appDeployToolkitName + # Check the health of the 'Task Scheduler' service + Try { + If (Test-ServiceExists -Name 'Schedule' -ContinueOnError $false) { + If ((Get-ServiceStartMode -Name 'Schedule' -ContinueOnError $false) -ne 'Automatic') { + Set-ServiceStartMode -Name 'Schedule' -StartMode 'Automatic' -ContinueOnError $false + } + Start-ServiceAndDependencies -Name 'Schedule' -SkipServiceExistsTest -ContinueOnError $false + } + Else { + [Boolean]$IsTaskSchedulerHealthy = $false + } + } + Catch { + [Boolean]$IsTaskSchedulerHealthy = $false + } + # Log the health of the 'Task Scheduler' service + Write-Log -Message "The task scheduler service is in a healthy state: $IsTaskSchedulerHealthy." -Source $appDeployToolkitName } Else { - Write-Log -Message "Skipping attempt to check for and make the task scheduler services healthy because the App Deployment Toolkit is not running under the [$LocalSystemNTAccount] account." -Source $appDeployToolkitName + Write-Log -Message "Skipping attempt to check for and make the task scheduler services healthy, because the App Deployment Toolkit is not running under the [$LocalSystemNTAccount] account." -Source $appDeployToolkitName } ## If script is running in session zero If ($SessionZero) { - ## If the script was launched with deployment mode set to NonInteractive, then continue - If ($deployMode -eq 'NonInteractive') { - Write-Log -Message "Session 0 detected but deployment mode was manually set to [$deployMode]." -Source $appDeployToolkitName - } - Else { - ## If the process is not able to display a UI, enable NonInteractive mode - If (-not $IsProcessUserInteractive) { - $deployMode = 'NonInteractive' - Write-Log -Message "Session 0 detected, process not running in user interactive mode; deployment mode set to [$deployMode]." -Source $appDeployToolkitName - } - Else { - If (-not $usersLoggedOn) { - $deployMode = 'NonInteractive' - Write-Log -Message "Session 0 detected, process running in user interactive mode, no users logged in; deployment mode set to [$deployMode]." -Source $appDeployToolkitName - } - Else { - Write-Log -Message 'Session 0 detected, process running in user interactive mode, user(s) logged in.' -Source $appDeployToolkitName - } - } - } + ## If the script was launched with deployment mode set to NonInteractive, then continue + If ($deployMode -eq 'NonInteractive') { + Write-Log -Message "Session 0 detected but deployment mode was manually set to [$deployMode]." -Source $appDeployToolkitName + } + Else { + ## If the process is not able to display a UI, enable NonInteractive mode + If (-not $IsProcessUserInteractive) { + $deployMode = 'NonInteractive' + Write-Log -Message "Session 0 detected, process not running in user interactive mode; deployment mode set to [$deployMode]." -Source $appDeployToolkitName + } + Else { + If (-not $usersLoggedOn) { + $deployMode = 'NonInteractive' + Write-Log -Message "Session 0 detected, process running in user interactive mode, no users logged in; deployment mode set to [$deployMode]." -Source $appDeployToolkitName + } + Else { + Write-Log -Message 'Session 0 detected, process running in user interactive mode, user(s) logged in.' -Source $appDeployToolkitName + } + } + } } Else { - Write-Log -Message 'Session 0 not detected.' -Source $appDeployToolkitName + Write-Log -Message 'Session 0 not detected.' -Source $appDeployToolkitName } ## Set Deploy Mode switches If ($deployMode) { - Write-Log -Message "Installation is running in [$deployMode] mode." -Source $appDeployToolkitName + Write-Log -Message "Installation is running in [$deployMode] mode." -Source $appDeployToolkitName } Switch ($deployMode) { - 'Silent' { $deployModeSilent = $true } - 'NonInteractive' { $deployModeNonInteractive = $true; $deployModeSilent = $true } - Default { $deployModeNonInteractive = $false; $deployModeSilent = $false } + 'Silent' { + $deployModeSilent = $true + } + 'NonInteractive' { + $deployModeNonInteractive = $true; $deployModeSilent = $true + } + Default { + $deployModeNonInteractive = $false; $deployModeSilent = $false + } } ## Check deployment type (install/uninstall) Switch ($deploymentType) { - 'Install' { $deploymentTypeName = $configDeploymentTypeInstall } - 'Uninstall' { $deploymentTypeName = $configDeploymentTypeUnInstall } - Default { $deploymentTypeName = $configDeploymentTypeInstall } + 'Install' { + $deploymentTypeName = $configDeploymentTypeInstall + } + 'Uninstall' { + $deploymentTypeName = $configDeploymentTypeUnInstall + } + 'Repair' { + $deploymentTypeName = $configDeploymentTypeRepair + } + Default { + $deploymentTypeName = $configDeploymentTypeInstall + } +} +If ($deploymentTypeName) { + Write-Log -Message "Deployment type is [$deploymentTypeName]." -Source $appDeployToolkitName } -If ($deploymentTypeName) { Write-Log -Message "Deployment type is [$deploymentTypeName]." -Source $appDeployToolkitName } -If ($useDefaultMsi) { Write-Log -Message "Discovered Zero-Config MSI installation file [$defaultMsiFile]." -Source $appDeployToolkitName } +If ($useDefaultMsi) { + Write-Log -Message "Discovered Zero-Config MSI installation file [$defaultMsiFile]." -Source $appDeployToolkitName +} ## Check current permissions and exit if not running with Administrator rights If ($configToolkitRequireAdmin) { - # Check if the current process is running with elevated administrator permissions - If ((-not $IsAdmin) -and (-not $ShowBlockedAppDialog)) { - [string]$AdminPermissionErr = "[$appDeployToolkitName] has an XML config file option [Toolkit_RequireAdmin] set to [True] so as to require Administrator rights for the toolkit to function. Please re-run the deployment script as an Administrator or change the option in the XML config file to not require Administrator rights." - Write-Log -Message $AdminPermissionErr -Severity 3 -Source $appDeployToolkitName - Show-DialogBox -Text $AdminPermissionErr -Icon 'Stop' - Throw $AdminPermissionErr - } + # Check if the current process is running with elevated administrator permissions + If ((-not $IsAdmin) -and (-not $ShowBlockedAppDialog)) { + [String]$AdminPermissionErr = "[$appDeployToolkitName] has an XML config file option [Toolkit_RequireAdmin] set to [True] so as to require Administrator rights for the toolkit to function. Please re-run the deployment script as an Administrator or change the option in the XML config file to not require Administrator rights." + Write-Log -Message $AdminPermissionErr -Severity 3 -Source $appDeployToolkitName + Show-DialogBox -Text $AdminPermissionErr -Icon 'Stop' + Throw $AdminPermissionErr + } } ## If terminal server mode was specified, change the installation mode to support it -If ($terminalServerMode) { Enable-TerminalServerInstallMode } +If ($terminalServerMode) { + Enable-TerminalServerInstallMode +} + +## If not in install phase Asynchronous, change the install phase so we dont have Initialization phase when we are done initializing +## This should get overwritten shortly, unless this is not dot sourced by Deploy-Application.ps1 +If (-not $AsyncToolkitLaunch) { + $installPhase = 'Execution' +} #endregion ##*============================================= diff --git a/Templates/Framework/Source/Deploy-Application.exe b/Templates/Framework/Source/Deploy-Application.exe index 4000f07259f01367066750334044a2c006ea2dc0..04c5570784d401352a24dd9c08872336d5f8b982 100644 GIT binary patch literal 274944 zcmeFZcUV(P_b9v*LI~9msz?b)69JJTy>~@=uTnyXKoYuOC<-W6q$r|*3JQuSDk`EN zSP%gf5fxNW(PKjt6)fmoJArfbob%rI_uc1y&-4B9ZOockW!9`&vu4fSv-dfxeYYVT z2!i0?_wy%$oPiR(%vkV$517CfkU1xSoaFA6J%e%Rm35DdqLUM7)CgK|962;NKAy@T zhfv70qz92CLL* zbQ5 zN?^Avf?xoLA3gzPpveF5S_FM2aI%^RlA~WC2#+!e096P8FBc6oB`6C+osWyQY`)IV zO>>#A3*l(_Xk7$kXeEDAIcZZ+7s4xx0-Y`fK!{6Jh#)G&Eh@xAOT^5#*atPLIIvYY z#DsVRxw5z*G!)dt6tnP9`GFUNA<-8CUxA5os9?`hAud5KQR*Tff;`OGukv6!o(}U4 z@+gNYg{syS6C%(KLQkSHX38*UcxcD{dpj8Jd^?mwm46O_a5 zikB9MMH1*_XqXO7czc*0(-^;!B1KIzpI6rm{*H(sPfQ)FbbkHO<>k2h$%xV;Hgm%pDP#AnpkuRLXE;A8i5Oyk(}d6&6UzLK9sJk z1})ja!mSKRf=A6>>c1&J%Tg#Yr)be!DfthDf;hIl|6QX90X6ZzYotR0;8767Q6baw zP?rOsWkXY{CW>kSP}T+@#4X6J%1@gG&YzROBS;8R75ybq*m8qg(X=AONjnI2K~9#F z=Nr(vQ5ya?8eIp(6$Ck{D_A9-s>{Ze^`NBcqlg&QfL$0uA;c@lt!#wyj8R|$K=KDp z^amzLl~0hD_62&NngWp=gC;$?82}+ZL10nMp(@Bnh1AQV2&E+(wSt1@5r^UriANx& z$^{&2AdS#Cd5{DWqHF`mZwBL)ZGrS?Ar&$*kC+URm3fpoAfVX{M8(_z)(%`)P6T#P z1d)dl_y{-#gPo&8q#{dz4oTp*%M)nm4;C6rUPuFvfD_PdL=dZNj~cTQ0Cg1r9u8G` zJRR0M9;*yp^04Avc{M7d06-Kcs_Y1*qKZTo-B4~VJpanPFQ5fw35?}&xlN(;=~MvD4ASyNp@T}MM#6T%LG zeK!{1N7#}UXThcqTg^?_HWs@vXi@PIbW}ovgdpuaK=W`zCSgMYqmjk79`+DM2m-qj z0miu4B9- zGWIYbsz$4KJDsKpo2WjDu2bn&w1dj-FT>?0c--G8t(m3`3_a_VbaO8s}oS+Af zY~Yl_;1MBiw5|qy;gNNmXuTAR(ob?rVMvG!_jOJZ@{xc-4E8#3twEj#>A<4B46@{X zK^qUUlzSg=9a;8NU{O0WSazm>odU=U0t#bUuovjyB@VPNPmqN1avujf!@xGw!@?{F zqmjeJ5RoMOd4e(2Q6drP<`M=By=y~&r%4bdWWpTr0ELJcK`a>qhacgPB_jIJz!+v@ z0V0T`V6riS$Sck~fc6{(02?qx7z|R0*@jtxd_{^eqM*MFpct|bpgRjDvtSVm*0A6i z7VKleXDs*wpfee@x)i3q7Ica$vM~{CJzxQBjBpKe0`9cK=CBcrC}6QHELS`fJjsbL zSXeQE$aNaSiB!#D%Q;#BtDD1&Iobg`HizxUK7sLFW?`j-VZs%dwHqvK14}0!xx>P? zi$`(Q0`JwIydJ>5u(0RctFTKjTnGkDk_cOpYtAyZ7A}OJ#mfaR-vmjKIgE@%z}@~l z762GGA~(ld2N(~sYz`{{jQ3Bh0WdzqXpYwb7(Ze^hYbNH@F(^bumyi&T$l)$VcXt6S4v~63T^vs6pptAwV8v2|yyU zoCWn+(3}PBSGhswc8wHb6Ym4NwBP#j3vtNJcQ21$ZNXW!x4BH%6Yr z1`)()V;uk*5?sJTpWSg;!?I^4Ga=5P-JMHWBIqT3)#FnbAYV1qcv z6Bgw;vYbWH$DpIo$9Ti4)5rWIyg}?Slb81@>_Xn-`7pZ>Q*IK#e#jNO zkXFnsBoULyfk)CXbWRJhgQ6k?q4Pmt}H zNNzPu8cXwWOeEG6a~!jg+YWOdD2@Qva(ZIEu(;irXz-RSW*qd(VlHrpLwzS_1k^VH zB*7X@f_n;XBppM5m|csJMd*;T)FHMfG3tmA@&(``L>#M*EJkDjE=BYKY9ajq4Us{B zmMr=z7U47}(RWkP|uK4-ad46f+2!P?+mJKo^cj0PC<%0X`!g}TfC;%h(gq?dUf@7jkd(L1{C)33@uG$P9;?SQmKhpQsa{;GzNvX z=1&Q&UnKxxcdGp>6%aO6=T|BqZ0d?%serJly1!BZVN>;fr2=B2KhJ^6UzVZ>H7qHX zVuHA((HWFDb$cfyjvh*-#YTl7bP6NLlR^uDrlIqEOKNN^C6p0Gji;;IQsODJs8Ga# z8XSh$)18AEk*-uKgAxY9@u874YJ5~WAVzT56-uGgty7~ImTDQs%U|JL! z5iAqzg5$%W>Y5bKh>D}QrzKG4D9{GQY-rTDISQ*o2stkpDK%w|7|CvL69q~jVCd92 zz2*rCLGDouz|aX`H*sU60q)FpXy{F5R`@vfHg`>n1&=8+m`t{jY6j;(LyQnI9MEut`3L_ zHwuG+-j7=Z(obZbGQrqEIExiMfN!I0w;z*rh9ihvMi&VXC_kR)K) zCPn>sWIKx0!j%#m zoXV=v|EYU!w*Senq$Z@%q9P(0|Hg_-2#!zti!m3?XrIteNK|YT;}?iG_?1M@^=f$HvYlRkS*ntYAGOP6=pmK*+Iah&wGR4w(b0C4tpqtMon;|(2}EIi}*WxzW0Cd z=ZvN!&Ti;@vSQC2W;rH`p$@|Y6B$tyy88U!=y3AS&RBGq4@mV95HDzW{TBtud^SVF z7mSI6jE!bVa~d2t%#Dui7`nO*l@>=wW0V20MgL`b*z-bXsbELj+(fXZ2UNjrMm&QK zQw#SM^!a#apsFCHB2FREkhK40pomv+6a#uiw?)>3%*6p@-QZYi1dJUrH@f9n$5PN9 z*fP{mR(JEXU-mXs)M}2+O3tiB$ZBOtg*}eFROeSAi*6qenb{qENn;Og(9&f40&$C^ zrm!}3`}iMyQ%&q``@VIn+@Mo~DpsgaIWLiH8?K32?W&9Kp!4`M)hyhs! zg6RA=2}_p7aFC7wy{SkXv_<&60FOtk0MZa7zzuAngEk6qwGd6jA7S&uplu3poLMCW zWZjTRkcx#reL@bssL(PF#u{`yaMXe43J!^fKXfW007pwQXre+N zp>x_&5j|uDQ2))vWY9}x4OAWUsUw)|Bqiv=1{9$_`+wJXXI3BRoT0-^nk(mrjoN`m z-d{uiPu8G=X2)JI%Y7lB4_yoM8qspzLBDGMZ=*zYpzfrBJ_cx`v9Ng!s77>ZXe@px zNRUA;6?#HzCB#=WDW}AKWhV_p!ps2ZtQQ(fXku%(D4xgNEMxYWqJkhn$clZ9MQ2IYL8ci1SA@*;p{ht<)5jh0ID+jjC8M_!wNS0vlUja`>6v6ro_@Si| zgarB{BZ!(I;Al!@2b(Yr{d^%a;9p8$kmdO}%lfaz38mRil>&$Oj`KbEy@LAaiuedq7PMAvsB zNTNF#I|0vkgboO88w|WyfWHp{%{gddM;$lsviV%Z?&;V481eg`IYMb}NB`C7zq=X@ zUNptWvZferJP}OH|1I5U;KZ|5@n3sAyFd22hQ2bE{Z|WvSb;pRXBq5{zus{K!5)fE zDEm%@4jbj)`L4gsh&hZC4XbzrvHz=%h8qLCkNOzR!f2jG?@%HEXU`ito9yiU>+G_Z z+x#7i7uezj+oSgX-8+`W|DNyBWQ#@$D}a~%XPMt`7U*nwUK+$Gx|HCxpV(iEe}1X6 zbUHc1lKF4(o!#MTuAGlV7&^qv6WV&B*x z{D0jiz-}e@_vD4)p5GM^-uW8rXvl#tXX~CTFSOdYMDJ@&(WXxbj*P(&Agf_Gp&}@V zq5>$ua+0wa0Ra{@Nra1^Ai%mrNY)quEEY?$C#{CVPZBd5+6us_Cvb5HG=P_pQUaVT zF&piFCwG=frv5NU*i2ZJ^Y#t3kOG+GftphjTV zuy_H`Cj`I)PsWg# z2L+(O2r`ed#&Dd)IfaguWDg3kFcNSI7e*YdphF_92C}#yd{V^hCHV*l2r_R8dI&NH z2?!{=FUWkz(lEw_`i#UJ!=vVr5?S1F5_25<0|Y`#y1(Z_?a@L|h`@<4&I}4Hp1^@8 z#la6=9FT}uyf_r%Tyws{LkSLnF<`h54)DC72h`D*%A`0HB*Mrrq(rnzL}yJL0Qi6a zA_P*9nMfw=opa0qE;ee7=*-r z*d_mZpnx!U!b__y4#7!q>Pm)V7dV$ekG{wZDw&R+uaJYu&eRkNjdgB=HYKyQppS** zx##9N(r+g?3H0S;_JI^R1rBSdNq^G>=OgH;B{0!rP56ot9@xmq?4vZe|HsVR{LiO! z1Tn=R27ew*kuM!4Yiej}kpC&EPBwRNAiLVz+PS-tU9H`$T|KR>V8dI2LF6?wSLo_$ ztLe!RP>gz1m*QV&}Xa&P(92kUaxjO3)-p`{(nPU*GxySdv zjtEdc(AD9PiVEk&Y3TW9*gVrBDJnLMLL)3+0Usp5AAAacK~}Af3Z+r$)NqD6oF2l1 zsT(6HEQ+emK4t_>b0?v2rWX|f&&huh*ay<+G2z_NCzYjHo2?nl`wYLn>+de0rf!E{ z>_2RsH_Vk140frK=a1}F$#W-B#^|RL@TW?iI}b9BrzA0G!Lh1j=cEugtX)M(bEn2o z;*CReb%S+6byh6b*V3kF=;<&1XJ_mK?)g4pTxc}1CKpO)b1U>;#%V@6V8{UcNdJ;5 zfsB#;uR(}vU|;j!x}sf4LSIGjc}>w$1aWnnc zc@LoPJ`qG2Zn*`Z^oGoferHqwB^1A0+^i+S1UWQ@%b`TuH9-kG1ab{Z*zb^0DABjB zGf=`SO9VbwV4|CXGL-N!0%GGJSh)bAIYo(kVg{eH3O z?y|pA=NEhe>szc}d2D(ApkHZdolW0U`R{ajPd5KAF5v6n`{n;I-UHuI@BMnAdnSTZ z{Rery?;OarU<8>&oj-RKIy>6(^GKkc;J3H4g0JY{0}=Sa2LlKqGxZb15e(hc)&gnl zlY9xc1NHV+=I(k<2L}S|ie1FHCV#e`-TJ(1^`5@#*VmA?-|uo(-q?8Fu4sqC_JYjR z;Ov0uj%y}638alH*E=k6E3=QjRTDP2?Y?#6m$-o&IuD&++{wI{@wl?w{ZJIHvUSR+ z|BF;=A6@zTi<;6sb=YiXN67Ia72%Cf$IjfnBAoih)3%Y;({pOV2SUZWyP))nOY?=)|v0$Ui&U0O3FH8Dd~vk<^5e& znH|f*77_&>s6O5Np=)*8ySLhWj?&?|!ndEl9;ts;jE(m%;97~L?>k|lZ(SzS_>+Uc zb#Yhz#L8zC{pTx%b6yWTSyRL_6}TklhGgOPGfO%)*ol9-ZW#6Lqe27Lb9ltqKI~BW z>61Ct8RYHS`%}tum|Ck(D|}IoKQAuPyXD;Zn#N0}%$Gi1Zb#hL?)*`YS@(mJ81g>d z`!rcz=lkqob=j`%k#{FzJw#UVFuiztkg}`a98`T%aBenh8q3-Z?K5A!!M*;VVgJ%T zRQTuSC%N`_OZ|3a@g4g7V*(><)urKJX=P>QcvFXCZv=L-uYL0TUgyu49lJ<9yBOWy zH}d?DepfJnGoqBWzBT-K>J-1`D zx38~{+v&{vuO*jC_h$VVtgU@@F{@U@emOFI@y7=lnV$;entK)>A%x-61xKq!i#0jd z!Vtt4O)_)Wzr;WKDWf!qfd{#OOwv|`9*H=+x`=8Hg4Fk zftUXL#_?INpFw8I!s$VW-Qz!fn^j)Aw8F#R-(Rc9dFAF-skQp!ST8Y?FjYAwW7&)p z(my40ZTv&;PFJGE&Bu@PIWB(R)^l+6Md9u~Lm7v=wTfMs4~@K6y^M>$7-90fukkZo zC6qQkQQYNlI(=p@Z~kFQ_I@|f1YWd8pRcU78KzwV4Cvq&3J!LJ%f4Cx$=*b5-P4M zU2khu8D~xI=cov}FDx{pM843{(()iobDYysHuccPuhv8-yBx2LT#NWZzTGO03?A1u z-@jPJK6ja-hh*S)i?(C6;T@;%H$RR%w@Bh;`IWQ&jrDi#-0_*k2s9qr@j1ceNjPV! z!a{lVf}jS+r$_pUk91nz-tI|jpfM3WlSSi(yi>eojYc#>%@8R*F1^aW#V=pJ?EjQH z`$v)d6W@XwC1MBj0CR_{x1`~@GUHFR*^$;8_%*d%#AHXD1+J$o>sh9{_JydXibm1B zw_Yl0rS?;e=hAPf%a6$|&DT|xE4#lb;*`Q4ix`$=VRd}PX7Yuur?QpIg9MUge9JE~ zUe@VuTb@0}Z0zfkihA0+>W#Fidj6?`1wmcf*2{P7QY;9QJ7?Ujp?E4cIIO_NT<57= z*W0y4J*jfj9Zl1Q5f1Gy89(+O&=Q$RUnaY^t)M^yDG3pCbw9OcefJ@Kh0c>pq%{7Z zZ0k}UELXUFYq?f=rA(Pplak*R+}Ceh0*m;*o;4ma+%9Rrqu{kkLuP@ael|~HnSI+) zPN9ziyY;PYlsCI>R$sYi!gjrvskYeQpp+^XQ9?vqQqrh#;AJ@fC;ch`Z8?)W0(t)M z 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

    uKublUQ}wXsZiA;xfP-0AMSDJc6s?uSoc51 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

    JJ-YW^T@vJ9OyK)6;X@xN$x3 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�%)&pR56z{$H>E3IF(i9cVzJL_jwJ{-p;f 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 CD|NR3 diff --git a/Templates/Framework/Source/Deploy-Application.exe.config b/Templates/Framework/Source/Deploy-Application.exe.config index 99844ed..60c786a 100644 --- a/Templates/Framework/Source/Deploy-Application.exe.config +++ b/Templates/Framework/Source/Deploy-Application.exe.config @@ -1,7 +1,7 @@ - + - - - - - \ No newline at end of file + + + + + diff --git a/Templates/Framework/Source/Deploy-Application.ps1 b/Templates/Framework/Source/Deploy-Application.ps1 index b6d89fd..b161456 100644 --- a/Templates/Framework/Source/Deploy-Application.ps1 +++ b/Templates/Framework/Source/Deploy-Application.ps1 @@ -1,246 +1,313 @@ <# .SYNOPSIS - This script performs the installation or uninstallation of an application(s). - # LICENSE # - PowerShell App Deployment Toolkit - Provides a set of functions to perform common application deployment tasks on Windows. - Copyright (C) 2017 - Sean Lillis, Dan Cunningham, Muhammad Mashwani, Aman Motazedian. - This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +PSApppDeployToolkit - This script performs the installation or uninstallation of an application(s). + .DESCRIPTION - The script is provided as a template to perform an install or uninstall of an application(s). - The script either performs an "Install" deployment type or an "Uninstall" deployment type. - The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. - The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +- The script is provided as a template to perform an install or uninstall of an application(s). +- The script either performs an "Install" deployment type or an "Uninstall" deployment type. +- The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + +The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + .PARAMETER DeploymentType - The type of deployment to perform. Default is: Install. + +The type of deployment to perform. Default is: Install. + .PARAMETER DeployMode - Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. + +Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. + .PARAMETER AllowRebootPassThru - Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. + +Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. + .PARAMETER TerminalServerMode - Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers. + +Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Desktop Session Hosts/Citrix servers. + .PARAMETER DisableLogging - Disables logging to file for the script. Default is: $false. + +Disables logging to file for the script. Default is: $false. + .EXAMPLE - powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" + .EXAMPLE - powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" + .EXAMPLE - powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" + .EXAMPLE - Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" + +Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + .NOTES - Toolkit Exit Code Ranges: - 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 - 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 - 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 -.LINK - http://psappdeploytoolkit.com + +Toolkit Exit Code Ranges: +- 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 +- 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 +- 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 + +.LINK + +https://psappdeploytoolkit.com #> + + [CmdletBinding()] Param ( - [Parameter(Mandatory=$false)] - [ValidateSet('Install','Uninstall')] - [string]$DeploymentType = 'Install', - [Parameter(Mandatory=$false)] - [ValidateSet('Interactive','Silent','NonInteractive')] - [string]$DeployMode = 'Interactive', - [Parameter(Mandatory=$false)] - [switch]$AllowRebootPassThru = $false, - [Parameter(Mandatory=$false)] - [switch]$TerminalServerMode = $false, - [Parameter(Mandatory=$false)] - [switch]$DisableLogging = $false + [Parameter(Mandatory = $false)] + [ValidateSet('Install', 'Uninstall', 'Repair')] + [String]$DeploymentType = 'Install', + [Parameter(Mandatory = $false)] + [ValidateSet('Interactive', 'Silent', 'NonInteractive')] + [String]$DeployMode = 'Interactive', + [Parameter(Mandatory = $false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory = $false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory = $false)] + [switch]$DisableLogging = $false ) Try { - ## Set the script execution policy for this process - Try { Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' } Catch {} - - ##*=============================================== - ##* VARIABLE DECLARATION - ##*=============================================== - ## Variables: Main Application - [string]$appVendor = 'VENDOR_NAME' # Intune application: 'Name' part 1 and 'Publisher' - [string]$appName = 'APP_NAME' # Intune application: 'Name' part 2 - [string]$appVersion = 'VERSION' # Intune application: 'Name' part 3 - [string]$appArch = '' # (x86/x64); not used in Intune Win32 app information properties - [string]$appLang = 'EN' # Intune application: 'Name' part 4 - ## Variables: Additional applications - ## - Not required - ## Variables: Application package details - [string]$appRevision = '1.0' # Application revision - [string]$appScriptVersion = '1.0.0' # Deploy-Application.ps1 script version - [string]$appScriptDate = '06/29/2020' # (format MM/dd/yyyy) - [string]$appScriptAuthor = 'USER_NAME@ericsson.com' # Application packager - ##*=============================================== - ## Variables: Install Titles (Only set here to override defaults set by the toolkit) - [string]$installName = '' - [string]$installTitle = '' - - ##* Do not modify section below - #region DoNotModify - - ## Variables: Exit Code - [int32]$mainExitCode = 0 - - ## Variables: Script - [string]$deployAppScriptFriendlyName = 'Deploy Application' - [version]$deployAppScriptVersion = [version]'3.7.0' - [string]$deployAppScriptDate = '02/13/2018' - [hashtable]$deployAppScriptParameters = $psBoundParameters - - ## Variables: Environment - If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation } - [string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent - - ## Dot source the required App Deploy Toolkit Functions - Try { - [string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" - If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." } - If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain } - } - Catch { - If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 } - Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' - ## Exit the script, returning the exit code to SCCM - If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode } - } - - #endregion - ##* Do not modify section above - ##*=============================================== - ##* END VARIABLE DECLARATION - ##*=============================================== - - If ($deploymentType -ine 'Uninstall') { - ##*=============================================== - ##* PRE-INSTALLATION - ##*=============================================== - [string]$installPhase = 'Pre-Installation' - - ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt - #Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt - - ## Show Progress Message (with the default message) - #Show-InstallationProgress - - ## - - ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string - #Remove-MSIApplications -Name "" - - ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x - #Remove-MSIApplicationsEx -Name "" - - ##*=============================================== - ##* INSTALLATION - ##*=============================================== - [string]$installPhase = 'Installation' - - ## Handle Zero-Config MSI Installations - If ($useDefaultMsi) { - [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } - Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } } - } - - ## ******************************************* - - ## SAMPLE: EXE - #$exeInstall = "setup.exe" - #$exeInstallParams = "" - #Execute-Process -Path "$($dirFiles)\$($exeInstall)" -Parameters "$($exeInstallParams)" - - ## SAMPLE: PowerShell Script - #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -File ""$($dirFiles)\ScriptName.ps1""" - - ## SAMPLE: PowerShell Script + parameter input - #Execute-Process -Path "powershell.exe" -Parameters "-ExecutionPolicy Bypass -Command ""& '$($dirFiles)\ScriptName.ps1' -Parameter Input""" - - ## SAMPLE: MSI - #$msiInstall = "setup.msi" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" - - ## SAMPLE: MSI + Params - #$msiInstall = "setup.msi" - #$msiInstallParams = "" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams - - ## SAMPLE: MSI + MST - #$msiInstall = "setup.msi" - #$mstInstall = "setup.mst" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" - - ## SAMPLE: MSI + MST + Params - #$msiInstall = "setup.msi" - #$mstInstall = "setup.mst" - #$msiInstallParams = "" - #Execute-MSI -Action "Install" -Path "$($dirFiles)\$($msiInstall)" -Transform "$($dirFiles)\$($mstInstall)" -Parameters "/qn REBOOT=ReallySuppress" -AddParameter $msiInstallParams - - ##*=============================================== - ##* POST-INSTALLATION - ##*=============================================== - [string]$installPhase = 'Post-Installation' - - ## - - ## Display a message at the end of the install - #If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait } - } - ElseIf ($deploymentType -ieq 'Uninstall') - { - ##*=============================================== - ##* PRE-UNINSTALLATION - ##*=============================================== - [string]$installPhase = 'Pre-Uninstallation' - - ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing - #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 - - ## Show Progress Message (with the default message) - #Show-InstallationProgress - - ## - - ##*=============================================== - ##* UNINSTALLATION - ##*=============================================== - [string]$installPhase = 'Uninstallation' - - ## Handle Zero-Config MSI Uninstallations - If ($useDefaultMsi) { - [hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) } - Execute-MSI @ExecuteDefaultMSISplat - } - - # ******************************************* - - ## SAMPLE: Uninstall any previous versions of application by calling the command from Uninstall-string - #Remove-MSIApplications -Name "" - - ## SAMPLE: Uninstall any previous versions of application by referencing the product code and call msiexec /x - #Execute-MSI -Action "Uninstall" -Path "" - - ##*=============================================== - ##* POST-UNINSTALLATION - ##*=============================================== - [string]$installPhase = 'Post-Uninstallation' - - ## - - } - - ##*=============================================== - ##* END SCRIPT BODY - ##*=============================================== - - ## Call the Exit-Script function to perform final cleanup operations - Exit-Script -ExitCode $mainExitCode + ## Set the script execution policy for this process + Try { + Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' + } + Catch { + } + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Application + [String]$appVendor = '' + [String]$appName = '' + [String]$appVersion = '' + [String]$appArch = '' + [String]$appLang = 'EN' + [String]$appRevision = '01' + [String]$appScriptVersion = '1.0.0' + [String]$appScriptDate = 'XX/XX/20XX' + [String]$appScriptAuthor = '' + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [String]$installName = '' + [String]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [Int32]$mainExitCode = 0 + + ## Variables: Script + [String]$deployAppScriptFriendlyName = 'Deploy Application' + [Version]$deployAppScriptVersion = [Version]'3.9.3' + [String]$deployAppScriptDate = '02/05/2023' + [Hashtable]$deployAppScriptParameters = $PsBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $InvocationInfo = $HostInvocation + } + Else { + $InvocationInfo = $MyInvocation + } + [String]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [String]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { + Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." + } + If ($DisableLogging) { + . $moduleAppDeployToolkitMain -DisableLogging + } + Else { + . $moduleAppDeployToolkitMain + } + } + Catch { + If ($mainExitCode -eq 0) { + [Int32]$mainExitCode = 60008 + } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $script:ExitCode = $mainExitCode; Exit + } + Else { + Exit $mainExitCode + } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall' -and $deploymentType -ine 'Repair') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [String]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { + $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } + } + } + + ## + + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + If (-not $useDefaultMsi) { + Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait + } + } + ElseIf ($deploymentType -ieq 'Uninstall') { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + + ## + + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Uninstallation' + + ## + + + } + ElseIf ($deploymentType -ieq 'Repair') { + ##*=============================================== + ##* PRE-REPAIR + ##*=============================================== + [String]$installPhase = 'Pre-Repair' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + ##*=============================================== + ##* REPAIR + ##*=============================================== + [String]$installPhase = 'Repair' + + ## Handle Zero-Config MSI Repairs + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Repair'; Path = $defaultMsiFile; }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + ## + + ##*=============================================== + ##* POST-REPAIR + ##*=============================================== + [String]$installPhase = 'Post-Repair' + + ## + + + } + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode } Catch { - [int32]$mainExitCode = 60001 - [string]$mainErrorMessage = "$(Resolve-Error)" - Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName - Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' - Exit-Script -ExitCode $mainExitCode -} \ No newline at end of file + [Int32]$mainExitCode = 60001 + [String]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +} diff --git a/appList.json b/appList.json index 56177a7..e6a2f94 100644 --- a/appList.json +++ b/appList.json @@ -34,17 +34,17 @@ "AppSource": "Winget", "AppID": "JAMSoftware.TreeSize.Free", "AppFolderName": "TreeSize Free", - "AppSetupFileName": "TreeSizeSetup.exe" + "AppSetupFileName": "TreeSizeFreeSetup.exe" }, { "IntuneAppName": "Steam", "AppPublisher": "Valve", - "AppSource": "Storage Account", - "AppID": "", + "AppSource": "Winget", + "AppID": "Valve.Steam", "AppFolderName": "Steam", - "AppSetupFileName": "SteamSetup.exe", - "StorageAccountName": "iafstorage", - "StorageAccountContainerName": "Steam" - } + "AppSetupFileName": "SteamSetup.exe" + }, + + ] } \ No newline at end of file diff --git a/containerexample.png b/containerexample.png new file mode 100644 index 0000000000000000000000000000000000000000..219d56c87ba2b5fbeb6188c137eacbff493a2d0e GIT binary patch literal 65051 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%0DpuZo!% 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%0DvEb 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 literal 314880 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