Назад | Перейти на главную страницу

В каком контексте выполняются сценарии обнаружения SCCM Powershell?

Я, наконец, добился успеха, используя сценарии обнаружения PowerShell на клиентах с AllSigned политика исполнения. (подсказка: он начал работать после установки последний пакет обновления и используя Обходной путь Адама Мельцера.)

Теперь, когда стало практично использовать сценарии PowerShell для обнаружения приложений, меня заставляют задуматься о следующих вещах:

  1. В каком контексте клиент SCCM запускает сценарии обнаружения PowerShell? Система? Пользователь?
  2. Зависит ли контекст от того, выбираете ли вы «Установить для пользователя» или «Установить для системы» в Типе развертывания?

Документация по этой теме довольно скудна. Лучший ресурс, который я нашел для сценариев обнаружения 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 имена компьютеров

Анализ

Приведенные выше результаты удивительны, потому что контекст, в котором запускается сценарий обнаружения, по-видимому, частично зависит от того, было ли приложение развернуто для пользователя или системы. Этого было достаточно, чтобы я провел тесты во второй раз. Результаты были последовательными.

Мы можем ориентировочно вывести следующие гипотезы из таблицы выше:

  1. Когда приложение развертывается для пользователя, сценарий обнаружения PowerShell для этого приложения запускается от имени этого пользователя.
  2. Когда приложение развертывается в системе и для системы установлен тип развертывания, сценарий обнаружения PowerShell для этого приложения запускается как система.
  3. Когда приложение развертывается в системе и для пользователя установлен тип развертывания, сценарий обнаружения 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)
}