Эмпирические результаты
Я написал PowerShell, который при запуске в качестве сценария обнаружения сбрасывает переменные среды, которые сценарий обнаружения видит в файл журнала. Этот сценарий находится в конце этого ответа.
Затем я запускаю этот сценарий клиентом SCCM, развертывая тип развертывания с различными параметрами «Поведение при установке» и «Требование входа в систему». Результаты приведены в таблице ниже:
Test InstallationBehavior LogonRequirement DeployedTo LoggedOnUser ScriptRunAs
---- -------------------- ---------------- ---------- ------------ -----------
1.1a Install for user Only when a user is logged on un2 un2 un2
1.1b Install for user Only when a user is logged on cn1 un2 un2
1.1c Install for user Only when a user is logged on cn1 un1 un1
1.2a Install for system Only when a user is logged on un2 un2 un2
1.2b Install for system Only when a user is logged on cn1 un2 cn1
1.2c Install for system Only when a user is logged on cn1 un1 cn1
1.3a Install for system Whether or not a user is logged on un2 un2 un2
1.3b Install for system Whether or not a user is logged on cn1 un2 cn1
1.3c Install for system Whether or not a user is logged on cn1 un1 cn1
unX
имена пользователей
cnX
имена компьютеров
Анализ
Вышеуказанные результаты являются неожиданными, поскольку контекст, в котором выполняется сценарий обнаружения, по-видимому, частично зависит от того, было ли приложение развернуто для пользователя или системы. Этого было довольно удивительно, что я провел тесты во второй раз. Результаты были последовательными.
Мы можем предположительно сделать следующие гипотезы из таблицы выше:
- Когда приложение развертывается для пользователя, сценарий обнаружения PowerShell для этого приложения запускается от имени этого пользователя.
- Когда приложение развертывается в системе и для системы устанавливается тип развертывания, в качестве системы запускается сценарий обнаружения PowerShell для этого приложения.
- Когда приложение развертывается в системе и для пользователя устанавливается тип развертывания, сценарий обнаружения PowerShell для этого приложения запускается как вошедший в систему пользователь.
Выше три гипотезы подтверждаются результатами испытаний. Вполне могут быть некоторые другие переменные, которые не были проверены, если эти гипотезы не верны. По крайней мере, они являются хорошим набором начальных допущений при использовании сценариев обнаружения PowerShell.
Несоответствующие контексты (Осторожно!)
Джейсон Сэндис задокументировал аналогичный тест правил для контекста установки. Если вы внимательно прочитаете этот пост, вы можете заметить, что правила для контекста установки и контекста сценария обнаружения не совсем совпадают. Вот оскорбительные правила:
Когда поведение установки приложения установлено на «Установить как систему», программа установки запускается как система [независимо от развертывания для пользователя].
Когда приложение развертывается для пользователя, сценарий обнаружения PowerShell для этого приложения запускается от имени этого пользователя [независимо от того, установлено ли поведение при установке «Установить как система»].
Это означает, что Приложение, которое имеет поведение установки «Установить как систему» и развернуто в пользовательской коллекции, будет использовать системный контекст для установки, но пользовательский контекст для обнаружения.
Кто-то, пишущий сценарии обнаружения для Приложений, в которых поведение установки - «Установить как Система», должен быть осторожен, чтобы не полагаться на какую-либо часть среды, которая изменяется между контекстами системы и пользователя. В противном случае обнаружение Приложения, развернутого в системной коллекции, может быть успешным, в то время как обнаружение точно такого же Приложения, развернутого в пользовательской коллекции, завершится неудачно.
скрипт
function Write-EnvToLog
{
$appName = 'script-detect-test'
$logFolderPath = "c:\$appName-$([System.Environment]::UserName)"
if ( -not (Test-Path $logFolderPath -PathType Container) )
{
New-Item -Path $logFolderPath -ItemType Directory | Out-Null
}
if ( -not (Test-Path $logFolderPath -PathType Container ) )
{
return
}
$logFileName = "$appName`__$((Get-Date).ToString("yyyy-MM-dd__HH-mm-ss")).txt"
$fp = "$logFolderPath\$logFileName"
Get-ChildItem Env: | Out-File $fp | Out-Null
return $true
}
try
{
if ( Write-EnvToLog ) { "Detected!" }
[System.Environment]::Exit(0)
}
catch
{
[System.Environment]::Exit(0)
}