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

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.130 Microsoft Edgeの更新も自動化したい|どうする!?残る閉域網の更新管理(5)

 

 

vol.130 Microsoft Edgeの更新も自動化したい|どうする!?残る閉域網の更新管理(5)

2025年08月21日配信
2025年08月21日更新
執筆者:山内 和朗

 これまでは、共有フォルダーを介してWindowsの更新プログラムパッケージ(MSU)をクローズドネットワーク(閉域網)のデバイスやサーバーに展開する運用の省力化に挑戦してきましたが、今回は同様の仕組み、つまり共有フォルダーを介したMicrosoft Edgeの更新に挑戦します。

 

共有フォルダーを介してMicrosoft Edgeを更新する

 

 Windows 10/11やWindows Server 2022以降にはMicrosoft Edgeが標準搭載されており、インターネットアクセスがあればMicrosoft Edge Updateによって自動更新されます。しかし、クローズドネットワーク(閉域網)に配置されたデバイスやサーバーは、その更新を受けることができません。そこで、前回(vol.129)までのWindowsの更新プログラムと同じように、最新のMicrosoft Edgeのインストーラーを共有フォルダーに配置しておいて、PowerShellスクリプトで更新することを考えました。
 
 Microsoft Edgeは以下のURLからダウンロードすることもできます。
 
 
 今回は、Microsoft Edge WebView2ランタイムの更新にも対応します。WebView2ランタイムは、以下のURLからダウンロード(エバーグリーンスタンドアロンインストーラー)することができます。

WebView2 ランタイムをダウンロードする  |Microsoft Edge Developer(Microsoft)

 次のPowerShellスクリプト「appupdate.ps1」は、次のように実行することで、指定したUNCパスに存在するWindowsインストーラーパッケージ(MSI)をサイレントインストールします。Windowsインストーラーパッケージ(MSI)であれば、Microsoft Edge以外のアプリの更新にも使用できる可能性があります。また、おまけとして、Microsoft Edge WebView2ライブラリのインストーラー(EXE)にも対応しています(画面1、画面2)。なお、WebView2ライブラリ以外のインストーラー(EXE)は想定していません。
 
PS C:\tools> .\appupdate.ps1 -PackageDir "<インストールパッケージ(MSI)の保存場所のUNCパス>" 

 

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

Param($PackageDir)
if ($PSBoundParameters.Count -ne 1) { Write-Output "Error: -PackageDir <path>" ;exit 1}
If ( -not (Test-Path $packagedir)) { Write-Output "Error: -PackageDir <path> does not exist." ;exit 1}

$packages = (Get-ChildItem -Path $packagedir| where {$_.extension -eq ".msi"} | Sort Name | %{$_.FullName})

$success = $true
if ($packages.Count -gt 0){
Write-Output "Installation of updates (msi) is starting... "
foreach ($package in $packages){
Start-Process msiexec.exe -Wait -ArgumentList "/i $package /qn"
if (!($LASTEXITCODE -eq 0)) {
$success = $false
$package = "+ " + (Get-Item $package).Name + ": Failed"
} else {
$package = "+ " + (Get-Item $package).Name + ": Success"
}
Write-Output $package
}
Write-Output "Finished installing updates."
if ($success) {
Write-Output "Info: All updates were successfully installed."
} else {
Write-Output "Info: There are failed updates."
}
} else {
Write-Output "There are no app updates (msi)."
}

$packages = (Get-ChildItem -Path $packagedir| where {$_.extension -eq ".exe"} | Sort Name | %{$_.FullName})

$success = $true
if ($packages.Count -gt 0){
Write-Output "Installation of updates (exe) is starting... "
foreach ($package in $packages){
Copy-Item $package -Destination "$env:TEMP\myinstaller.exe" -Force
Start-Process "$env:TEMP\myinstaller.exe" -Wait -ArgumentList "/silent /install"
if (!($LASTEXITCODE -eq 0)) {
$success = $false
$package = "+ " + (Get-Item $package).Name + ": Failed"
} else {
$package = "+ " + (Get-Item $package).Name + ": Success"
}
}
Write-Output "Finished installing updates."
if ($success) {
Write-Output "Info: All updates were successfully installed."
} else {
Write-Output "Info: All updates were successfully installed."
}
} else {
Write-Output "There are no app updates (exe)."
}
exit 0

 

画面1 PowerShellスクリプト「appupdate.ps1」を実行して、共有フォルダーからMicrosoft EdgeとWebView2の更新バージョンをインストールする

画面1 PowerShellスクリプト「appupdate.ps1」を実行して、共有フォルダーからMicrosoft EdgeとWebView2の更新バージョンをインストールする

 

vol128_scr02
画面2 インストールが成功すると、Microsoft EdgeとWebView2のバージョンが更新された(使用したスクリプトは後述のログ出力版)

 

 今回のスクリプトのポイントは、MSIパッケージはmsiexec.exeの引数として、パッケージのUNCパスをそのまま渡しているのに対して、EXEのインストールはローカルにEXEをコピーしてから、そのコピーを実行してサイレントインストールしているところです。UNCパスは信頼されない場所(例えばIPアドレス指定はインターネットゾーンとして識別)とSmartScreenなどで判断されると実行がブロックされるため、ローカルにコピーしているのはその対策です。

 

・・・

#MSIパッケージのインストール

  foreach ($package in $packages){
    Start-Process msiexec.exe -Wait -ArgumentList "/i $package /qn"
    if (!($LASTEXITCODE -eq 0)) {
      #インストール失敗

    } else {

      #インストール成功

    }
  }

・・・

#EXEのインストール

  foreach ($package in $packages){
    Copy-Item $package -Destination "$env:TEMP\myinstaller.exe" -Force
    Start-Process "$env:TEMP\myinstaller.exe" -Wait -ArgumentList "/silent /install"
    if (!($LASTEXITCODE -eq 0)) {
      #インストール失敗

    } else {

      #インストール成功

    }
  }

・・・

 

 今回も前回と同様に、ログ出力版を用意しました。ログ出力版を使用することで、ログオンしているかどうかにかかわらずタスクを実行してMicrosoft Edgeを更新し、その履歴を共有フォルダー上のログで確認することができます。なお、サブディレクトリの最初のインストーラーファイルが、ログファイルの日時よりも古い日時の場合、インストール済みと見なしてすべてをスキップします。また、更新前後にMicrosoft Edgeのバージョン情報をログに出力する処理も追加しました(画面2は追加前のスクリプト)。

 

PS C:\tools> .\appupdate.ps1 -PackageDir "<インストールパッケージ(MSI)の保存場所のUNCパス>"  -LogDir "<ログ出力先のUNCパス>"

 

[appupdate.ps1(ログ出力付き)]プレーンテキストで表示)

Param($PackageDir, $LogDir)
if ($PSBoundParameters.Count -ne 2) { Write-host "Error: -PackageDir <path> -LogDir <Path>" ;exit 1}
If ( -not (Test-Path $packagedir)) { Write-host "Error: -PackageDir <path> does not exist." ;exit 1}
If ( -not (Test-Path $LogDir)) { Write-host "Error: -LogDir <path> does not exist." ;exit 1}

function Write-Log {
param (
[string]$Message,
[string]$LogPath = "$env:TEMP\onlinepatch.log"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$entry = "[$timestamp] $Message"
Add-Content -Path $LogPath -Value $entry
}

$LogPath = "$LogDir\$(hostname)_appupdate.log"
if (Test-Path $logPath) {
$logTime = (get-item $logPath).LastWriteTime
} else {
$logTime = get-Date("1900/1/1")
}

Write-Log -Message "Start appupdate.ps1" -LogPath $LogPath

$edgever = (Get-ItemProperty "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe").VersionInfo.ProductVersion
#$edgever = (Get-AppXPackage Microsoft.MicrosoftEdge.Stable).Version
Write-Log -Message "Info: Current Edge Version: $($edgever)" -LogPath $LogPath

$packages = (Get-ChildItem -Path $packagedir| where {$_.extension -eq ".msi"} | Sort Name | %{$_.FullName})

$success = $true
if ($packages.Count -gt 0){
foreach ($package in $packages){
if ((get-item $package).LastWriteTime -lt $logTime) {
$outmsg = "It was already installed."
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath
exit 0
}
}
$outmsg = "Installation of updates (msi) is starting... "
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath
foreach ($package in $packages){
Start-Process msiexec.exe -Wait -ArgumentList "/i $package /qn"
if (!($LASTEXITCODE -eq 0)) {
$success = $false
$package = "+ " + (Get-Item $package).Name + ": Failed"
} else {
$package = "+ " + (Get-Item $package).Name + ": Success"
}
Write-Output $package
Write-Log -Message $package -LogPath $LogPath
}
$outmsg = "Finished installing updates."
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath
if ($success) {
$outmsg = "Info: All updates were successfully installed."
$edgever = (Get-ItemProperty "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe").VersionInfo.ProductVersion
Write-Log -Message "Info: New Edge Version: $($edgever)" -LogPath $LogPath
} else {
$outmsg = "Info: There is a failed update."
}
} else {
$outmsg = "There are no app updates (msi)."
}
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath

$packages = (Get-ChildItem -Path $packagedir| where {$_.extension -eq ".exe"} | Sort Name | %{$_.FullName})

$success = $true
if ($packages.Count -gt 0){
$outmsg = "Installation of updates (exe) is starting... "
Write-Log -Message $outmsg -LogPath $LogPath
foreach ($package in $packages){
Copy-Item $package -Destination "$env:TEMP\myinstaller.exe"
Start-Process "$env:TEMP\myinstaller.exe" -Wait -ArgumentList "/silent /install"
if (!($LASTEXITCODE -eq 0)) {
$success = $false
$package = "+ " + (Get-Item $package).Name + ": Failed"
} else {
$package = "+ " + (Get-Item $package).Name + ": Success"
}
Write-Output $package
Write-Log -Message $package -LogPath $LogPath
Remove-Item "$env:TEMP\myinstaller.exe"
}
$outmsg = "Finished installing updates."
Write-Log -Message $outmsg -LogPath $LogPath
if ($success) {
$outmsg = "Info: All updates were successfully installed."
} else {
$outmsg = "Info: There are failed updates."
}
} else {
$outmsg = "There are no app updates (exe)."
}
Write-Log -Message $outmsg -LogPath $LogPath
exit 0

 

 ちなみに、Microsoft Edgeのバージョンは、次のいずれかの方法で取得することができます。 
 
PS C:\> (Get-ItemProperty "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe").VersionInfo.ProductVersion
PS C:\> (Get-AppXPackage Microsoft.MicrosoftEdge.Stable).Version

 

Microsoft 365 Appsの閉域網でのデプロイについて

 

 Microsoft 365 AppsおよびMicrosoft Office製品については、Microsoftが無料提供している「Office Deployment Tool(ODT)」を使用することで、インストールおよび更新ソースを共有フォルダー上に作成し、クローズドネットワーク(閉域網)のデバイスにアプリのインストールや更新をデプロイ(アプリの更新機能が共有フォルダー上の更新ソースを使用します)することができます。詳しくは、ODTのドキュメントで確認してください。この方法は、C2R(クリック実行版)のOfficeに切り替わったOffice 2016の頃から利用できる方法です。ただし、ODTは頻繁にアップデートされているので最新版を利用してください。

 

Office Deployment Tool|Download Center(Microsoft)
Overview of the Office Deployment Tool|Microsoft 365(Microsoft Learn)

 

 ODTを使用すれば閉域網でも最新バージョンに更新できますが、Microsoft 365 Appsはライセンス認証や特定の機能の利用にインターネットアクセスを必要とすることに注意してください。サブスクリプションライセンスおよび最新の買い切りライセンスは、ライセンス認証のためにアクティブ化時、および定期的(30日に1回)にインターネットアクセスが必要です。ライセンスの有効性が確認されない場合、機能が制限されます。拡張オフラインアクセスを使用することで、最大6か月間、アクティブ化の状態を維持することは可能です。Office LTSC製品であれば、KMSやMAKキーによるライセンス認証が可能です。

 

Microsoft 365 Appsの拡張オフライン アクセスの概要|Microsoft 365(Microsoft Learn)

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

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事