Em que condições os arquivos locais são vistos ou gravados por um aplicativo do App-V?

1

Para alguns aplicativos que foram sequenciados, o App-V parece fazer exatamente o que é necessário para que o aplicativo funcione corretamente. Em outros casos, no entanto, descobri que alguns arquivos que deveriam residir no sistema de arquivos local são virtualizados. Isso é um problema porque esses arquivos não sobrevivem a um "reparo" do aplicativo virtualizado.

Eu pensei que a configuração de uma pasta VFS no modo de mesclagem permitiria que o aplicativo gravasse no sistema de arquivos local. No entanto, um teste simples revelou que isso não parece ser o caso. Obviamente, deve haver regras que determinam quais arquivos são lidos e gravados no sistema de arquivos local em oposição ao VFS.

Em que condições o sistema de arquivos local é lido ou gravado por um aplicativo do App-V?

    
por alx9r 10.08.2015 / 21:27

1 resposta

3

TL; DR

Arquivos que existem no sistema de arquivos local podem ser vistos por um aplicativo virtualizado quando a pasta VFS correspondente está no modo "mesclar" ou a pasta correspondente não é mencionada no VFS. Mas, os mesmos arquivos não podem ser vistos quando a pasta VFS correspondente está no modo "override".

Um aplicativo virtualizado só grava no sistema de arquivos local quando as duas coisas a seguir forem verdadeiras:

  • a pasta em que o arquivo está escrito não é mencionada no VFS e
  • a pasta em que o arquivo está escrito existe no sistema de arquivos local

Não consegui encontrar documentação autoritativa para responder a esta pergunta. A informação mais próxima que encontrei foi Postagem do blog de Kalle Saunamäki em 2011 sobre o App-V 4.6. Acontece que esse post não só é perifericamente no ponto, mas o comportamento do App-V 5.x também parece ter mudado em pelo menos um caso (isto é, o App-V 5.x não parece criar falhas fundidas). modo VFS pastas no sistema de arquivos local mais, enquanto Kalle parece ter assistido 4.6 fazendo isso).

Teste empírico

Minha experimentação bruta acabou resultando em resultados confusos, então decidi executar alguns testes mais formais para entender o resultado.

Configuração

O teste envolveu a criação de arquivos em cada um dos seguintes estágios:

  • A: Antes de sequenciar
  • B: durante o sequenciamento de dentro do seqüenciador
  • C: antes de publicar
  • D: Após a publicação de um processo virtual dentro do aplicativo

Existem três casos possíveis de como o VFS se aplica a uma pasta no final do seqüenciamento:

  • modo de substituição
  • modo de mesclagem
  • não mencionado

No estágio de publicação, qualquer pasta pode ser criada ou não em cada um dos sistemas de arquivos locais e virtuais. São quatro possibilidades.

As três formas em que o VFS se aplica, combinadas com as quatro possibilidades de publicação, resultam em 12 casos que testei. Eu usei alguns scripts para automatizar isso e (espero) evitar erros. Esses scripts estão no final deste post.

Resultados

O VFS, conforme visto na interface do usuário do seqüenciador, é o seguinte:

Euverifiqueiaexistênciadecadaumdosarquivosescritospelosscriptsdedentroedeforadabolhadoaplicativopublicado.Osresultadosestãonestatabela:

Análise

Combasenatabela,parecequeasseguintesafirmaçõessãoválidas:

  • Todososarquivoscriadospeloaplicativovirtualizadoemexecuçãopodemservistosporesseaplicativo.Issonãoésurpresa,poisissoéabsolutamentenecessárioparaoaplicativofuncionar.
  • ArquivosqueexistemnosistemadearquivoslocalnãopodemservistosporumaplicativovirtualizadoquandoapastaVFScorrespondenteestánomodo"substituir".
  • Arquivos que existem no sistema de arquivos local podem ser vistos por um aplicativo virtualizado quando a pasta VFS correspondente está no modo "mesclar" ou a pasta correspondente não é mencionada no VFS.
  • O único caso em que um aplicativo virtualizado grava no sistema de arquivos local ocorre quando os dois itens a seguir são verdadeiros:
    • a pasta em que o arquivo está escrito não é mencionada no VFS e
    • a pasta em que o arquivo está escrito existe no sistema de arquivos local

Scripts

A-before-sequencing.ps1

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

.\Alter-Folders.ps1 @splat

B durante o sequenciamento.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 antes da publicação.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
        }
}
    
por 10.08.2015 / 21:27