Я, наконец, добился успеха, используя сценарии обнаружения PowerShell на клиентах с AllSigned
политика исполнения. (подсказка: он начал работать после установки последний пакет обновления и используя Обходной путь Адама Мельцера.)
Теперь, когда стало практично использовать сценарии PowerShell для обнаружения приложений, меня заставляют задуматься о следующих вещах:
Документация по этой теме довольно скудна. Лучший ресурс, который я нашел для сценариев обнаружения SCCM PowerShell, - это сообщение в блоге Kloudоднако в нем ничего не говорится о контексте.
Я написал немного 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 для этого приложения запускается от имени этого пользователя [независимо от того, установлено ли поведение установки как «Установить как систему»].
Это означает, что Приложение с поведением установки «Установить как систему» и развертывается в пользовательской коллекции, будет использовать системный контекст для установки, но пользовательский контекст для обнаружения.
Кто-то, пишущий сценарии обнаружения для приложений, в которых поведение установки - «Установить как систему», должен быть осторожен, чтобы не полагаться на любую часть среды, которая изменяется между системным и пользовательским контекстами. В противном случае обнаружение Приложения, развернутого в системной коллекции, может быть успешным, в то время как обнаружение того же Приложения, развернутого в пользовательской коллекции, не удастся.
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)
}