UAM:Shell Appsの概要と使い方

多用途なShell Apps機能を使うと、統合アプリケーション管理(UAM)での展開向けに、複雑なスクリプトを用いた展開を作成できます。管理者は、PowerShell経由で複数のコンポーネントを展開し、検出スクリプト機能を使用して成功または失敗情報をUAMポリシーコンソールにレポートすることができます。

この機能は、大規模または複雑なアプリケーションでの使用、またはWinget経由での展開が実用的または望ましくない場合を想定しています。この機能はネイティブのPowerShellスクリプトを利用するため、必要に応じてインストールスクリプトの一部としてWinGetを呼び出すことができます。

Shell Apps機能を使用して展開されたアプリケーションは、デバイスのシステムコンテキスト内でのみ展開され、サービスアカウントの必要がありません。

この機能は Nerdio Manager

前提条件

PowerShellリモーティング(WSMan)は、ターゲットデバイスに有効にする必要があります。

制限事項

Shell Appsには、Secure Variablesを含む場合、Intuneデバイスに割り当てることはできません。

これはプレビュー機能であるため、以下に記載されている項目は現在利用できません。これらは今後のリリースで提供される予定です。

  • Secure Variables サポート :Scripted Actionsと同様に、Secure Variablesを利用すると、難読化された事前定義項目をスクリプトに組み込むことができます。

  • SCCM統合 :接続されたSCCM環境から、関連するバイナリ付きのスクリプトインストールを取り込む機能です。

はじめに

Nerdio Managerで、 アプリケーション > カタログ > Shell Appsに移動して、Shell Apps機能を操作します。統合アプリケーション管理詳細については、Shell Appsを管理してください。

  • Notepad ++ (.EXE) と 7-Zip (MSI) は、開始時に含まれています。

  • デプロイメントは、以下のスクリプトエリアに分割されます:検出、インストール、およびアンインストール。すべてのコンポーネントは、有効なアプリケーションパッケージを作るために必要です。

  • 各アプリケーションパッケージには、Publicとラベル付けされたスイッチが含まれています。これは、UAM統合カタログページ内でアプリケーションの可視性を制御します。スクリプト完了までは、このスイッチをオフのままにしてください。そうすることで、展開時の問題を回避できます。

以下のガイダンスを参照し、サンプルスクリプトの動作や、Shell Apps機能を使った独自アプリの展開方法を確認してください。

ファイルパッケージ

Shell Appsは、必要に応じてパッケージファイルをアップロードすることをサポートしています。これは、インストーラー ファイルを含めたい場合や、インストール処理でインターネット上からファイルをダウンロードしないようにしたい場合に便利です。UAMがサポートするすべてのアプリは、Shell Appsでのインストールにも対応します。

使用状況

アップロードされたインストーラーパッケージを使用している場合、これはスクリプトの一部として、組み込み変数$Context.GetAttachedBinary() を使用して呼び出すことができます。たとえば、添付されたインストーラーパッケージをインストールしたい場合、次のコマンドを使用できます:

Start-Process $Context.GetAttachedBinary() -Wait -ArgumentList "/S"

ZIPアーカイブのサポート

v6.2以降の Nerdio Manager

使用状況

Shell Appsの「ファイル」ページで.ZIPアーカイブをインポートする際に、追加の「解凍」オプションが利用可能です。選択された場合、スクリプトは自動的に圧縮ファイルをターゲットデスクトップのC:\Windows\Tempの一時フォルダーに抽出します。

抽出後、スクリプトのコンテキストは自動的に作成された一時ディレクトリに設定されるため、すべてのインストールタスクはスクリプト内で相対パスを使用して完了できます。たとえば、Shell AppsインストールスクリプトからファイルEXAMPLE.MSIを呼び出すには、インストール処理の一部として、コマンド.\EXAMPLE.MSIではなく、コマンド.\EXAMPLE.MSI(実際は「.\EXAMPLE.MSI」)を使用してください。必要に応じて引数を追加できます。さらに、変換などの他のファイルやタスクも相対パスから呼び出すことができます。

例:Notepad ++ (.EXE)

検出スクリプト

検出スクリプト機能では、特定の問い合わせに対して正または負の値を返すルールセットを作成できます。特定のアプリケーション(Notepad ++)のための検出スクリプトの例を以下に示します。

この例では、PowerShellスクリプトが特定のプログラムの存在を確認するために、そのインストールフォルダーとそのフォルダー内のプログラム実行可能ファイルの存在を検証することで効率的にチェックします。

 
$basePath = $env:ProgramFiles
$programFolderName = "Notepad++"
$programFolderFullPath = Join-Path $basePath $programFolderName
$programFolderExists = Test-Path $programFolderFullPath
if (!$programFolderExists) {
{
    return $false
}
$programFileName = 'notepad++.exe'
$programFileFullPath = Join-Path $programFolderFullPath $programFileName
return Test-Path $programFileFullPath
 
  1. <# Variables: 

    • $basePath:システム環境変数から取得したProgram Filesディレクトリのパスを格納します($env:ProgramFiles )。

    • $programFolderName :プログラムフォルダーの名前を指定します(この場合は「Notepad++」)。

    • $programFolderFullPath :$basePath と$programFolderNameをJoin-Path を使用して結合し、プログラムフォルダーの完全なパスを取得します。

  2. プログラムフォルダーの存在確認:

    $programFolderExists = Test-Path $programFolderFullPath
    if (!$programFolderExists) {
    {
        return $false
    }
    • Test-Path :指定されたパスにファイルまたはディレクトリが存在するかどうかを判断するために使用されるCmdlet。

    • $programFolderExists :プログラムフォルダーの存在チェックの結果を格納します。

    • プログラムフォルダーが存在しない場合(!$programFolderExists)、スクリプトは$falseを返し、プログラムがインストールされていないことを示します。

  3. プログラムファイルパスの構築:

    $programFileName = 'notepad++.exe'
    $programFileFullPath = Join-Path $programFolderFullPath $programFileName
    • $programFileName :プログラムの実行可能ファイルの名前を指定します。

    • $programFileFullPath:$programFolderFullPath と$programFileNameをJoin-Path を使用して結合し、プログラム実行可能ファイルのフルパスを取得します。

  4. プログラムファイルの存在確認:

    return Test-Path $programFileFullPath
    • 指定されたパスにプログラムの実行可能ファイルが存在するかどうかを確認します。

    • スクリプトはこの存在チェックの結果を返し、プログラムがインストールされているかどうかを示します($trueまたは$false)。

インストールスクリプト

インストールスクリプトは、アプリの展開を成功させるために必要なすべてのコンポーネントをインストールし、構成します。

この例では、PowerShellスクリプトがNotepad++のインストールを自動化し、インストーラーをダウンロードし、サイレントで実行し(/S引数)、その後クリーンアップします。

 
$basePath = $env:TEMP
$installerFolderName = "Notepad $(New-Guid)"
$installerFolderFullPath = Join-Path $basePath $installerFolderName
$installerFolderExists = Test-Path $installerFolderFullPath
if ($installerFolderExists) {
{
    Remove-Item $installerFolderFullPath -Recurse -Force -ErrorAction Stop
}
New-Item -Path $basePath -Name $installerFolderName -ItemType Directory -Force | Out-Null
$installerName = 'installer.exe'
$installerFullPath = Join-Path $installerFolderFullPath $installerName
$installerUrl = "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.6/npp.8.6.Installer.x64.exe"
Invoke-WebRequest -URI $installerUrl -OutFile $installerFullPath
Start-Process "$installerFullPath" -Wait -ArgumentList "/S"
Remove-Item $installerFolderFullPath -Recurse -Force $Context.Log('Install script completed')
 
  1. <# Variables: 

    • $basePath:システム環境変数から取得した一時ディレクトリのパスを格納します($env:TEMP )。

    • $installerFolderName :Notepad++インストーラー用のフォルダーの名前を指定します。一意性を確保するために動的に生成されたGUIDが含まれています。

    • $installerFolderFullPath:$basePath と$installerFolderNameをJoin-Path を使用して結合し、インストーラーフォルダーのフルパスを取得します。

  2. インストーラーフォルダーの確認と作成:

    $installerFolderExists = Test-Path $installerFolderFullPath
    if ($installerFolderExists) {
    {
        Remove-Item $installerFolderFullPath -Recurse -Force -ErrorAction Stop
    }
    New-Item -Path $basePath -Name $installerFolderName -ItemType Directory -Force | Out-Null
    • インストーラーフォルダーがすでに存在するかどうかを確認します。存在する場合は、クリーンなインストール環境を確保するために、再帰的かつ強制的に削除します。

    • New-Item コマンドレットを使用して、インストーラー用の新しいディレクトリを作成します。

  3. インストーラーのダウンロード:

    $installerUrl = "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.6/npp.8.6.Installer.x64.exe"
    Invoke-WebRequest -URI $installerUrl -OutFile $installerFullPath
    • Notepad++インストーラーのURLを指定します。

    • Invoke-WebRequest を使用してインストーラーの実行ファイルをダウンロードし、指定されたパスに保存します。

  4. インストールプロセスの開始

    Start-Process "$installerFullPath" -Wait -ArgumentList "/S"
    • インストーラーの実行ファイルを起動することによって、インストールプロセスを開始します。-Wait パラメーターは、スクリプトがインストールの完了を待つことを保証します。

  5. クリーンアップ

    Remove-Item $installerFolderFullPath -Recurse -Force
    • インストールが完了した後、インストーラーフォルダーとその内容を削除し、クリーンな環境を確保します。

  6. ログ記録

    $Context.Log('Install script completed')
    • インストールスクリプトが完了したことを示すメッセージをログに記録します。この関数は、後でポリシー詳細ページで利用可能なメッセージをログに記録することもできます。これは $Context.Log(string $message) として使用できます。

アンインストールスクリプト

アンインストールスクリプトは、ポリシー評価プロセスの一環として指定されたアプリを削除する機能を提供します。検出スクリプトは再利用され、指定された検出項目が存在しないことを確認します。

この例では、PowerShellスクリプトがプログラムフォルダーとアンインストーラー実行ファイルの両方の存在を確認することでNotepad++のアンインストールを自動化します。両方が見つかった場合、アンインストーラーをサイレントモードで実行します(/S引数)。

 
$basePath = $env:ProgramFiles
$programFolderName = "Notepad++"
$programFolderFullPath = Join-Path $basePath $programFolderName
$programFolderExists = Test-Path $programFolderFullPath
if (!$programFolderExists) {
{
    throw "Notepad++が見つかりません"
}
$uninstallerFileName = 'uninstall.exe'
$uninstallerFileFullPath = Join-Path $programFolderFullPath $uninstallerFileName
$uninstallerFileExists = Test-Path $uninstallerFileFullPath
if (!$uninstallerFileExists) {
{
    throw "Notepad++アンインストーラーが見つかりません"
}
Start-Process \"$uninstallerFileFullPath\" -Wait -ArgumentList \"/S\" $Context.Log('Uninstall script completed')
 
  1. <# Variables:

    • $basePath:システム環境変数から取得したProgram Filesディレクトリのパスを格納します($env:ProgramFiles )。

    • $programFolderName :プログラムフォルダーの名前を指定します(この場合は「Notepad++」)。

    • $programFolderFullPath :$basePath と$programFolderNameをJoin-Path を使用して結合し、プログラムフォルダーの完全なパスを取得します。

  2. プログラムフォルダーの存在確認:

    $programFolderExists = Test-Path $programFolderFullPath
    if (!$programFolderExists) {
    {
        throw "Notepad++が見つかりません"
    }
    • Test-Path :指定されたパスにファイルまたはディレクトリが存在するかどうかを判断するために使用されるCmdlet。

    • Notepad++プログラムフォルダーが存在しない場合、エラーをスローし、Notepad++がインストールされていないことを示します。

  3. アンインストーラーファイルの存在確認:

    $uninstallerFileName = 'uninstall.exe'
    $uninstallerFileFullPath = Join-Path $programFolderFullPath $uninstallerFileName
    $uninstallerFileExists = Test-Path $uninstallerFileFullPath
    if (!$uninstallerFileExists) {
    {
        throw "Notepad++アンインストーラーが見つかりません"
    }
    • Notepad++のアンインストーラー実行ファイルへのフルパスを構築します(uninstall.exe )。

    • アンインストーラー実行ファイルが存在するかどうかを確認します。存在しない場合、アンインストーラーが見つからないことを示すエラーをスローします。

  4. アンインストールプロセスの開始:

    Start-Process "$uninstallerFileFullPath" -Wait -ArgumentList "/S"
    • アンインストーラー実行ファイルを起動することによって、アンインストールプロセスを開始します。-Wait パラメーターは、スクリプトがアンインストールの完了を待つことを保証します。

  5. ログ

    $Context.Log('Uninstall script completed')
    • アンインストールスクリプトが完了したことを示すメッセージをログします。この関数は、後でポリシー詳細ページで利用可能なメッセージをログに記録することもできます。これは $Context.Log(string $message) として使用できます。

例:7-Zip (.msi)

検出スクリプト

検出スクリプト機能は、特定のクエリに対して正または負の値を返すルールセットを作成する能力を提供します。特定のアプリ(7-Zip)の検出スクリプトの例を以下に示します。このPowerShellスクリプトは、Windowsレジストリにおけるアンインストール情報の存在を確認することで、特定のプログラムが存在するかどうかをチェックします。

 
$basePath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$productCode = '{23170F69-40C1-2702-2201-000001000000}'
$programRegistryPath = Join-Path $basePath $productCode
return Test-Path $programRegistryPath
 
  1. <# Variables:

    • $basePath:インストールされたプログラムのアンインストール情報が通常格納されるWindowsレジストリの基本パスを格納します。この場合、すべてのユーザーのインストールされたプログラムのレジストリの場所であるHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall を指します。

    • $productCode :チェックされているプログラムに関連付けられたユニークな製品コードを指定します。このコードは通常、GUID(グローバルユニーク識別子)であり、レジストリ内でプログラムを識別するために使用されます。

    • $programRegistryPath:基本パス($basePath )と製品コード($productCode)をJoin-Path を使用して結合し、プログラムのアンインストール情報への完全なレジストリパスを形成します。

  2. プログラムレジストリキーの存在確認

    return Test-Path $programRegistryPath
    • Test-Path :指定されたパスにファイル、ディレクトリ、またはこの場合、レジストリキーが存在するかどうかを判断するために使用されるCmdletです。

    • スクリプトは、この存在テストの結果を返し、プログラムがインストールされているか(レジストリキーが存在する)どうかを示します。

インストールスクリプト

インストールスクリプトは、アプリの正常な展開に必要なすべてのコンポーネントをインストールおよび設定します。このPowerShellスクリプトは、インストーラーMSIファイルをダウンロードし、サイレントで実行し(/qn引数)、その後クリーンアップを行うことで7-Zipのインストールを自動化します。

 
$basePath = $env:TEMP
$installerFolderName = "7zip $(New-Guid)"
$installerFolderFullPath = Join-Path $basePath $installerFolderName
$installerFolderExists = Test-Path $installerFolderFullPath
if ($installerFolderExists) {
{
    Remove-Item $installerFolderFullPath -Recurse -Force -ErrorAction Stop
}
New-Item -Path $basePath -Name $installerFolderName -ItemType Directory -Force | Out-Null
$installerName = 'installer.msi'
$installerFullPath = Join-Path $installerFolderFullPath $installerName
$installerUrl = "https://7-zip.org/a/7z2201-x64.msi"
Invoke-WebRequest -URI $installerUrl -OutFile $installerFullPath
Start-Process msiexec -ArgumentList "/i `"$installerFullPath`" /qn" -Wait
Remove-Item $installerFolderFullPath -Recurse -Force $Context.Log('Install script completed')
 
  1. <# Variables:

    • $basePath:システム環境変数から取得した一時ディレクトリのパスを格納します($env:TEMP )。

    • $installerFolderName :7-Zipインストーラーのフォルダー名を指定します。一意性を確保するために動的に生成されたGUIDが含まれています。

    • $installerFolderFullPath:$basePath と$installerFolderNameをJoin-Path を使用して結合し、インストーラーフォルダーのフルパスを取得します。

  2. インストーラーフォルダーの確認と作成:

    $installerFolderExists = Test-Path $installerFolderFullPath
    if ($installerFolderExists) {
    {
        Remove-Item $installerFolderFullPath -Recurse -Force -ErrorAction Stop
    }
    New-Item -Path $basePath -Name $installerFolderName -ItemType Directory -Force | Out-Null
    • インストーラーフォルダーがすでに存在するかどうかを確認します。存在する場合は、クリーンなインストール環境を確保するために、再帰的かつ強制的に削除します。

    • New-Item コマンドレットを使用して、インストーラー用の新しいディレクトリを作成します。

  3. インストーラーのダウンロード:

    $installerName = 'installer.msi'
    $installerFullPath = Join-Path $installerFolderFullPath $installerName
    $installerUrl = "https://7-zip.org/a/7z2201-x64.msi"
    Invoke-WebRequest -URI $installerUrl -OutFile $installerFullPath
    • 7-ZipインストーラーのURLを指定します。

    • Invoke-WebRequest を使用してインストーラーMSIファイルをダウンロードし、指定されたパスに保存します。

  4. インストールプロセスの開始

    Start-Process msiexec -ArgumentList "/i `"$installerFullPath`" /qn" -Wait
    • msiexec ユーティリティを起動し、/i(インストール)フラグとMSIインストーラーファイルへのパス($installerFullPath )を指定してインストールプロセスを開始します。/qn パラメータは、ユーザーインターフェイスを表示せずに静かにインストールされます。

  5. クリーンアップ

    Remove-Item $installerFolderFullPath -Recurse -Force
    • インストールが完了した後、インストーラーフォルダーとその内容を削除し、クリーンな環境を確保します。

  6. ログ記録

    $Context.Log('Install script completed')
    • インストールスクリプトが完了したことを示すメッセージをログに記録します。この関数は、後でポリシーの詳細ページで利用可能なメッセージをログに記録することもできます。これは $Context.Log(string $message) として使用できます。

アンインストールスクリプト

アンインストールスクリプトは、ポリシー評価プロセスの一環として指定されたアプリケーションを削除する機能を提供します。検出スクリプトは、指定された検出項目が存在しないことを確認するために再利用できます。この例の PowerShell スクリプトは、7-Zip のアンインストールレジストリキーの存在を確認し、静かにアンインストールプロセスを開始することで、7-Zip のアンインストールを自動化します。

 
$basePath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$productCode = '{23170F69-40C1-2702-2201-000001000000}'
$programRegistryPath = Join-Path $basePath $productCode
$programExists = Test-Path $programRegistryPath
if (!$programExists) {
{
    throw "7-Zipが見つかりません"
}
Start-Process msiexec -ArgumentList "/x `"$productCode`" /qn" -Wait $Context.Log('Uninstall script completed')
 
  1. <# Variables:

    • $basePath:インストールされたプログラムのアンインストール情報が通常格納される Windows レジストリ内のベースパスを格納します。この場合、すべてのユーザーのインストールされたプログラムのレジストリの場所であるHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall を指します。

    • $productCode :7-Zip に関連付けられたユニークな製品コードを指定します。このコードは通常、GUID(グローバルユニーク識別子)であり、レジストリ内でプログラムを識別するために使用されます。

    • $programRegistryPath:基本パス($basePath )と製品コード($productCode)をJoin-Path を使用して結合し、プログラムのアンインストール情報への完全なレジストリパスを形成します。

  2. プログラムレジストリキーの存在確認

    アンインストールプロセスの開始:
    Start-Process msiexec -ArgumentList "/x `"$productCode`" /qn" -Wait
    msiexec ユーティリティを /x (アンインストール) フラグと製品コード ($productCode) で起動することにより、アンインストールプロセスを開始します。/qn パラメータは、ユーザーインターフェースを表示せずに静かにアンインストールします。
    $programExists = Test-Path $programRegistryPath
    if (!$programExists) {
    {
        throw "7-Zipが見つかりません"
    }
    • Test-Path :指定されたパスにレジストリキーが存在するかどうかを判断するために使用される Cmdlet。

    • 7-Zip のレジストリキーが存在しない場合はエラーをスローし、7-Zip がインストールされていないことを示します。

  3. ログ

    $Context.Log('Uninstall script completed')
    • アンインストールスクリプトが完了したことを示すメッセージをログします。この関数は、後でポリシー詳細ページで利用可能なメッセージをログに記録することもできます。これは $Context.Log(string $message) として使用できます。

バージョン管理

Nerdio Manager

バージョン設定の UI とフローの例

統合アプリケーション管理Shell Apps 技術リファレンスガイド には、バージョン設定のユーザーインターフェイスとフローの例に関する詳細が記載されています。

バージョン管理の例

以下の例は、Shell Apps内でバージョンを管理するための提案されたアプローチとして提供されています。これは非常に柔軟な機能であり、顧客はパッケージのインストール状況を判断するために、さまざまな検出された環境条件を利用することができます。この例では、ファイルバージョンを検出ルールとして使用しますが、この機能はレジストリ キー、ファイル、およびフォルダーにも同様に適用されます。

検出スクリプト

以下の検出スクリプトは、指定されたパスの実行可能ファイルを検査し、製品バージョン情報を返します。

注記

検出スクリプトは、結果をバージョン形式x.x.x.x で返すように構成する必要があります。特定のバージョンについて、バージョンプロパティ内のバージョンName は、アプリの状態を評価するために検出スクリプトが返す値と同一でなければなりません。

$nppDirPath = Join-Path $env:ProgramFiles "Notepad++"
$exePath = Join-Path $nppDirPath 'notepad++.exe'
if (!(Test-Path $exePath))
{
    return $null
    # 何もインストールされていません
}
# .exe メタデータからバージョンを取得しています
return (Get-Item $exePath).VersionInfo.ProductVersion

インストールスクリプト

以下のインストールスクリプトは、UAMポリシーで定義され、スクリプト内で$Context.TargetVersion として利用できるアプリのターゲットバージョンをインストールします。

$installerTempDir = Join-Path $env:TEMP "Notepad $(New-Guid)" 
$installerPath = Join-Path $installerTempDir 'installer.exe' 
# creating directory in Temp folder New-Item -Path 
$installerTempDir -ItemType Directory -Force | Out-Null 
# generating url dynamically based on target version # configured in deployment policy 
$version = $Context.TargetVersion $installerUrl = "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v$version/npp.$version.Installer.x64.exe" 
# downloading the file and running install with silent switch 
Invoke-WebRequest -URI $installerUrl -OutFile $installerPath 
Start-Process "$installerPath" -Wait -ArgumentList "/S" 
# cleaning up after ourselves 
Remove-Item $installerTempDir -Recurse -Force

アンインストールスクリプト

以下のアンインストールスクリプトは、検出ルールの条件が満たされている場合に、定義されたルーチンを使用してアプリを単純にアンインストールします。

$nppDirPath = Join-Path $env:ProgramFiles "Notepad++"
$uninstallerPath = Join-Path $nppDirPath 'uninstall.exe'
Start-Process "$uninstallerPath" -Wait -ArgumentList "/S"

この記事は役に立ちましたか?

0人中0人がこの記事が役に立ったと言っています
他にご質問がございましたら、リクエストを送信してください

コメント (0件のコメント)

記事コメントは受け付けていません。