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

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

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

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

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

Документация по этой теме довольно скудна. Лучший ресурс, который я нашел для скриптов обнаружения SCCM PowerShell, этоэтот пост в блоге KloudОднако в нем ничего не говорится о контексте.

решение1

Эмпирические результаты

Я написал PowerShell, который при запуске в качестве сценария обнаружения выводит переменные среды, которые видит сценарий обнаружения, в файл журнала. Этот сценарий находится в конце этого ответа.

Затем я заставляю этот скрипт запускаться клиентом SCCM, развертывая тип развертывания с различными параметрами "Installation Behavior" и "Logon requirement". Результаты приведены в таблице ниже:

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)
}

Связанный контент