В каких условиях локальные файлы видны или записываются приложением App-V?
Для некоторых приложений, которые я установил, App-V, кажется, делает именно то, что нужно для правильной работы приложения. Однако в других случаях я обнаружил, что несколько файлов, которые должны находиться в локальной файловой системе, виртуализируются. Это проблема, потому что эти файлы не переживают "восстановление" виртуализированного приложения.
Я думал, что установка папки VFS в режим слияния позволит приложению писать в локальную файловую систему. Тем не менее, простой тест показал, что это не так. Очевидно, что должны существовать правила, определяющие, какие файлы считываются и записываются в локальную файловую систему, а не в VFS.
В каких условиях локальная файловая система считывается или записывается приложением App-V?
1 ответ
TL;DR
Файлы, которые существуют в локальной файловой системе, могут просматриваться виртуализированным приложением, когда соответствующая папка VFS находится в режиме "слияния" или соответствующая папка не упоминается в VFS. Но те же файлы не видны, когда соответствующая папка VFS находится в режиме "переопределения".
Виртуализированное приложение выполняет запись только в локальную файловую систему, если выполняются оба следующих условия:
- папка, в которую записан файл, не упоминается в VFS, и
- папка, в которую записан файл, существует в локальной файловой системе
Я не смог найти авторитетную документацию, чтобы ответить на этот вопрос. Самой близкой информацией, которую я нашел, было сообщение в блоге Калле Саунамяки о App-V 4.6. Оказывается, что эта публикация не только в периферийной точке, но и поведение App-V 5.x, по-видимому, также изменилось, по крайней мере, в одном случае (т. Е. App-V 5.x, похоже, не создает отсутствующие объединенные Папки режима VFS в локальной файловой системе больше, в то время как Kalle, похоже, видел 4.6 это).
Эмпирический Тест
Мои грубые эксперименты только привели к сбивающим с толку результатам, поэтому я решил провести более формальные тесты, чтобы получить основание.
Настроить
Тест включал создание файлов на каждом из следующих этапов:
- A: перед секвенированием
- B: во время секвенирования из секвенсора
- C: перед публикацией
- D: После публикации из виртуального процесса внутри приложения
Существует три возможных случая применения VFS к папке в конце последовательности:
- режим переопределения
- режим слияния
- не упомянуто
На этапе публикации любая папка может быть создана или не создана в каждой из локальных и виртуальных файловых систем. Это четыре варианта.
Три способа применения VFS в сочетании с четырьмя возможностями публикации дают результаты в 12 случаях, которые я тестировал. Я использовал некоторые сценарии для автоматизации этого и (надеюсь) избежать ошибок. Эти сценарии находятся в конце этого поста.
Результаты
VFS, как видно из пользовательского интерфейса секвенсора, выглядит следующим образом:
Я проверил наличие каждого из файлов, написанных скриптами, как внутри, так и за пределами пузыря опубликованного приложения. Результаты в этой таблице:
Анализ
Исходя из таблицы, выглядит следующее утверждение:
- Все файлы, созданные запущенным виртуализированным приложением, могут быть просмотрены этим приложением. Это не удивительно, поскольку это абсолютно необходимо для работы приложения.
- Файлы, которые существуют в локальной файловой системе, не могут быть просмотрены виртуализированным приложением, когда соответствующая папка VFS находится в режиме "переопределения".
- Файлы, которые существуют в локальной файловой системе, могут просматриваться виртуализированным приложением, когда соответствующая папка VFS находится в режиме "слияния" или соответствующая папка не упоминается в VFS.
- Единственный случай, когда виртуализированное приложение выполняет запись в локальную файловую систему, имеет место, когда выполняются оба следующих условия:
- папка, в которую записан файл, не упоминается в VFS, и
- папка, в которую записан файл, существует в локальной файловой системе
Сценарии
A-перед тем, sequencing.ps1
$splat = @{
Cases = 4..11
FolderName = 'ExistsBeforeSequencing'
FileName = 'ExistsBeforeSequencing'
Mode = 'Create'
}
.\Alter-Folders.ps1 @splat
В-во-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 @_ }
С-перед тем, 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-приложение-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
}
}