Table of Contents
Purpose of the Script
- Automatically download and install the latest version of Microsoft Teams.
- Uses Microsoft’s Winget GitHub. repository to locate the official installer.
- Performs a silent installation for all users.
# Define the GitHub API URL for the app manifests in winget-pkgs.
$apiUrl = "https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams"
# Fetch version folders then filter only version folders.
$versions = Invoke-RestMethod -Uri $apiUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$versionFolders = $versions | Where-Object { $_.type -eq "dir" }
# Extract and sort version numbers to get the latest version.
$sortedVersions = $versionFolders | ForEach-Object { $_.name } | Sort-Object {[version]$_} -Descending -ErrorAction SilentlyContinue
$latestVersion = $sortedVersions[0]
Write-Host "Latest Microsoft Teams version: $latestVersion."
# Get contents of the latest version folder to find the .installer.yaml file.
$latestApiUrl = "$apiUrl/$latestVersion"
$latestFiles = Invoke-RestMethod -Uri $latestApiUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$installerFile = $latestFiles | Where-Object { $_.name -like "*.installer.yaml" }
# Download and parse YAML content to get the Url of the latest installer file.
$yamlUrl = $installerFile.download_url
$yamlContent = Invoke-RestMethod -Uri $yamlUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$yamlString = $yamlContent -join "`n"
$installerUrls = [regex]::Matches($yamlString, "InstallerUrl:\s+(http[^\s]+)") | ForEach-Object { $_.Groups[1].Value }
$installerUrl = $installerUrls[1]
Write-Host "Downloading installer from: $installerUrl"
# Download the latest installer to the temp folder.
$webClient = [System.Net.WebClient]::new()
$webClient.DownloadFile($installerUrl, "$env:TEMP\MSTeams.msix")
$teambootstrapperUrl = 'https://go.microsoft.com/fwlink/?linkid=2243204&clcid=0x409'
$webClient.DownloadFile($teambootstrapperUrl, "$env:TEMP\teamsbootstrapper.exe")
# Start the install process.
& "$env:TEMP\teamsbootstrapper.exe" -p -o "$env:TEMP\MSTeams.msix"
# Delete the downloaded installer file.
Remove-Item -Path "$env:TEMP\MSTeams.msix" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$env:TEMP\teamsbootstrapper.exe" -Force -ErrorAction SilentlyContinue
Write-Host "Microsoft Teams installation completed."
Step-by-Step Explanation
Below is a detailed explanation of what each part of the PowerShell script does. The script is designed to automatically install or update Microsoft Teams on Windows computers.
1. Define the API URL
$apiUrl = "https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams"
- Points to the Microsoft Teams manifest folder in the winget-pkgs GitHub repository.
- This folder contains subfolders for each version.
2. Get the list of available versions
$versions = Invoke-RestMethod -Uri $apiUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$versionFolders = $versions | Where-Object { $_.type -eq "dir" }
- Fetches all items in the folder (both files and folders).
- Filters to only include directories, because each directory represents a Microsoft Teams version.
# Output
PS C:\> $versionFolders
name : 23257.2618.2432.4374
path : manifests/m/Microsoft/Teams/23257.2618.2432.4374
sha : f4232916a2074a182845a29035bc35467ef4a1cd
size : 0
url : https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams/23257.2618.2432.4374?ref=mast
er
html_url : https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/Teams/23257.2618.2432.4374
git_url : https://api.github.com/repos/microsoft/winget-pkgs/git/trees/f4232916a2074a182845a29035bc35467ef4a1cd
download_url :
type : dir
_links : @{self=https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams/23257.2618.2432.4374?r
ef=master;
git=https://api.github.com/repos/microsoft/winget-pkgs/git/trees/f4232916a2074a182845a29035bc35467ef4a1cd;
html=https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/Teams/23257.2618.2432.4374}
...
3. Extract and sort versions
$sortedVersions = $versionFolders | ForEach-Object { $_.name } | Sort-Object {[version]$_} -Descending -ErrorAction SilentlyContinue
$latestVersion = $sortedVersions[0]
- Extracts folder names (version numbers).
- Sorts them as version objects (not strings) in descending order.
- Picks the latest version (first in the sorted list).
# Output
PS C:\> $sortedVersions
25163.3611.3774.6315
25153.1010.3727.5483
25122.1415.3698.6812
25094.310.3616.953
25072.1611.3570.1995
25060.205.3499.6849
25044.2208.3471.2155
25031.805.3440.5290
25017.203.3370.1174
25007.607.3371.8436
24335.208.3315.1951
...
4. Get the .installer.yaml file for the latest version
$latestApiUrl = "$apiUrl/$latestVersion"
$latestFiles = Invoke-RestMethod -Uri $latestApiUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$installerFile = $latestFiles | Where-Object { $_.name -like "*.installer.yaml" }
- Looks inside the latest version folder.
- Finds the *.installer.yaml file, which contains metadata about the installer (URLs, architecture, etc.).
# Output
PS C:\> $installerFile
name : Microsoft.Teams.installer.yaml
path : manifests/m/Microsoft/Teams/25163.3611.3774.6315/Microsoft.Teams.installer.yaml
sha : be410c2f859117f166cc1c8e473dfac0bb995d12
size : 1377
url : https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams/25163.3611.3774.6315/Microsof
t.Teams.installer.yaml?ref=master
html_url : https://github.com/microsoft/winget-pkgs/blob/master/manifests/m/Microsoft/Teams/25163.3611.3774.6315/Microsoft.Teams
.installer.yaml
git_url : https://api.github.com/repos/microsoft/winget-pkgs/git/blobs/be410c2f859117f166cc1c8e473dfac0bb995d12
download_url : https://raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/m/Microsoft/Teams/25163.3611.3774.6315/Micro
soft.Teams.installer.yaml
type : file
_links : @{self=https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams/25163.3611.3774.6315/M
icrosoft.Teams.installer.yaml?ref=master;
git=https://api.github.com/repos/microsoft/winget-pkgs/git/blobs/be410c2f859117f166cc1c8e473dfac0bb995d12; html=https
://github.com/microsoft/winget-pkgs/blob/master/manifests/m/Microsoft/Teams/25163.3611.3774.6315/Microsoft.Teams.inst
aller.yaml}
5. Extract installer URLs from YAML to find the URL of the latest version
$yamlUrl = $installerFile.download_url
$yamlContent = Invoke-RestMethod -Uri $yamlUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$yamlString = $yamlContent -join "`n"
$installerUrls = [regex]::Matches($yamlString, "InstallerUrl:\s+(http[^\s]+)") | ForEach-Object { $_.Groups[1].Value }
$installerUrl = $installerUrls[1]
- Downloads the YAML file as raw text.
- Extracts all InstallerUrl entries using regular expressions.
- Picks the URL using an index number.
# Output
PS C:\> $installerUrl
https://installer.teams.static.microsoft/production-windows-x64/25163.3611.3774.6315/MSTeams-x64.msix
6. Download the installer
$webClient = [System.Net.WebClient]::new()
$webClient.DownloadFile($installerUrl, "$env:TEMP\MSTeams.msix")
$teambootstrapperUrl = 'https://go.microsoft.com/fwlink/?linkid=2243204&clcid=0x409'
$webClient.DownloadFile($teambootstrapperUrl, "$env:TEMP\teamsbootstrapper.exe")
- Downloads the installer to the Windows temp folder ($Env:Temp)
7. Install Microsoft Teams silently
& "$env:TEMP\teamsbootstrapper.exe" -p -o "$env:TEMP\MSTeams.msix"
- Runs the installer in silent mode, no user interaction.
8. Clean up the installer and notify to user
Remove-Item -Path "$env:TEMP\MSTeams.msix" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$env:TEMP\teamsbootstrapper.exe" -Force -ErrorAction SilentlyContinue
Write-Host "Microsoft Teams installation completed."
- Deletes the installer after installation to keep the system clean.
- Outputs a message to confirm the installation status.
How to install using PowerShell
To install the app, simply open PowerShell as an administrator, copy the code snippets below, paste them into the PowerShell window, and press .
# Define the GitHub API URL for the app manifests in winget-pkgs.
$apiUrl = "https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/m/Microsoft/Teams"
# Fetch version folders then filter only version folders.
$versions = Invoke-RestMethod -Uri $apiUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$versionFolders = $versions | Where-Object { $_.type -eq "dir" }
# Extract and sort version numbers to get the latest version.
$sortedVersions = $versionFolders | ForEach-Object { $_.name } | Sort-Object {[version]$_} -Descending -ErrorAction SilentlyContinue
$latestVersion = $sortedVersions[0]
Write-Host "Latest Microsoft Teams version: $latestVersion."
# Get contents of the latest version folder to find the .installer.yaml file.
$latestApiUrl = "$apiUrl/$latestVersion"
$latestFiles = Invoke-RestMethod -Uri $latestApiUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$installerFile = $latestFiles | Where-Object { $_.name -like "*.installer.yaml" }
# Download and parse YAML content to get the Url of the latest installer file.
$yamlUrl = $installerFile.download_url
$yamlContent = Invoke-RestMethod -Uri $yamlUrl -Headers @{ 'User-Agent' = 'PowerShell' }
$yamlString = $yamlContent -join "`n"
$installerUrls = [regex]::Matches($yamlString, "InstallerUrl:\s+(http[^\s]+)") | ForEach-Object { $_.Groups[1].Value }
$installerUrl = $installerUrls[1]
Write-Host "Downloading installer from: $installerUrl"
# Download the latest installer to the temp folder.
$webClient = [System.Net.WebClient]::new()
$webClient.DownloadFile($installerUrl, "$env:TEMP\MSTeams.msix")
$teambootstrapperUrl = 'https://go.microsoft.com/fwlink/?linkid=2243204&clcid=0x409'
$webClient.DownloadFile($teambootstrapperUrl, "$env:TEMP\teamsbootstrapper.exe")
# Start the install process.
& "$env:TEMP\teamsbootstrapper.exe" -p -o "$env:TEMP\MSTeams.msix"
# Delete the downloaded installer file.
Remove-Item -Path "$env:TEMP\MSTeams.msix" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$env:TEMP\teamsbootstrapper.exe" -Force -ErrorAction SilentlyContinue
Write-Host "Microsoft Teams installation completed."
Installing using a PowerShell script
Alternatively, you can create a PowerShell script using the code snippet above. For instance, I’ve created and save a script at “C:\Scripts\install.ps1″.
Next, open PowerShell (or Terminal) as an administrator and execute the PowerShell script using either the call operator or dot notation.
& "C:\Scripts\install.ps1"
# Output
PS C:\> & "C:\Scripts\install.ps1"
Latest Microsoft Teams version: 25163.3611.3774.6315.
Downloading installer from: https://installer.teams.static.microsoft/production-windows-x64/25163.3611.3774.6315/MSTeams-x64.msix
{
"success": true
}
Microsoft Teams installation completed.
PowerShell execution policy
Root cause: The Windows PowerShell execution policy is designed to block untrusted scripts from impacting your Windows client environment. These policies act as security settings that define the trust level for scripts executed in PowerShell. On client operating systems, the default execution policy is set to Restricted, which stops Windows PowerShell commands and scripts from running.
To fix the issue, adjust the execution policy by running the following command:
Set-ExecutionPolicy RemoteSigned
You’ll encounter a security risk warning. Enter “A” when prompted to continue.
PS C:\> Set-ExecutionPolicy RemoteSigned
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy
might expose you to the security risks described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): A
PS C:\>
PS C:\> Get-ExecutionPolicy
RemoteSigned
Use Cases
- Automated software deployment
- Scheduled automatic updates
- Silent install for non-technical users
- Alternative to winget or manual downloads