Explore the comprehensive installation and uninstallation scripts for essential software including Notion, Google Drive, Microsoft Teams, and Microsoft Office 365, designed to automate processes efficiently and effectively.
Windows
Notion
Policy
SELECT name FROM programs WHERE name LIKE 'Notion%'
Install script
# Some installers require a flag to run silently.# Each installer might use a different argument (usually it's "/S" or "/s")$installArgs = "/S"$exeFilePath = "${env:INSTALLER_PATH}"$exitCode = 0try {# Copy the installer to a public folder so that all can access it# users$exeFilename = Split-Path $exeFilePath -leafCopy-Item -Path $exeFilePath -Destination "${env:PUBLIC}" -Force$exeFilePath = "${env:PUBLIC}\$exeFilename"# Task properties. The task will be started by the logged in user$action = New-ScheduledTaskAction -Execute "$exeFilePath" ` -Argument "$installArgs"$trigger = New-ScheduledTaskTrigger -AtLogOn$userName = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -expand UserName$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries# Create a task object with the properties defined above$task = New-ScheduledTask -Action $action -Trigger $trigger ` -Settings $settings# Register the task$taskName = "fleet-install-$exeFilename"Register-ScheduledTask "$taskName" -InputObject $task -User "$userName"# keep track of the start time to cancel if taking too long to start$startDate = Get-Date# Start the task now that it is readyStart-ScheduledTask -TaskName "$taskName" -TaskPath "\"# Wait for the task to be running$state = (Get-ScheduledTask -TaskName "$taskName").StateWrite-Host "ScheduledTask is '$state'"while ($state -ne "Running") { Write-Host "ScheduledTask is '$state'. Waiting to run .exe..." $endDate = Get-Date $elapsedTime = New-Timespan -Start $startDate -End $endDate if ($elapsedTime.TotalSeconds -gt 120) { Throw "Timed-out waiting for scheduled task state." } Start-Sleep -Seconds 1 $state = (Get-ScheduledTask -TaskName "$taskName").State}# Wait for the task to be done$state = (Get-ScheduledTask -TaskName "$taskName").Statewhile ($state -eq "Running") { Write-Host "ScheduledTask is '$state'. Waiting for .exe to complete..." $endDate = Get-Date $elapsedTime = New-Timespan -Start $startDate -End $endDate if ($elapsedTime.TotalSeconds -gt 120) { Throw "Timed-out waiting for scheduled task state." } Start-Sleep -Seconds 10 $state = (Get-ScheduledTask -TaskName "$taskName").State}# Remove taskWrite-Host "Removing ScheduledTask: $taskName."Unregister-ScheduledTask -TaskName "$taskName" -Confirm:$false} catch { Write-Host "Error: $_" $exitCode = 1} finally { # Remove installer Remove-Item -Path $exeFilePath -Force}Exit $exitCode
Uninstall script
# Fleet extracts the name from the installer (EXE) and saves it to PACKAGE_ID# variable$softwareName = "Notion"# Script to uninstall software as the current logged-in user.$userScript = @'$softwareName = "Notion"# Using the exact software name here is recommended to avoid# uninstalling unintended software.$softwareNameLike = "*$softwareName*"# Some uninstallers require additional flags to run silently.# Each uninstaller might use a different argument (usually it's "/S" or "/s")$uninstallArgs = "/S"$uninstallCommand = ""$exitCode = 0try {$userKey = ` 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'[array]$uninstallKeys = Get-ChildItem ` -Path @($userKey) ` -ErrorAction SilentlyContinue | ForEach-Object { Get-ItemProperty $_.PSPath }$foundUninstaller = $falseforeach ($key in $uninstallKeys) { # If needed, add -notlike to the comparison to exclude certain similar # software if ($key.DisplayName -like $softwareNameLike) { $foundUninstaller = $true # Get the uninstall command. Some uninstallers do not include # 'QuietUninstallString' and require a flag to run silently. $uninstallCommand = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString } # The uninstall command may contain command and args, like: # "C:\Program Files\Software\uninstall.exe" --uninstall --silent # Split the command and args $splitArgs = $uninstallCommand.Split('"') if ($splitArgs.Length -gt 1) { if ($splitArgs.Length -eq 3) { $uninstallArgs = "$( $splitArgs[2] ) $uninstallArgs".Trim() } elseif ($splitArgs.Length -gt 3) { Throw ` "Uninstall command contains multiple quoted strings. " + "Please update the uninstall script.`n" + "Uninstall command: $uninstallCommand" } $uninstallCommand = $splitArgs[1] } Write-Host "Uninstall command: $uninstallCommand" Write-Host "Uninstall args: $uninstallArgs" $processOptions = @{ FilePath = $uninstallCommand PassThru = $true Wait = $true } if ($uninstallArgs -ne '') { $processOptions.ArgumentList = "$uninstallArgs" } # Start the process and track the exit code $process = Start-Process @processOptions $exitCode = $process.ExitCode # Prints the exit code Write-Host "Uninstall exit code: $exitCode" # Exit the loop once the software is found and uninstalled. break }}if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found." $exitCode = 1}} catch { Write-Host "Error: $_" $exitCode = 1}Exit $exitCode'@$exitCode = 0# Create a script in a public folder so that it can be accessed by all users.$uninstallScriptPath = "${env:PUBLIC}/uninstall-$softwareName.ps1"$taskName = "fleet-uninstall-$softwareName"try { Set-Content -Path $uninstallScriptPath -Value $userScript -Force # Task properties. The task will be started by the logged in user $action = New-ScheduledTaskAction -Execute "PowerShell.exe" ` -Argument "$uninstallScriptPath" $trigger = New-ScheduledTaskTrigger -AtLogOn $userName = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -expand UserName $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries # Create a task object with the properties defined above $task = New-ScheduledTask -Action $action -Trigger $trigger ` -Settings $settings # Register the task Register-ScheduledTask "$taskName" -InputObject $task -User "$userName" # keep track of the start time to cancel if taking too long to start $startDate = Get-Date # Start the task now that it is ready Start-ScheduledTask -TaskName "$taskName" -TaskPath "\" # Wait for the task to be running $state = (Get-ScheduledTask -TaskName "$taskName").State Write-Host "ScheduledTask is '$state'" while ($state -ne "Running") { Write-Host "ScheduledTask is '$state'. Waiting to uninstall..." $endDate = Get-Date $elapsedTime = New-Timespan -Start $startDate -End $endDate if ($elapsedTime.TotalSeconds -gt 120) { Throw "Timed-out waiting for scheduled task state." } Start-Sleep -Seconds 1 $state = (Get-ScheduledTask -TaskName "$taskName").State } # Wait for the task to be done $state = (Get-ScheduledTask -TaskName "$taskName").State while ($state -eq "Running") { Write-Host "ScheduledTask is '$state'. Waiting for .exe to complete..." $endDate = Get-Date $elapsedTime = New-Timespan -Start $startDate -End $endDate if ($elapsedTime.TotalSeconds -gt 120) { Throw "Timed-out waiting for scheduled task state." } Start-Sleep -Seconds 10 $state = (Get-ScheduledTask -TaskName "$taskName").State }} catch { Write-Host "Error: $_" $exitCode = 1} finally { # Remove task Write-Host "Removing ScheduledTask: $taskName." Unregister-ScheduledTask -TaskName "$taskName" -Confirm:$false # Remove user script Remove-Item -Path $uninstallScriptPath -Force}Exit $exitCode
Google drive
Policy
SELECT name FROM programs WHERE name='Google Drive'
Install script
# Learn more about .exe install scripts:# http://fleetdm.com/learn-more-about/exe-install-scripts$exeFilePath = "${env:INSTALLER_PATH}"try {# Add argument to install silently# Argument to make install silent depends on installer,# each installer might use different argument (usually it's "/S" or "/s")$processOptions = @{ FilePath = "$exeFilePath" ArgumentList = "--silent --skip_launch_new --gsuite_shortcuts=false" PassThru = $true Wait = $true} # Start process and track exit code$process = Start-Process @processOptions$exitCode = $process.ExitCode# Prints the exit codeWrite-Host "Install exit code: $exitCode"Exit $exitCode} catch { Write-Host "Error: $_" Exit 1}
Uninstall script
# Fleet extracts name from installer (EXE) and saves it to PACKAGE_ID# variable$softwareName = "Google Drive"# It is recommended to use exact software name here if possible to avoid# uninstalling unintended software.$softwareNameLike = "*$softwareName*"# Some uninstallers require a flag to run silently.# Each uninstaller might use different argument (usually it's "/S" or "/s")$uninstallArgs = "/S"$machineKey = ` 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'$machineKey32on64 = ` 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'$exitCode = 0try {[array]$uninstallKeys = Get-ChildItem ` -Path @($machineKey, $machineKey32on64) ` -ErrorAction SilentlyContinue | ForEach-Object { Get-ItemProperty $_.PSPath }$foundUninstaller = $falseforeach ($key in $uninstallKeys) { # If needed, add -notlike to the comparison to exclude certain similar # software if ($key.DisplayName -like $softwareNameLike) { $foundUninstaller = $true # Get the uninstall command. Some uninstallers do not include # 'QuietUninstallString' and require a flag to run silently. $uninstallCommand = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString } # The uninstall command may contain command and args, like: # "C:\Program Files\Software\uninstall.exe" --uninstall --silent # Split the command and args $splitArgs = $uninstallCommand.Split('"') if ($splitArgs.Length -gt 1) { if ($splitArgs.Length -eq 3) { $uninstallArgs = "$( $splitArgs[2] ) $uninstallArgs".Trim() } elseif ($splitArgs.Length -gt 3) { Throw ` "Uninstall command contains multiple quoted strings. " + "Please update the uninstall script.`n" + "Uninstall command: $uninstallCommand" } $uninstallCommand = $splitArgs[1] } Write-Host "Uninstall command: $uninstallCommand" Write-Host "Uninstall args: $uninstallArgs" $processOptions = @{ FilePath = $uninstallCommand PassThru = $true Wait = $true } if ($uninstallArgs -ne '') { $processOptions.ArgumentList = "$uninstallArgs" } # Start process and track exit code $process = Start-Process @processOptions $exitCode = $process.ExitCode # Prints the exit code Write-Host "Uninstall exit code: $exitCode" # Exit the loop once the software is found and uninstalled. break }}if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found." # Change exit code to 0 if you don't want to fail if uninstaller is not # found. This could happen if program was already uninstalled. $exitCode = 1}} catch { Write-Host "Error: $_" $exitCode = 1}Exit $exitCode
Microsoft Teams
Install script
$logFile = "${env:TEMP}/fleet-install-software.log"try {$installProcess = Start-Process msiexec.exe ` -ArgumentList "/quiet /norestart ALLUSERS=1 /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" ` -PassThru -Verb RunAs -WaitGet-Content $logFile -Tail 500Exit $installProcess.ExitCode} catch { Write-Host "Error: $_" Exit 1}
Uninstall script
$product_code = "{731F6BAA-A986-45A4-8936-7C3AAAAA760B}"# Fleet uninstalls app using product code that's extracted on uploadmsiexec /quiet /x $product_codeExit $LASTEXITCODE
Microsoft Office 365
Policy
SELECT name FROM programs WHERE name LIKE 'Microsoft 365 Apps for business%'
Install script
# Learn more about .exe install scripts:# http://fleetdm.com/learn-more-about/exe-install-scripts$exeFilePath = "${env:INSTALLER_PATH}"try {# Add argument to install silently# Argument to make install silent depends on installer,# each installer might use different argument (usually it's "/S" or "/s")$processOptions = @{ FilePath = "$exeFilePath" ArgumentList = "/S" PassThru = $true Wait = $true} # Start process and track exit code$process = Start-Process @processOptions$exitCode = $process.ExitCode# Prints the exit codeWrite-Host "Install exit code: $exitCode"Exit $exitCode} catch { Write-Host "Error: $_" Exit 1}
Uninstall script
# Fleet extracts name from installer (EXE) and saves it to PACKAGE_ID# variable$softwareName = "Microsoft Office"# It is recommended to use exact software name here if possible to avoid# uninstalling unintended software.$softwareNameLike = "*$softwareName*"# Some uninstallers require a flag to run silently.# Each uninstaller might use different argument (usually it's "/S" or "/s")$uninstallArgs = "/S"$machineKey = ` 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'$machineKey32on64 = ` 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'$exitCode = 0try {[array]$uninstallKeys = Get-ChildItem ` -Path @($machineKey, $machineKey32on64) ` -ErrorAction SilentlyContinue | ForEach-Object { Get-ItemProperty $_.PSPath }$foundUninstaller = $falseforeach ($key in $uninstallKeys) { # If needed, add -notlike to the comparison to exclude certain similar # software if ($key.DisplayName -like $softwareNameLike) { $foundUninstaller = $true # Get the uninstall command. Some uninstallers do not include # 'QuietUninstallString' and require a flag to run silently. $uninstallCommand = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString } # The uninstall command may contain command and args, like: # "C:\Program Files\Software\uninstall.exe" --uninstall --silent # Split the command and args $splitArgs = $uninstallCommand.Split('"') if ($splitArgs.Length -gt 1) { if ($splitArgs.Length -eq 3) { $uninstallArgs = "$( $splitArgs[2] ) $uninstallArgs".Trim() } elseif ($splitArgs.Length -gt 3) { Throw ` "Uninstall command contains multiple quoted strings. " + "Please update the uninstall script.`n" + "Uninstall command: $uninstallCommand" } $uninstallCommand = $splitArgs[1] } Write-Host "Uninstall command: $uninstallCommand" Write-Host "Uninstall args: $uninstallArgs" $processOptions = @{ FilePath = $uninstallCommand PassThru = $true Wait = $true } if ($uninstallArgs -ne '') { $processOptions.ArgumentList = "$uninstallArgs" } # Start process and track exit code $process = Start-Process @processOptions $exitCode = $process.ExitCode # Prints the exit code Write-Host "Uninstall exit code: $exitCode" # Exit the loop once the software is found and uninstalled. break }}if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found." # Change exit code to 0 if you don't want to fail if uninstaller is not # found. This could happen if program was already uninstalled. $exitCode = 1}} catch { Write-Host "Error: $_" $exitCode = 1}Exit $exitCode