Microsoft

ARM64版のGlobal Secure Access (GSA)をアプリ配布する手順

こんにちは!吉田です。
今回は以前紹介した、Global Secure Access (GSA)のARM64版をIntuneでインストーラーをアプリ配布する手順について解説していきたいと思います。
以前のブログはこちら↓
Global Secure Access (GSA) と条件付きアクセスの連携についてのざっくり解説 | ATD InnoSolutions

前提条件

前提としてARM64のデバイスでは、標準のx64インストーラーを使用することができません。なのでARM64専用のクライアントツールをインストールする必要があります。
もしARM64に標準のインストーラーをアプリ配布してしまった場合、以下のようなエラーが表示されます。
このエラーが表示された方はこれから解説する手順をお試しください。

Intunewinファイルの作成

①インストーラーのインストール

まずはintunewinファイルを配布するために以下のリンクからインストーラーをインストールします。
以下のMicrosoft Learnの前提条件の箇所に以下の記載がありますので、そのリンクをクリックしダウンロードを開始してください。
Windows 用グローバル セキュリティで保護されたアクセス クライアント – Global Secure Access | Microsoft Learn

Arm デバイス上の Windows (Surface Pro や Surface Laptop と Snapdragon プロセッサを搭載) には、 https://aka.ms/GlobalSecureAccess-WindowsOnArmで使用できる別のクライアント インストーラーが必要です。 Arm64 デバイスで標準の x64 インストーラーを使用しないでください。

②Powershellスクリプト

以下のPowershellスクリプトをデバイスにps1ファイルとして保存します。
このスクリプトによって、Global Secure Access(ARM64版)のクライアントのサイレントインストールと、必要に応じてIPv4を優先する設定を行い、処理結果をログとして記録します。
また、インストール後に再起動が必要かどうか判定することも可能です。

# Create log directory and log helper
$logFile = "$env:ProgramData\GSAInstall\install.log"
New-Item -ItemType Directory -Path (Split-Path $logFile) -Force | Out-Null

function Write-Log {
    param([string]$message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $logFile -Value "$timestamp - $message"
}

try {
    $ErrorActionPreference = 'Stop'
    Write-Log "Starting Global Secure Access client installation."

# IPv4 preferred via DisabledComponents registry value
    $ipv4RegPath    = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters"
    $ipv4RegName    = "DisabledComponents"
    $ipv4RegValue   = 0x20  # Prefer IPv4 over IPv6
    $rebootRequired = $false

# Ensure the key exists
    if (-not (Test-Path $ipv4RegPath)) {
        New-Item -Path $ipv4RegPath -Force | Out-Null
        Write-Log "Created registry key: $ipv4RegPath"
    }

# Get current value if present
    $existingValue = $null
    $valueExists = $false
    try {
        $existingValue = Get-ItemPropertyValue -Path $ipv4RegPath -Name $ipv4RegName -ErrorAction Stop
        $valueExists = $true
    } catch {
        $valueExists = $false
    }

# Determine if we must change it
    $expected = [int]$ipv4RegValue
    $needsChange = -not $valueExists -or ([int]$existingValue -ne $expected)

if ($needsChange) {
        if (-not $valueExists) {
            # Create as DWORD when missing
            New-ItemProperty -Path $ipv4RegPath -Name $ipv4RegName -PropertyType DWord -Value $expected -Force | Out-Null
            Write-Log ("IPv4Preferred value missing. Created '{0}' with value 0x{1} (dec {2})." -f $ipv4RegName, ([Convert]::ToString($expected,16)), $expected)
        } else {
            # Update if different
            Set-ItemProperty -Path $ipv4RegPath -Name $ipv4RegName -Value $expected
            Write-Log ("IPv4Preferred value differed. Updated '{0}' from 0x{1} (dec {2}) to 0x{3} (dec {4})." -f $ipv4RegName, ([Convert]::ToString([int]$existingValue,16)), [int]$existingValue, ([Convert]::ToString($expected,16)), $expected)
        }
        $rebootRequired = $true
    } else {
        Write-Log ("IPv4Preferred already set correctly: {0}=0x{1} (dec {2}). No change." -f $ipv4RegName, ([Convert]::ToString($expected,16)), $expected)
    }

# Resolve installer path
    $ScriptRoot = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }
    $installerPath = Join-Path -Path $ScriptRoot -ChildPath "GlobalSecureAccessClient.exe"
    Write-Log "Running installer from $installerPath"

if (Test-Path $installerPath) {
        $installProcess = Start-Process -FilePath $installerPath -ArgumentList "/quiet" -Wait -PassThru

if ($installProcess.ExitCode -eq 1618) {
            Write-Log "Another installation is in progress. Exiting with code 1618."
            exit 1618
        } elseif ($installProcess.ExitCode -ne 0) {
            Write-Log "Installer exited with code $($installProcess.ExitCode)."
            exit $installProcess.ExitCode
        }

Write-Log "Installer completed successfully."
    } else {
        Write-Log "Installer not found at $installerPath"
        exit 1
    }

if ($rebootRequired) {
        Write-Log "Reboot required due to registry value creation or update."
        exit 3010  # Soft reboot required
    } else {
        Write-Log "Installation complete. No reboot required."
        exit 0
    }
}
catch {
    Write-Log "Fatal error: $_"
    exit 1603
}

③Intunewinファイルの作成

ダウンロードした exe ファイルと保存したps1ファイルを Intune で配布可能な形式 (.intunewin パッケージ) に変換します。
フォルダーにps1ファイルとインストーラーを配置します。

そしてMicrosoft 提供の Win32 コンテンツ準備ツール (IntuneWinAppUtil.exe) を実行し、exe をパッケージ化します
Win32 アプリを追加し、Microsoft Intune に割り当てる | Microsoft Learn
実行したら以下の内容を入力し、Intunewinファイルを作成します。

Please specify the source folder: ps1ファイルとインストーラーを配置したフォルダーのパス
Please specify the setup file: ps1ファイルのパス
Please specify the output folder: intunewinファイルを配置するフォルダーのパス
Do you want to specify catalog folder(Y/N)?: N

アプリを配布する

  1. Intune管理センターにアクセスします。
  2. [アプリ]>[すべてのアプリ]>[作成] を選択します。
  3. [アプリの種類の選択] の [その他]>[Windows アプリ (Win32)] を選択します。
  4. ①アプリ情報で、[アプリ パッケージ ファイルの選択] で作成したIntunewinファイルを選択します。名前と説明を入力し、次へ進みます。
  5. ②プログラムで、以下の内容を設定します。
    インストールコマンド:powershell.exe -ExecutionPolicy Bypass -File [ps1ファイルの名前].ps1
    アンインストールコマンド:”GlobalSecureAccessClientArm64.exe” /uninstall /quiet /norestart
    利用可能なアンインストールを許可します: いいえ
    インストールの処理: システ
    デバイスの再起動: リターンコードを基に動作を決定する
  1. ③必要条件で、以下の内容を設定します。
    ・オペレーティングシステムのアーキテクチャを確認する:はい。アプリをインストールできるシステムを指定してください。
    ARM64システムにインストールするを選択。
    ・最小のオペレーティングシステム:Windows 10 1607
  1. ④検出規則で、以下の内容を設定します。
    ・規則の種類:ファイル
    ・パス:C:\Program Files\Global Secure Access Client\TrayApp
    ・ファイルまたはフォルダー:GlobalSecureAccessClient.exe
    ・検出方法:ファイルまたはフォルダーが存在する
  1. 割り当てるグループを選択し、作成をクリックします。

しばらくすると対象のデバイスにIntuneから通知がきてインストールが開始されます。
再起動が必要という通知が届いた場合、再起動することでインストールが完了します。

いかがでしたか?最近話題のcopilot+pcにはARM64が使用されていることがほとんどなので、インストールできずにお困りの方は是非お試しください!

吉田 朝香

吉田 朝香

日々進化するIT技術を学びながら、Microsoft 365 の設計・構築を行っています。技術の話だけで終わらせず、お客様の「こうしたい」という気持ちを形にするお手伝いができたらと思っています。

TOP