#PSScriptInfo
.VERSION 1.5
.GUID f95d9be8-dfdc-4c5e-8bc9-e06ce585e830
.AUTHOR Joshua Melo
.COMPANYNAME
.COPYRIGHT
.TAGS
.LICENSEURI
.PROJECTURI https://github.com/mallockey/Install-Office365Suite
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
#>
<#
.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('SemiAnnualPreview', 'SemiAnnual', 'MonthlyEnterprise', 'CurrentPreview', 'Current')]$Channel = 'Current',
[Parameter(ParameterSetName = 'NoXML')][Switch]$DisplayInstall,
[Parameter(ParameterSetName = 'NoXML')][Switch]$IncludeProject,
[Parameter(ParameterSetName = 'NoXML')][Switch]$IncludeVisio,
[Parameter(ParameterSetName = 'NoXML')][Array]$LanguageIDs,
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('64', '32')]$OfficeArch = '64',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('O365ProPlusRetail', 'O365BusinessRetail')]$OfficeEdition = 'O365BusinessRetail',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet(0, 1)]$SharedComputerLicensing = '0',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$EnableUpdates = 'TRUE',
[Parameter(ParameterSetName = 'NoXML')][String]$SourcePath,
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$PinItemsToTaskbar = 'TRUE',
[Parameter(ParameterSetName = 'NoXML')][Switch]$KeepMSI,
[String]$OfficeInstallDownloadPath = 'C:\Coastline\Scripts\Office365Install',
[Switch]$CleanUpInstallFiles = $False
)
$ExcludeApps = @('Groove','Lync')
$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
}
function Get-XMLFile {
[CmdletBinding(DefaultParameterSetName = 'NoXML')]
param(
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$AcceptEULA = 'TRUE',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('SemiAnnualPreview', 'SemiAnnual', 'MonthlyEnterprise', 'CurrentPreview', 'Current')]$Channel = 'Current',
[Parameter(ParameterSetName = 'NoXML')][Switch]$DisplayInstall,
[Parameter(ParameterSetName = 'NoXML')][Switch]$IncludeProject,
[Parameter(ParameterSetName = 'NoXML')][Switch]$IncludeVisio,
[Parameter(ParameterSetName = 'NoXML')][Array]$LanguageIDs,
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('64', '32')]$OfficeArch = '64',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('O365ProPlusRetail', 'O365BusinessRetail')]$OfficeEdition = 'O365BusinessRetail',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet(0, 1)]$SharedComputerLicensing = '0',
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$EnableUpdates = 'TRUE',
[Parameter(ParameterSetName = 'NoXML')][String]$SourcePath,
[Parameter(ParameterSetName = 'NoXML')][ValidateSet('TRUE', 'FALSE')]$PinItemsToTaskbar = 'TRUE',
[Parameter(ParameterSetName = 'NoXML')][Switch]$KeepMSI
)
$ExcludeApps = @('Groove','Lync')
if ($ExcludeApps) {
$ExcludeApps | ForEach-Object {
$ExcludeAppsString += ""
}
}
if ($LanguageIDs) {
$LanguageIDs | ForEach-Object {
$LanguageString += ""
}
}
else {
$LanguageString = ""
}
if ($OfficeArch) {
$OfficeArchString = "`"$OfficeArch`""
}
if ($KeepMSI) {
$RemoveMSIString = $Null
}
else {
$RemoveMSIString = ''
}
if ($Channel) {
$ChannelString = "Channel=`"$Channel`""
}
else {
$ChannelString = $Null
}
if ($SourcePath) {
$SourcePathString = "SourcePath=`"$SourcePath`""
}
else {
$SourcePathString = $Null
}
if ($DisplayInstall) {
$SilentInstallString = 'Full'
}
else {
$SilentInstallString = 'None'
}
if ($IncludeProject) {
$ProjectString = "$ExcludeAppsString $LanguageString"
}
else {
$ProjectString = $Null
}
if ($IncludeVisio) {
$VisioString = "$ExcludeAppsString $LanguageString"
}
else {
$VisioString = $Null
}
$OfficeXML = [XML]@"
$LanguageString
$ExcludeAppsString
$ProjectString
$VisioString
$RemoveMSIString
"@
$OfficeXML
}
function Get-ODTURL {
[String]$MSWebPage = Invoke-RestMethod 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=49117'
$MSWebPage | ForEach-Object {
if ($_ -match 'url=(https://.*officedeploymenttool.*\.exe)') {
$matches[1]
}
}
}
if (-Not(Test-Path $OfficeInstallDownloadPath )) {
New-Item -Path $OfficeInstallDownloadPath -ItemType Directory | Out-Null
}
if (!($ConfigurationXMLFile)) {
if ($ExcludeApps) {
$OfficeXML = Get-XMLFile -AcceptEULA $AcceptEULA `
-Channel $Channel `
-DisplayInstall:$DisplayInstall `
-IncludeProject:$IncludeProject `
-IncludeVisio:$IncludeVisio `
-LanguageIDs $LanguageIDs `
-ExcludeApps $ExcludeApps `
-OfficeArch $OfficeArch `
-OfficeEdition $OfficeEdition `
-SharedComputerLicensing $SharedComputerLicensing `
-EnableUpdate $EnableUpdates `
-PinItemsToTaskBar $PinItemsToTaskbar `
-KeepMSI:$KeepMSI `
}
else {
$OfficeXML = Get-XMLFile -AcceptEULA $AcceptEULA `
-Channel $Channel `
-DisplayInstall:$DisplayInstall `
-IncludeProject:$IncludeProject `
-IncludeVisio:$IncludeVisio `
-LanguageIDs $LanguageIDs `
-OfficeArch $OfficeArch `
-OfficeEdition $OfficeEdition `
-SharedComputerLicensing $SharedComputerLicensing `
-EnableUpdate $EnableUpdates `
-PinItemsToTaskBar $PinItemsToTaskbar `
-KeepMSI:$KeepMSI `
}
$OfficeXML.Save("$OfficeInstallDownloadPath\OfficeInstall.xml")
$ConfigurationXMLFile = "$OfficeInstallDownloadPath\OfficeInstall.xml"
}
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
}
}
$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
}