├── LICENSE ├── Office-Update.ps1 └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright (c) 2024 Mike Galvin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Office-Update.ps1: -------------------------------------------------------------------------------- 1 | <#PSScriptInfo 2 | 3 | .VERSION 23.04.28 4 | 5 | .GUID 72cb5483-744e-4a7d-bcad-e04462ea2c2e 6 | 7 | .AUTHOR Mike Galvin Contact: digressive@outlook.com 8 | 9 | .COMPANYNAME Mike Galvin 10 | 11 | .COPYRIGHT (C) Mike Galvin. All rights reserved. 12 | 13 | .TAGS Office 2022 2019 365 Click-to-run C2R updates 14 | 15 | .LICENSEURI https://github.com/Digressive/Office-Update?tab=MIT-1-ov-file 16 | 17 | .PROJECTURI https://gal.vin/utils/office-update-utility/ 18 | 19 | .ICONURI 20 | 21 | .EXTERNALMODULEDEPENDENCIES 22 | 23 | .REQUIREDSCRIPTS 24 | 25 | .EXTERNALSCRIPTDEPENDENCIES 26 | 27 | .RELEASENOTES 28 | 29 | #> 30 | 31 | <# 32 | .SYNOPSIS 33 | Office Update Utility - Microsoft Office Update Manager 34 | 35 | .DESCRIPTION 36 | Checks for updates of Microsoft Office and removes old versions. 37 | Run with -help or no arguments for usage. 38 | #> 39 | 40 | ## Set up command line switches. 41 | [CmdletBinding()] 42 | Param( 43 | [alias("Office")] 44 | $OfficeSrc, 45 | [alias("Config")] 46 | $Cfg, 47 | [alias("L")] 48 | $LogPathUsr, 49 | [alias("LogRotate")] 50 | $LogHistory, 51 | [alias("Subject")] 52 | $MailSubject, 53 | [alias("SendTo")] 54 | $MailTo, 55 | [alias("From")] 56 | $MailFrom, 57 | [alias("Smtp")] 58 | $SmtpServer, 59 | [alias("Port")] 60 | $SmtpPort, 61 | [alias("User")] 62 | $SmtpUser, 63 | [alias("Pwd")] 64 | [ValidateScript({Test-Path -Path $_ -PathType Leaf})] 65 | $SmtpPwd, 66 | [Alias("Webhook")] 67 | [ValidateScript({Test-Path -Path $_ -PathType Leaf})] 68 | [string]$Webh, 69 | [switch]$UseSsl, 70 | [switch]$Help, 71 | [switch]$NoBanner) 72 | 73 | If ($NoBanner -eq $False) 74 | { 75 | Write-Host -ForegroundColor Yellow -BackgroundColor Black -Object " 76 | ___ __ __ _ _ _ 77 | /___\/ _|/ _(_) ___ ___ /\ /\ _ __ __| | __ _| |_ ___ 78 | // // |_| |_| |/ __/ _ \ / / \ \ '_ \ / _ |/ _ | __/ _ \ 79 | / \_//| _| _| | (_| __/ \ \_/ / |_) | (_| | (_| | || __/ 80 | \___/ |_| |_| |_|\___\___| \___/| .__/ \__,_|\__,_|\__\___| 81 | |_| 82 | _ _ _ _ _ 83 | /\ /\| |_(_) (_) |_ _ _ Mike Galvin 84 | / / \ \ __| | | | __| | | | https://gal.vin 85 | \ \_/ / |_| | | | |_| |_| | 86 | \___/ \__|_|_|_|\__|\__, | Version 23.04.28 87 | |___/ See -help for usage 88 | 89 | Donate: https://www.paypal.me/digressive 90 | " 91 | } 92 | 93 | If ($PSBoundParameters.Values.Count -eq 0 -or $Help) 94 | { 95 | Write-Host -Object "Usage: 96 | From a terminal run: [path\]Office-Update.ps1 -Office [path\] -Config [file name.xml] 97 | This will update the office installation files in the specified directory, and delete the old update files. 98 | 99 | To output a log: -L [path\]. 100 | To remove logs produced by the utility older than X days: -LogRotate [number]. 101 | Run with no ASCII banner: -NoBanner 102 | 103 | To use the 'email log' function: 104 | Specify the subject line with -Subject ""'[subject line]'"" If you leave this blank a default subject will be used 105 | Make sure to encapsulate it with double & single quotes as per the example for Powershell to read it correctly. 106 | 107 | Specify the 'to' address with -SendTo [example@contoso.com] 108 | For multiple address, separate with a comma. 109 | 110 | Specify the 'from' address with -From [example@contoso.com] 111 | Specify the SMTP server with -Smtp [smtp server name] 112 | 113 | Specify the port to use with the SMTP server with -Port [port number]. 114 | If none is specified then the default of 25 will be used. 115 | 116 | Specify the user to access SMTP with -User [example@contoso.com] 117 | Specify the password file to use with -Pwd [path\]ps-script-pwd.txt. 118 | Use SSL for SMTP server connection with -UseSsl. 119 | 120 | To generate an encrypted password file run the following commands 121 | on the computer and the user that will run the script: 122 | " 123 | Write-Host -Object ' $creds = Get-Credential 124 | $creds.Password | ConvertFrom-SecureString | Set-Content [path\]ps-script-pwd.txt' 125 | } 126 | 127 | else { 128 | ## If logging is configured, start logging. 129 | ## If the log file already exists, clear it. 130 | If ($LogPathUsr) 131 | { 132 | ## Clean User entered string 133 | $LogPath = $LogPathUsr.trimend('\') 134 | 135 | ## Make sure the log directory exists. 136 | If ((Test-Path -Path $LogPath) -eq $False) 137 | { 138 | New-Item $LogPath -ItemType Directory -Force | Out-Null 139 | } 140 | 141 | $LogFile = ("Office-Update_{0:yyyy-MM-dd_HH-mm-ss}.log" -f (Get-Date)) 142 | $Log = "$LogPath\$LogFile" 143 | 144 | If (Test-Path -Path $Log) 145 | { 146 | Clear-Content -Path $Log 147 | } 148 | } 149 | 150 | ## Function to get date in specific format. 151 | Function Get-DateFormat 152 | { 153 | Get-Date -Format "yyyy-MM-dd HH:mm:ss" 154 | } 155 | 156 | ## Function for logging. 157 | Function Write-Log($Type, $Evt) 158 | { 159 | If ($Type -eq "Info") 160 | { 161 | If ($LogPathUsr) 162 | { 163 | Add-Content -Path $Log -Encoding ASCII -Value "$(Get-DateFormat) [INFO] $Evt" 164 | } 165 | 166 | Write-Host -Object "$(Get-DateFormat) [INFO] $Evt" 167 | } 168 | 169 | If ($Type -eq "Succ") 170 | { 171 | If ($LogPathUsr) 172 | { 173 | Add-Content -Path $Log -Encoding ASCII -Value "$(Get-DateFormat) [SUCCESS] $Evt" 174 | } 175 | 176 | Write-Host -ForegroundColor Green -Object "$(Get-DateFormat) [SUCCESS] $Evt" 177 | } 178 | 179 | If ($Type -eq "Err") 180 | { 181 | If ($LogPathUsr) 182 | { 183 | Add-Content -Path $Log -Encoding ASCII -Value "$(Get-DateFormat) [ERROR] $Evt" 184 | } 185 | 186 | Write-Host -ForegroundColor Red -BackgroundColor Black -Object "$(Get-DateFormat) [ERROR] $Evt" 187 | } 188 | 189 | If ($Type -eq "Conf") 190 | { 191 | If ($LogPathUsr) 192 | { 193 | Add-Content -Path $Log -Encoding ASCII -Value "$Evt" 194 | } 195 | 196 | Write-Host -ForegroundColor Cyan -Object "$Evt" 197 | } 198 | } 199 | 200 | ## Function for Update Check 201 | Function UpdateCheck() 202 | { 203 | $ScriptVersion = "23.04.28" 204 | $RawSource = "https://raw.githubusercontent.com/Digressive/Office-Update/master/Office-Update.ps1" 205 | 206 | try { 207 | $SourceCheck = Invoke-RestMethod -uri "$RawSource" 208 | $VerCheck = $SourceCheck -split '\n' | Select-String -Pattern ".VERSION $ScriptVersion" -SimpleMatch -CaseSensitive -Quiet 209 | 210 | If ($VerCheck -ne $True) 211 | { 212 | Write-Log -Type Conf -Evt "*** There is an update available. ***" 213 | } 214 | } 215 | 216 | catch { 217 | } 218 | } 219 | 220 | If ($Null -eq $OfficeSrc) 221 | { 222 | Write-Log -Type Err -Evt "You must specify -Office [path\]." 223 | Exit 224 | } 225 | 226 | else { 227 | If ($Null -eq $LogPathUsr -And $SmtpServer) 228 | { 229 | Write-Log -Type Err -Evt "You must specify -L [path\] to use the email log function." 230 | Exit 231 | } 232 | } 233 | 234 | ## getting Windows Version info 235 | $OSVMaj = [environment]::OSVersion.Version | Select-Object -expand major 236 | $OSVMin = [environment]::OSVersion.Version | Select-Object -expand minor 237 | $OSVBui = [environment]::OSVersion.Version | Select-Object -expand build 238 | $OSV = "$OSVMaj" + "." + "$OSVMin" + "." + "$OSVBui" 239 | 240 | ## 241 | ## Display the current config and log if configured. 242 | ## 243 | Write-Log -Type Conf -Evt "--- Running with the following config ---" 244 | Write-Log -Type Conf -Evt "Utility Version: 23.04.28" 245 | UpdateCheck ## Run Update checker function 246 | Write-Log -Type Conf -Evt "Hostname: $Env:ComputerName." 247 | Write-Log -Type Conf -Evt "Windows Version: $OSV." 248 | If ($OfficeSrc) 249 | { 250 | Write-Log -Type Conf -Evt "Office folder: $OfficeSrc." 251 | } 252 | 253 | If ($Cfg) 254 | { 255 | Write-Log -Type Conf -Evt "Config file: $Cfg." 256 | } 257 | 258 | If ($LogPathUsr) 259 | { 260 | Write-Log -Type Conf -Evt "Logs directory: $LogPath." 261 | } 262 | 263 | If ($Null -ne $LogHistory) 264 | { 265 | Write-Log -Type Conf -Evt "Logs to keep: $LogHistory days." 266 | } 267 | 268 | If ($Webh) 269 | { 270 | Write-Log -Type Conf -Evt "Webhook file: $Webh." 271 | } 272 | 273 | If ($MailTo) 274 | { 275 | Write-Log -Type Conf -Evt "E-mail log to: $MailTo." 276 | } 277 | 278 | If ($MailFrom) 279 | { 280 | Write-Log -Type Conf -Evt "E-mail log from: $MailFrom." 281 | } 282 | 283 | If ($MailSubject) 284 | { 285 | Write-Log -Type Conf -Evt "E-mail subject: $MailSubject." 286 | } 287 | 288 | If ($SmtpServer) 289 | { 290 | Write-Log -Type Conf -Evt "SMTP server is: $SmtpServer." 291 | } 292 | 293 | If ($SmtpPort) 294 | { 295 | Write-Log -Type Conf -Evt "SMTP Port: $SmtpPort." 296 | } 297 | 298 | If ($SmtpUser) 299 | { 300 | Write-Log -Type Conf -Evt "SMTP auth: Configured" 301 | } 302 | Write-Log -Type Conf -Evt "---" 303 | Write-Log -Type Info -Evt "Process started" 304 | ## 305 | ## Display current config ends here. 306 | ## 307 | 308 | #Run update process. 309 | & $OfficeSrc\setup.exe /download $OfficeSrc\$Cfg 310 | 311 | ## Location of the office source files. 312 | $UpdateFolder = "$OfficeSrc\Office\Data" 313 | 314 | ## Check the last write time of the office source files folder if it is greater than the previous day. 315 | $Updated = (Get-ChildItem -Path $UpdateFolder | Where-Object CreationTime -gt (Get-Date).AddDays(-1)).Count 316 | 317 | ## If the Updated variable returns as not 0 then continue. 318 | If ($Updated -ne 0) 319 | { 320 | $VerName = Get-ChildItem -Path $UpdateFolder -Name -Directory | Measure-Object -Maximum 321 | Write-Log -Type Info -Evt "Office source files were updated." 322 | Write-Log -Type Info -Evt "Latest version is: $($VerName.Maximum)" 323 | 324 | ## Remove old update folders and then files 325 | $Content = Get-ChildItem -Path $UpdateFolder 326 | 327 | If ($Content.count -gt 3) 328 | { 329 | $OffDirs = Get-ChildItem -Path $UpdateFolder -Name -Directory 330 | $resultDirs = $OffDirs | Measure-Object -Maximum 331 | 332 | Get-ChildItem -Path $UpdateFolder -Directory -Exclude $resultDirs.Maximum | Remove-Item -Recurse 333 | 334 | $OffFiles = Get-ChildItem -Path $UpdateFolder -Name -File -Exclude v64.cab 335 | $resultFiles = $OffFiles | Measure-Object -Maximum 336 | 337 | Get-ChildItem -Path $UpdateFolder -File | Where-Object {$_.Name -NotMatch "v64.cab" -And $_.Name -NotMatch "v32.cab" -And $_.Name -NotMatch $resultFiles.Maximum} | Remove-Item 338 | } 339 | 340 | Write-Log -Type Info -Evt "Process finished" 341 | 342 | ## This whole block is for e-mail, if it is configured. 343 | If ($SmtpServer) 344 | { 345 | If (Test-Path -Path $Log) 346 | { 347 | ## Default e-mail subject if none is configured. 348 | If ($Null -eq $MailSubject) 349 | { 350 | $MailSubject = "Office Update Utility Log" 351 | } 352 | 353 | ## Default Smtp Port if none is configured. 354 | If ($Null -eq $SmtpPort) 355 | { 356 | $SmtpPort = "25" 357 | } 358 | 359 | ## Setting the contents of the log to be the e-mail body. 360 | $MailBody = Get-Content -Path $Log | Out-String 361 | 362 | ForEach ($MailAddress in $MailTo) 363 | { 364 | ## If an smtp password is configured, get the username and password together for authentication. 365 | ## If an smtp password is not provided then send the e-mail without authentication and obviously no SSL. 366 | If ($SmtpPwd) 367 | { 368 | $SmtpPwdEncrypt = Get-Content $SmtpPwd | ConvertTo-SecureString 369 | $SmtpCreds = New-Object System.Management.Automation.PSCredential -ArgumentList ($SmtpUser, $SmtpPwdEncrypt) 370 | 371 | ## If -ssl switch is used, send the email with SSL. 372 | ## If it isn't then don't use SSL, but still authenticate with the credentials. 373 | If ($UseSsl) 374 | { 375 | Send-MailMessage -To $MailAddress -From $MailFrom -Subject $MailSubject -Body $MailBody -SmtpServer $SmtpServer -Port $SmtpPort -UseSsl -Credential $SmtpCreds 376 | } 377 | 378 | else { 379 | Send-MailMessage -To $MailAddress -From $MailFrom -Subject $MailSubject -Body $MailBody -SmtpServer $SmtpServer -Port $SmtpPort -Credential $SmtpCreds 380 | } 381 | } 382 | 383 | else { 384 | Send-MailMessage -To $MailAddress -From $MailFrom -Subject $MailSubject -Body $MailBody -SmtpServer $SmtpServer -Port $SmtpPort 385 | } 386 | } 387 | } 388 | 389 | else { 390 | Write-Host -ForegroundColor Red -BackgroundColor Black -Object "There's no log file to email." 391 | } 392 | } 393 | ## End of Email block 394 | 395 | ## Webhook block 396 | If ($Webh) 397 | { 398 | $WebHookUri = Get-Content $Webh 399 | $WebHookArr = @() 400 | 401 | $title = "Office Update Utility" 402 | $description = Get-Content -Path $Log | Out-String 403 | 404 | $WebHookObj = [PSCustomObject]@{ 405 | title = $title 406 | description = $description 407 | } 408 | 409 | $WebHookArr += $WebHookObj 410 | $payload = [PSCustomObject]@{ 411 | embeds = $WebHookArr 412 | } 413 | 414 | Invoke-RestMethod -Uri $WebHookUri -Body ($payload | ConvertTo-Json -Depth 2) -Method Post -ContentType 'application/json' 415 | } 416 | } 417 | 418 | else { 419 | Write-Log -Type Info -Evt "No updates." 420 | Write-Log -Type Info -Evt "Process finished" 421 | } 422 | 423 | If ($Null -ne $LogHistory) 424 | { 425 | ## Cleanup logs. 426 | Write-Log -Type Info -Evt "Deleting logs older than: $LogHistory days" 427 | Get-ChildItem -Path "$LogPath\Office-Update_*" -File | Where-Object CreationTime -lt (Get-Date).AddDays(-$LogHistory) | Remove-Item -Recurse 428 | } 429 | } 430 | ## End -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Office Update Utility 2 | 3 | ## Microsoft Office Update Manager 4 | 5 | For full change log and more information, [visit my site.](https://gal.vin/utils/office-update-utility/) 6 | 7 | Office Update Utility is available from: 8 | 9 | * [GitHub](https://github.com/Digressive/Office-Update) 10 | * [The Microsoft PowerShell Gallery](https://www.powershellgallery.com/packages/Office-Update) 11 | 12 | Please consider supporting my work: 13 | 14 | * Support with [Github Sponsors](https://github.com/sponsors/Digressive). 15 | * Support with a one-time donation using [PayPal](https://www.paypal.me/digressive). 16 | 17 | Please report issues on Github via the issues tab. 18 | 19 | Thanks 20 | -Mike 21 | 22 | ## Features and Requirements 23 | 24 | * This utility will check for and download update files for Microsoft Office. 25 | * It can also remove old update files. 26 | * This utility requires the Office Deployment Tool [a free download available here.](https://www.microsoft.com/en-us/download/details.aspx?id=49117) 27 | * This utility requires at least PowerShell 5.0. 28 | * This utility has been tested on Windows 11, Windows 10, Windows Server 2022, Windows Server 2019 and Windows Server 2016. 29 | * The update log can be sent via email and/or webhook. 30 | 31 | ## Folder Structure 32 | 33 | This utility requires a specific folder structure in order to operate, it expects the Office Deployment Tool and the configuration xml file to be in the same folder. Additionally, the source path of the Office installation files in the configuration xml file should be set to the same location. For example: 34 | 35 | * Office Deployment Tool location: ```\\server\share\Office-365-x64\setup.exe``` 36 | * Configuration xml file location: ```\\server\share\Office-365-x64\config-2019-x64.xml``` 37 | * Source path in the configuration xml file: ```\\server\share\Office-365-x64``` 38 | 39 | This configuration will result in the Office update files being downloaded and stored in: ```\\server\share\Office-2019-x64\Office\Data``` 40 | 41 | ## Generating A Password File For SMTP Authentication 42 | 43 | The password used for SMTP server authentication must be in an encrypted text file. To generate the password file, run the following command in PowerShell on the computer and logged in with the user that will be running the utility. When you run the command, you will be prompted for a username and password. Enter the username and password you want to use to authenticate to your SMTP server. 44 | 45 | Please note: This is only required if you need to authenticate to the SMTP server when send the log via e-mail. 46 | 47 | ``` powershell 48 | $creds = Get-Credential 49 | $creds.Password | ConvertFrom-SecureString | Set-Content c:\scripts\ps-script-pwd.txt 50 | ``` 51 | 52 | After running the commands, you will have a text file containing the encrypted password. When configuring the -Pwd switch enter the path and file name of this file. 53 | 54 | ## Configuration 55 | 56 | Here’s a list of all the command line switches and example configurations. 57 | 58 | | Command Line Switch | Description | Example | 59 | | ------------------- | ----------- | ------- | 60 | | -Office | The folder containing the Office Deployment Tool (ODT). | [path\] | 61 | | -Config | The name of the configuration xml file for the Office ODT. It must be located in the same folder as the ODT. | [file name.xml] | 62 | | -Days | The number of days that you wish to keep old update files for. If you do not configure this option, no old files will be removed. | [number] | 63 | | -L | The path to output the log file to. | [path\] | 64 | | -LogRotate | Remove logs produced by the utility older than X days | [number] | 65 | | -NoBanner | Use this option to hide the ASCII art title in the console. | N/A | 66 | | -Help | Display usage information. No arguments also displays help. | N/A | 67 | | -Webhook | The txt file containing the URI for a webhook to send the log file to. | [path\]webhook.txt | 68 | | -Subject | Specify a subject line. If you leave this blank the default subject will be used | "'[Server: Notification]'" | 69 | | -SendTo | The e-mail address the log should be sent to. For multiple address, separate with a comma. | [example@contoso.com] | 70 | | -From | The e-mail address the log should be sent from. | [example@contoso.com] | 71 | | -Smtp | The DNS name or IP address of the SMTP server. | [smtp server address] | 72 | | -Port | The Port that should be used for the SMTP server. If none is specified then the default of 25 will be used. | [port number] | 73 | | -User | The user account to authenticate to the SMTP server. | [example@contoso.com] | 74 | | -Pwd | The txt file containing the encrypted password for SMTP authentication. | [path\]ps-script-pwd.txt | 75 | | -UseSsl | Configures the utility to connect to the SMTP server using SSL. | N/A | 76 | 77 | ## Example 78 | 79 | ``` txt 80 | [path\]Office-Update.ps1 -Office [path\] -Config [file name.xml] -Days [number] 81 | ``` 82 | 83 | This will update the office installation files in the specified directory, and delete update files older than X days 84 | 85 | ## Change Log 86 | 87 | ### 2023-04-28: Version 23.04.28 88 | 89 | * Minor improvement to update checker. If the internet is not reachable it silently errors out. 90 | 91 | ### 2023-02-07: Version 23.02.07 92 | 93 | * Added script update checker - shows if an update is available in the log and console. 94 | * Added webhook option to send log file to. 95 | * Removed SMTP authentication details from the 'Config' report. Now it just shows as 'configured' if SMTP user is configured. To be clear: no passwords were ever shown or stored in plain text. 96 | 97 | ### 2022-07-31: Version 22.07.30 98 | 99 | * Changed how the removal of old files works. Old versions will be removed regardless, -Days option has been removed. 100 | 101 | ### 2022-06-22: Version 22.06.22 102 | 103 | * Fixed an issue where If -L [path\] not configured then a non fatal error would occur as no log path was specified for the log to be output to. 104 | 105 | ### 2022-06-14: Version 22.05.25 106 | 107 | * Added new feature: log can now be emailed to multiple addresses. 108 | * Added checks and balances to help with configuration as I'm very aware that the initial configuration can be troublesome. Running the utility manually is a lot more friendly and step-by-step now. 109 | * Added -Help to give usage instructions in the terminal. Running the script with no options will also trigger the -help switch. 110 | * Cleaned user entered paths so that trailing slashes no longer break things or have otherwise unintended results. 111 | * Added -LogRotate [days] to removed old logs created by the utility. 112 | * Streamlined config report so non configured options are not shown. 113 | * Added donation link to the ASCII banner. 114 | * Cleaned up code, removed unneeded log noise. 115 | 116 | ### 2022-05-25: Version 22.05.25 117 | 118 | * Added -Help to give usage instructions in the terminal. Also running the script with no options will also trigger the -help switch. 119 | * Streamlined config report so non configured options are not shown. 120 | * Added a -LogRotate option to delete logs older than X number of days. 121 | 122 | ### 2021-12-06: Version 21.12.06 123 | 124 | * Fixed problem with Hostname not displaying. 125 | 126 | ### 2021-12-04: Version 21.12.04 127 | 128 | * Configured logs path now is created, if it does not exist. 129 | * Added OS version info. 130 | * Added an option to specify the Port for SMTP communication. 131 | 132 | ### 2020-03-03: Version 2020.03.01 'Crosshair' 133 | 134 | New features: 135 | 136 | * Refactored code. 137 | * Fully backwards compatible. 138 | * Added ASCII banner art when run in the console. 139 | * Added option to disable the ASCII banner art. 140 | * Config report matches design of Image Factory Utility. 141 | 142 | ### 2019-09-04 v1.1 143 | 144 | * Added custom subject line for e-mail. 145 | 146 | ### 2019-06-16 v1.0 147 | 148 | * Initial release. 149 | --------------------------------------------------------------------------------