Install-Office365Suite.ps1
<#PSScriptInfo .VERSION 1.3 .GUID 938a927b-cb9a-4001-87fc-77d8dd6e7599 .AUTHOR Joshua Melo .COMPANYNAME .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Installs the Office 365 suite for Windows using the Office Deployment Tool #> [CmdletBinding(DefaultParameterSetName = 'XMLFile')] param( [Parameter(ParameterSetName = 'XMLFile')][String]$ConfigurationXMLFile, [Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$AcceptEULA = 'TRUE', [Parameter(ParameterSetName = 'NoXML')][ValidateSet('Broad', 'Targeted', 'Monthly')]$Channel = 'Broad', [Parameter(ParameterSetName = 'NoXML')][Switch]$DisplayInstall = $False, [Parameter(ParameterSetName = 'NoXML')][ValidateSet('Groove', 'Outlook', 'OneNote', 'Access', 'OneDrive', 'Publisher', 'Word', 'Excel', 'PowerPoint', 'Teams', 'Lync')][Array]$ExcludeApps, [Parameter(ParameterSetName = 'NoXML')][ValidateSet('64', '32')]$OfficeArch = '64', [Parameter(ParameterSetName = 'NoXML')][ValidateSet('O365ProPlusRetail', 'O365BusinessRetail')]$OfficeEdition = 'O365ProPlusRetail', [Parameter(ParameterSetName = 'NoXML')][ValidateSet(0, 1)]$SharedComputerLicensing = '0', [Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$EnableUpdates = 'TRUE', [Parameter(ParameterSetName = 'NoXML')][String]$LoggingPath, [Parameter(ParameterSetName = 'NoXML')][String]$SourcePath, [Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$PinItemsToTaskbar = 'TRUE', [Parameter(ParameterSetName = 'NoXML')][Switch]$KeepMSI = $False, [String]$OfficeInstallDownloadPath = 'C:\Scripts\Office365Install', [Switch]$CleanUpInstallFiles = $False ) function Set-XMLFile { if ($ExcludeApps) { $ExcludeApps | ForEach-Object { $ExcludeAppsString += "<ExcludeApp ID =`"$_`" />" } } if ($OfficeArch) { $OfficeArchString = "`"$OfficeArch`"" } if ($KeepMSI) { $RemoveMSIString = $Null } else { $RemoveMSIString = '<RemoveMSI />' } if ($Channel) { $ChannelString = "Channel=`"$Channel`"" } else { $ChannelString = $Null } if ($SourcePath) { $SourcePathString = "SourcePath=`"$SourcePath`"" } else { $SourcePathString = $Null } if ($DisplayInstall) { $SilentInstallString = 'Full' } else { $SilentInstallString = 'None' } if ($LoggingPath) { $LoggingString = "<Logging Level=`"Standard`" Path=`"$LoggingPath`" />" } else { $LoggingString = $Null } #XML data that will be used for the download/install $OfficeXML = [XML]@" <Configuration> <Add OfficeClientEdition=$OfficeArchString $ChannelString $SourcePathString > <Product ID="$OfficeEdition"> <Language ID="MatchOS" /> $ExcludeAppsString </Product> </Add> <Property Name="PinIconsToTaskbar" Value="$PinItemsToTaskbar" /> <Property Name="SharedComputerLicensing" Value="$SharedComputerlicensing" /> <Display Level="$SilentInstallString" AcceptEULA="$AcceptEULA" /> <Updates Enabled="$EnableUpdates" /> $RemoveMSIString $LoggingString </Configuration> "@ #Save the XML file $OfficeXML.Save("$OfficeInstallDownloadPath\OfficeInstall.xml") } function Get-ODTURL { [String]$MSWebPage = Invoke-RestMethod 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=49117' #Thank you reddit user, u/sizzlr for this addition. $MSWebPage | ForEach-Object { if ($_ -match 'url=(https://.*officedeploymenttool.*\.exe)') { $matches[1] } } } $VerbosePreference = 'Continue' $ErrorActionPreference = 'Stop' $CurrentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (!($CurrentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))) { Write-Warning 'Script is not running as Administrator' Write-Warning 'Please rerun this script as Administrator.' exit } if (-Not(Test-Path $OfficeInstallDownloadPath )) { New-Item -Path $OfficeInstallDownloadPath -ItemType Directory | Out-Null } if (!($ConfigurationXMLFile)) { Set-XMLFile } else { if (!(Test-Path $ConfigurationXMLFile)) { Write-Warning 'The configuration XML file is not a valid file' Write-Warning 'Please check the path and try again' exit } } $ConfigurationXMLFile = "$OfficeInstallDownloadPath\OfficeInstall.xml" $ODTInstallLink = Get-ODTURL #Download the Office Deployment Tool Write-Verbose 'Downloading the Office Deployment Tool...' try { Invoke-WebRequest -Uri $ODTInstallLink -OutFile "$OfficeInstallDownloadPath\ODTSetup.exe" } catch { Write-Warning 'There was an error downloading the Office Deployment Tool.' Write-Warning 'Please verify the below link is valid:' Write-Warning $ODTInstallLink exit } #Run the Office Deployment Tool setup try { Write-Verbose 'Running the Office Deployment Tool...' Start-Process "$OfficeInstallDownloadPath\ODTSetup.exe" -ArgumentList "/quiet /extract:$OfficeInstallDownloadPath" -Wait } catch { Write-Warning 'Error running the Office Deployment Tool. The error is below:' Write-Warning $_ } #Run the O365 install try { Write-Verbose 'Downloading and installing Microsoft 365' $Silent = Start-Process "$OfficeInstallDownloadPath\Setup.exe" -ArgumentList "/configure $ConfigurationXMLFile" -Wait -PassThru } Catch { Write-Warning 'Error running the Office install. The error is below:' Write-Warning $_ } #Check if Office 365 suite was installed correctly. $RegLocations = @('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' ) $OfficeInstalled = $False foreach ($Key in (Get-ChildItem $RegLocations) ) { if ($Key.GetValue('DisplayName') -like '*Microsoft 365*') { $OfficeVersionInstalled = $Key.GetValue('DisplayName') $OfficeInstalled = $True } } if ($OfficeInstalled) { Write-Verbose "$($OfficeVersionInstalled) installed successfully!" } else { Write-Warning 'Microsoft 365 was not detected after the install ran' } if ($CleanUpInstallFiles) { Remove-Item -Path $OfficeInstallDownloadPath -Force -Recurse } |