かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  メモ. Microsoft Edgeインストーラーのダウンロード自動化の可能性を探る

 

 

メモ. Microsoft Edgeインストーラーのダウンロード自動化の可能性を探る

2025年09月23日配信
2025年09月26日更新
執筆者:山内 和朗

 連載「どうする!?残る閉域網の更新管理(2025年7月31日~、全6回)」では、共有フォルダーを介して、クローズドネットワーク(閉域網)にあるWindows Serverマシンにオフラインスキャン用のカタログ(wsusscn2.cab)と更新プログラム(MSU)を提供し、自動で更新プログラムをインストールする環境を構築しました。この仕組みを利用して、Microsoft EdgeとMicrosoft Defenderウイルス対策の定義の更新のインストールも自動化しました。定義の更新については、共有フォルダーへのダウンロードを含めて自動化しましたが、Microsoft EdgeおよびMicrosoft Edge WebView2 Runtimeについてはどうしても管理者が手動でダウンロードし、共有フォルダーに配置する必要がありました。その部分を自動化できないか、今回はその可能性を探ります。

どうする!?残る閉域網の更新管理(2025年7月31日~全6回、連載目次

 

EdgeとWebView2 RuntimeはMicrosoft Udpate Catalogからダウンロードでっきるけど...

 

 Microsoft EdgeとWebView2 Runtimeの更新プログラム(スタンドアロンインストーラー)は、Microsoft Update Catalogでも公開されています(例、https://catalog.update.microsoft.com/Search.aspx?q=139.0.3405.119)。しかし、これらはWindows Server Update Services(WSUS)やMicrosoft Configuration Managerで展開するように設計されているということが、Microsoft Update Catalogの「更新プログラムの詳細」ページで説明されています(画面1)。そのため、これらの更新プログラムをダウンロードして、手動でインストールしようとしても、EdgeのCABファイル(DISM /Online /AddPavckage /PackagePath:<CABファイルのパス>やAdd-WindowsPackage -Online -PachagePath <CABファイルのパス>)はエラー「0x80070002」で、WebView2 RuntimeのスタンドアロンインストーラーEXEは「不明なエラー」で失敗しました。ちなみに、Microsoft Update CatalogサイトではMicrosoft 365 Appsの更新プログラムもダウンロードできますが、こちらはWSUSでの展開用には設計されておらず、Microsoft Configuration Managerを使用して展開するためのものです。

 

画面1 Microsoft Update CatalogからダウンロードできるEdgeやWebView2は、WSUSやMicrosoft Configuration Managerによる展開用
画面1 Microsoft Update CatalogからダウンロードできるEdgeやWebView2は、WSUSやMicrosoft Configuration Managerによる展開用

 

Edgeのダウンロードリンクを取得する2つのサンプルスクリプト

 

 Microsoft Edgeのインストーラーをダウンロードする2つのサンプルスクリプトを作成してみました。どちらもMicrosoft提供の情報が正確でタイムリーであることが前提であるため(以前、一定期間、Microsoft Edge for Enterpriseのダウンロードサイトの情報が誤っていたことがありました)、信頼性に不安があり、実用には向かないかもしれません。また、利用しているAPIやサイトに完全に依存しているため、それらが非公開になったり、仕様が変更されると機能しなくなります。

 1つ目のサンプルスクリプト「get-msedgebiz.ps1」は、Microsoft Edgeのリリースに関する方法を提供するMicrosoft EdgeのAPI「https://edgeupdates.microsoft.com/api/products?view=enterprise」を使用したスクリプトです。このAPIは、Microsoft Configuration ManagerがMicrosoft Edgeを展開するためにアクセスできる必要があるエンドポイントの1つとして案内されているだけで、使い方などは説明されていません。しかし、APIを利用するのに特別な処理(認証トークンの取得など)は何も必要なく、単純にWebブラウザーでこのURLにアクセスするだけで、JSONデータが返ってくるので、比較的簡単にスクリプト化できます。

Microsoft Edge 管理|Configuration Manager(Microsoft Learn)

 このスクリプトをパラメーターなしで実行すると、APIから取得できるすべての情報(Channel、Version、Platform、Architecture、Url、Hash、HashAlgorithm、SiteInBytes、PublishedTime)を返します。パラメータとしては、-Channel(Dev/Beta/Stable/Policy《ポリシーテンプレート》など)、-Platform(Windows|MacOS|Linux)、-Architecture(x86|x64|arm64) -Version(x.x.x.x|Current《最新》)を指定できます。使い方や使用例を確認するには、Get-Help .\get-msedgebiz.ps1 -fullで確認することができます。例えば、次のコマンドラインを実行すると、Windows x64向けStable(安定版)の最新バージョンの情報を取得できます(画面2)。

 

.\get-msedgebiz.ps1 -Channel "Stable" -Platform "Windows" -Architecture "x64" -Version "Current"

 

画面2 Windows x64向けStable(安定版)の最新バージョンのダウンロードリンクを取得

画面2 Windows x64向けStable(安定版)の最新バージョンのダウンロードリンクを取得

 

[get-msedgebiz.ps1]プレーンテキストで表示)

<#
.SYNOPSIS
PowerShell script to get infomation of Microsoft Edge for Enterprise.

.DESCRIPTION
This script use non public of Microsoft Edge for Enterprise release infomation, and get available udpates information.

.INPUTS
The script takes Channel, Platform, Windows, Archtecture, Version.

.OUTPUTS
return table

.EXAMPLE
# Get download info of Microsoft Edge Stable current version for Windows x64.
.\get-msedgebiz.ps1 -Channel "Stable" -Platform "Windows" -Architecture "x64" -Version "Current"

.EXAMPLE
# Get download info of Microsoft Edge Stable current version for Windows x64 , and download it.
$result = .\get-msedgebiz.ps1 -Channel "Stable" -Platform "Windows" -Architecture "x64" -Version "Current"
$filename = Split-Path $result.Url -Leaf
curl.exe -L --fail --retry 3 --retry-delay 2 -o (Join-Path $env:userprofile\downloads $filename) $result.Url
or
$ProgressPreference = 'SilentlyContinue' ; Invoke-WebRequest -Uri $result.Url -OutFile (Join-Path $env:userprofile\downloads $filename) ; $ProgressPreference = 'Continue'

.NOTES
This script is a sample. Use it at your own risk.

#>

param (
[string]$Channel = "*", #Dev|Beta|Stable|EdgeUpdate|Policy|*(default)
[string]$Platform = "*", #Windows|MacOS|Linux|*(default)
[string]$Architecture = "*", #x64|x86|arm64|*(default)
[string]$Version = "*" #Current|x.x.x.x|*(default)
)

$msedgebizapi = "https://edgeupdates.microsoft.com/api/products?view=enterprise"
$ret = Invoke-RestMethod -uri $msedgebizapi
$rows = foreach ($product in $ret) {
foreach($release in $product.Releases) {
foreach($artifact in $release.Artifacts) {
[pscustomobject]@{
Channel = $product.Product
Version = $release.ProductVersion
Platform = $release.Platform
Architecture = $release.Architecture
Url = $artifact.Location
Hash = $artifact.Hash
HashAlgorithm = $artifact.HashAlgorithm
SizeInBytes = $artifact.SizeInBytes
PublishedTime = $release.PublishedTime
}
}
}
}
if ($rows.Count -ne 0) {
if ($Version -eq "Current") {
$rows | Where { ($_.Channel -like $Channel) -and ($_.Platform -like $Platform) -and ($_.Architecture -like $Architecture) } |Sort-Object @{ Expression = { [version]$_.Version } } -Descending |Select-Object -First 1
} else {
$rows | Where { ($_.Channel -like $Channel) -and ($_.Platform -like $Platform) -and ($_.Architecture -like $Architecture) -and ($_.Version -like $Version)} |Sort-Object @{ Expression = { [version]$_.Version } } -Descending
}
} else {
Write-Host "Error: something went wrong!"
}
 

 

 スクリプトの内容の詳細についての説明は省きますが、スクリプト作成時に悩み、解決するまでかなりの時間を要したところを1点だけ紹介します。それは、最新バージョンを取得するためのバージョン値「x.x.x.x(Major.Minor.Buld.Revision)」によるソート(並べ替え)の処理です。何も考えずにSort-Objectでソートすると、PowerShellはバージョン値を文字列として比較するため、予期しない結果になることがあります。しかも、Windows PowerShell 5.1とPowerShell 7.xで異なる結果になることもありました。この問題は、.NETのVersion型に変換(キャスト)してソートすることで(get-msedgebiz.ps1の赤字部分)期待通りの結果を得られました(画面3)

 

画面3 Version値によるソートには注意。単にVersionでソートすると、文字列としての比較になるため期待どおりにソートされない
画面3 Version値によるソートには注意。単にVersionでソートすると、文字列としての比較になるため期待どおりにソートされない

 もう1つのサンプルスクリプト「get-msedgebizwin.ps1」は、Windows向けStable版の最新バージョン限定のスクリプトです。このスクリプトを作成したのは、当初、Microsoft EdgeのAPIが正式なものかどうか判断できなかったため、別のアプローチを検討する中で作ったものです。このスクリプトは、Microsoft Edge for Enterpriseのダウンロードサイト(https://www.microsoft.com/en-us/edge/business/download)をWebスクレイピングして最新バージョンのインストーラー(.msi)のダウンロードURLを取得します。このスクリプトをパラメーターなしで実行すると、3つのアーキテクチャの情報を取得します。-Architectureパラメーター(x64|x86|arm64)を指定すると、指定したアーキテクチャの情報のみを取得します(画面4)。

 

画面4 Microsoft Edge for EnterpriseのダウンロードサイトのWebスクレイピングによりWindows x64向けStable最新バージョンのダウンロードリンクを取得
画面4 Microsoft Edge for EnterpriseのダウンロードサイトのWebスクレイピングによりWindows x64向けStable最新バージョンのダウンロードリンクを取得

 Microsoft Edge for Enterpriseのダウンロードサイトのページでは、Windows以外のプラットフォームや過去のバージョン、ビルドのインストーラーもダウンロードできるようにないるため、すべてを正しく抽出するのは困難です。そこで、Windows(x86、x64、arm64)のStable版の最新バージョンのみに対応することでコードをシンプルにしました。こちらもスクリプトの内容について詳しく説明しませんが、ページソースを見て出現パターンを見つけ出しコード化したものです。MicrosoftEdgePolicyTemplates.cabのダウンロードURLの直前の値に最新バージョンが存在し、各アーキテクチャごとの.msiのダウンロードURLの直前に値、プラットフォームの種類(Windows-x64、Windows-x86、Windows-arm64)が存在することに注目しました。

 

[get-msedgebizwin.ps1]プレーンテキストで表示)

<#
.SYNOPSIS
PowerShell script to get infomation of Microsoft Edge for Enterprise for Windows from Download Site (https://www.microsoft.com/en-us/edge/business/download) .

.DESCRIPTION
This script use Microsoft Edge for Enterprise download site source page, and get available udpates information.

.INPUTS
The script takes Architecture (x86/x64/arm64)

.OUTPUTS
return table

.EXAMPLE
# Get download info of Microsoft Edge Stable current version for Windows x64, x86 and arm64
.\get-msedgebizwin.ps1

.EXAMPLE
# Get download info of Microsoft Edge Stable current version for Windows x64 , and download it.
$result = .\ get-msedgebizwin.ps1 -Architecture "x64"
$downloadurl = $result.Url
$filename = $result.FileName
curl.exe -L --fail --retry 3 --retry-delay 2 -o (Join-Path $env:userprofile\downloads $filename) $downloadurl
or
$ProgressPreference = 'SilentlyContinue' ; Invoke-WebRequest -Uri$downloadurl -OutFile (Join-Path $env:userprofile\downloads $filename) ; $ProgressPreference = 'Continue'

.NOTES
This script is a sample. Use it at your own risk.

#>
param (
[string]$Architecture = "*" #x64|x86|arm64|*(default)
)
$ret = Invoke-WebRequest -uri "https://www.microsoft.com/en-us/edge/business/download"
if ($ret.StatusCode -ne 200) {
Write-Host "Error: HTTP Error"
return
}
$html = $ret.Content

$pattern = '"(?<version>\d+\.\d+\.\d+\.\d+)"\s*,\s*"(?<url>https:[^"]*MicrosoftEdgePolicyTemplates\.cab)"'

$vers = [regex]::Matches($html, $pattern)|
ForEach-Object {
[pscustomobject]@{
Version = "$($_.Groups['version'].Value)"
Url = $_.Groups['url'].Value
}
}

$currentver = ($vers | Select-Object -First 1).Version

$pattern = '"windows-(?<arch>x64|x86|arm64)"\s*,\s*"(?<url>https:[^"]+?\.msi)"'

$urls = [regex]::Matches($html, $pattern) |
ForEach-Object {
[pscustomobject]@{
Version = $currentver
Architecture = $_.Groups['arch'].Value
FileName = (Split-Path ($_.Groups['url'].Value) -Leaf)
Url = $_.Groups['url'].Value
}
}

$urls | Where { $_.Architecture -like $Architecture }

 

 更新プログラムのダウンロードリンクを取得できれば、あとはcurl.exeコマンドまたはInvoke-WebRequestコマンドレットを使用して、ダウンロードを実施することができます(画面5)。このコードをスクリプト化してタスクスケジューラーなどで自動ダウンロードさせることで、共有フォルダー上のMicrosoft Edgeのインストーラーを常に最新の状態に維持することが可能です。ダウンロード用スクリプトの例はこちら(download-msedgebiz.ps1)。

 

$ret = .\get-msedgebizuri.ps1 -Channel "Stable" -Platform "Windows" -Architecture "x64" -Version "Current"
(または $ret = .\get-msedgebizwin.ps1 -Architecture "x64")
$downloadurl = $ret.Url
$filename = Split-Path $downloadurl -Leaf
Invoke-WebRequest -uri $downloadurl -OutFile (Join-Path $env:userprofile\downloads $filename)

 

memo56_scr05

画面5 get-msedgebiz.ps1またはget-msedgebizwin.ps1でダウンロードURLを取得し、Invoke-WebRequest(またはcurl.exe)でダウンロード

 連載「どうする!?残る閉域網の更新管理」では、Microsoft EdgeとWebView2 Runtimeの両方のインストールに対応しましたが、今回のダウンロードスクリプトはMicrosoft Edge用です。WebView2 Runtimeのダウンロードには対応していません。WebView2 Runtimeのダウンロードサイト(https://developer.microsoft.com/ja-jp/microsoft-edge/webview2/)もWebスクレイピングしようと考えましたが、このページのソースを見る限り、オフライン環境向け(Microsoft CDN非依存)のエバーグリーンスタンドアロンインストラーのダウンロードURLが見当たらないため、断念しました。プログラムからダウンロードするためのブートストラップインストーラーのダウンロードリンクは取得できますが、これはオンライン環境(Microsoft CDNに依存します)を前提とした小さなインストーラーです。オンラインで自動更新できない閉域網のデバイスへのWebView2 Runtimeの展開は、手動でダウンロードして配布する、あるいはアプリケーションに固定(Fixed)バージョンをアプリケーションにパッケージ化して配布するのいずれかになると思います。ダウンロード用スクリプトの例(download-msedgebiz.ps1)では、Webブラウザーでダウンロードサイトを開くようにしています。

 

どうする!?残る閉域網の更新管理(1)(2)(3)(4)(5)(6)メモ|メモ

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事