web-dev-qa-db-ja.com

App-Vアプリケーションによってローカルファイルが表示または書き込まれるのはどのような条件ですか?

私がシーケンスした一部のアプリケーションでは、App-Vはアプリケーションを正しく機能させるために必要なことを実行しているようです。ただし、他のケースでは、ローカルファイルシステムに存在するはずのいくつかのファイルが仮想化されていることがわかりました。これらのファイルは仮想化されたアプリケーションの「修復」に耐えられないため、これは問題です。

VFSフォルダーをマージモードに設定すると、アプリケーションがローカルファイルシステムに書き込むことができると思いました。しかし、簡単なテストでは、これは当てはまらないようであることが明らかになりました。明らかに、VFSではなく、ローカルファイルシステムからの読み取りとローカルファイルシステムへの書き込みを指示するルールが必要です。

ローカルファイルシステムは、App-Vアプリケーションからどのような条件で読み取られたり書き込まれたりしますか?

1
alx9r

TL; DR

ローカルファイルシステムに存在するファイルcan対応するVFSフォルダーが「マージ」モードの場合、仮想化アプリケーションによって表示されますor対応するフォルダーはVFSに記載されていません。ただし、対応するVFSフォルダーが「オーバーライド」モードの場合、同じファイルcannotが表示されます。

仮想化アプリケーションは、次の両方が当てはまる場合にのみローカルファイルシステムに書き込みます。

  • ファイルが書き込まれるフォルダーはVFSに記載されておらず、
  • ファイルが書き込まれるフォルダは、ローカルファイルシステムに存在します

この質問に答えるための信頼できるドキュメントを見つけることができませんでした。私が見つけた最も近い情報は KalleSaunamäkiの2011年のブログ投稿 App-V4.6についてでした。その投稿は周辺のオンポイントだけであるだけでなく、App-V 5.xの動作も少なくとも1つのケースで変更されているようです(つまり、App-V 5.xは欠落したマージを作成していないようです-ローカルファイルシステム上のモードVFSフォルダーはもうありませんが、Kalleは4.6を目撃したようです)。

経験的テスト

私の大雑把な実験は混乱を招く結果をもたらしたので、これを理解するためにいくつかのより正式なテストを実行することにしました。

セットアップ

テストでは、次の各段階でファイルを作成しました。

  • A:シーケンス前
  • B:シーケンサー内部からのシーケンス中
  • C:公開前
  • D:アプリ内の仮想プロセスから公開した後

シーケンスの終了時にVFSがフォルダーにどのように適用されるかについては、次の3つのケースが考えられます。

  • オーバーライドモード
  • マージモード
  • 述べられていません

公開段階では、ローカルファイルシステムと仮想ファイルシステムのそれぞれに任意のフォルダを作成することも作成しないこともできます。それは4つの可能性です。

VFSを適用する3つの方法と、4つの公開の可能性を組み合わせると、12のケースでテストしました。私はこれを自動化し、(うまくいけば)間違いを避けるためにいくつかのスクリプトを使用しました。これらのスクリプトは、この投稿の最後にあります。

結果

シーケンサーUIから見たVFSは次のとおりです。

enter image description here

公開されたアプリのバブルの内側と外側の両方から、スクリプトによって書き込まれた各ファイルの存在を確認しました。結果は次の表にあります。

enter image description here

分析

表に基づくと、次のステートメントが成り立つように見えます。

  • 実行中の仮想化アプリケーションによって作成されたすべてのファイルは、そのアプリケーションから見ることができます。これはアプリケーションが機能するために絶対に必要なので、これは驚くべきことではありません。
  • 対応するVFSフォルダーが「オーバーライド」モードの場合、ローカルファイルシステムに存在するファイルは仮想化アプリケーションからは見えません。
  • ローカルファイルシステムに存在するファイルcan対応するVFSフォルダーが「マージ」モードの場合、仮想化アプリケーションによって表示されますor対応するフォルダーはVFSに記載されていません。
  • 仮想化アプリケーションがローカルファイルシステムに書き込む唯一のケースは、次の両方が当てはまる場合に発生します。
    • ファイルが書き込まれるフォルダーはVFSに記載されておらず、
    • ファイルが書き込まれるフォルダは、ローカルファイルシステムに存在します

スクリプト

A-before-sequencing.ps1

$splat = @{
Cases       = 4..11
FolderName  = 'ExistsBeforeSequencing'
FileName    = 'ExistsBeforeSequencing'
Mode  = 'Create'
}

.\Alter-Folders.ps1 @splat

B-during-sequencing.ps1

$splats = @(
@{
    Cases       = 0..3
    FolderName  = 'CreatedDuringSequencing'
    FileName    = 'CreatedDuringSequencing'
    Mode        = 'Create'
},
@{
    Cases       = 4..7
    FolderName  = 'ExistsBeforeSequencing'
    FileName    = 'CreatedDuringSequencing'
    Mode        = 'Create'
}
)
$splats | 
    % { .\Alter-Folders.ps1 @_ }

C-before-publishing.ps1

$splats = @(
@{
    Cases       = 0..3
    FolderName  = 'CreatedDuringSequencing'
    Mode        = 'Remove'
}
@{
    Cases       = 4..11
    FolderName  = 'ExistsBeforeSequencing'
    Mode        = 'Remove'
}
@{
    Cases       = 1,3
    FolderName  = 'CreatedDuringSequencing'
    FileName    = 'CreatedBeforePublishing'
    Mode        = 'Create'
}
@{
    Cases       = 5,7,9,11
    FolderName  = 'ExistsBeforeSequencing'
    FileName    = 'CreatedBeforePublishing'
    Mode  = 'Create'
}
)

$splats | 
    % { .\Alter-Folders.ps1 @_ }

D-app-running.ps1

$splats = @(
@{
    Cases       = 2,3
    FolderName  = 'CreatedDuringSequencing'
    FileName    = 'CreatedByRunningApp'
    Mode        = 'Create'
}
@{
    Cases       = 6,7,10,11
    FolderName  = 'ExistsBeforeSequencing'
    FileName    = 'CreatedByRunningApp'
    Mode  = 'Create'
}
)

$splats | 
    % { .\Alter-Folders.ps1 @_ }

Alter-Folders.ps1

[CmdletBinding()]
param
(
    [parameter(Mandatory=$true)]
    [int32[]]
    $cases,

    [parameter(Mandatory=$true)]
    [string]
    $FolderName,

    [string]
    $FileName,

    [parameter(Mandatory=$true)]
    [string]
    [ValidateSet('create','remove')]
    $mode
)
$path = $env:ProgramData

if ( 'create' -eq $mode )
{
    $cases | 
        % { 
            New-Item "$path\$FolderName$_"           -ItemType Directory | Out-Null
            New-Item "$path\$FolderName$_\$FolderName$_-1" -ItemType Directory | Out-Null
            $filePath = "$path\$FolderName$_\$FolderName$_-1\$FileName$_-1.txt"
            $filePath | Out-File $filePath
        }
}

if ( 'remove' -eq $mode )
{
    $cases |
        % {
            Remove-Item "$path\$FolderName$_" -Recurse -Force
        }
}
3
alx9r