¿En qué contexto se ejecutan los scripts de detección de SCCM Powershell?

¿En qué contexto se ejecutan los scripts de detección de SCCM Powershell?

Finalmente tuve éxito al utilizar scripts de detección de PowerShell en clientes con AllSignedpolítica de ejecución. (pista: empezó a funcionar después de instalarel último paquete de servicioy usandoLa solución de Adam Meltzer.)

Ahora que es práctico utilizar scripts de PowerShell para la detección de aplicaciones, me pregunto lo siguiente:

  1. ¿En qué contexto ejecuta el cliente SCCM los scripts de detección de PowerShell? ¿Sistema? ¿Usuario?
  2. ¿El contexto depende de si selecciona "Instalar para usuario" o "Instalar para sistema" en el Tipo de implementación?

La documentación es bastante escasa sobre este tema. El mejor recurso que he encontrado para los scripts de detección de SCCM PowerShell esesta publicación del blog de Kloud, sin embargo, guarda silencio sobre la cuestión del contexto.

Respuesta1

Resultados empíricos

Escribí algo de PowerShell que, cuando se ejecuta como un script de detección, vuelca las variables de entorno que ve el script de detección en un archivo de registro. Ese guión está al final de esta respuesta.

Luego hago que el cliente SCCM ejecute este script implementando un tipo de implementación con diferentes parámetros de "comportamiento de instalación" y "requisito de inicio de sesión". Los resultados se encuentran en la siguiente tabla:

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        

   
  • unXson nombres de usuario
  • cnXson nombres de computadora

Análisis

Los resultados anteriores son sorprendentes porque el contexto en el que se ejecuta un script de detección parece depender en parte de si la aplicación se implementó en un usuario o en un sistema. Esto fue una sorpresa suficiente para realizar las pruebas por segunda vez. Los resultados fueron consistentes.

Podemos extraer tentativamente las siguientes hipótesis de la tabla anterior:

  1. Cuando se implementa una aplicación para un usuario, se ejecuta un script de detección de PowerShell para esa aplicación como ese usuario.
  2. Cuando se implementa una aplicación en un sistema y el tipo de implementación está instalado para el sistema, se ejecuta un script de detección de PowerShell para esa aplicación como sistema.
  3. Cuando se implementa una aplicación en un sistema y el tipo de implementación está instalado para el usuario, se ejecuta un script de detección de PowerShell para esa aplicación como usuario que inició sesión.

Las tres hipótesis anteriores están respaldadas por los resultados de la prueba. Es posible que haya otras variables que no se probaron y en las que estas hipótesis no se cumplan. Son, al menos, un buen conjunto de suposiciones iniciales al utilizar scripts de detección de PowerShell.

Contextos no coincidentes (¡Cuidado!)

Jason Sandys documentó una prueba similar de las reglas para el contexto de instalación. Si lee esa publicación con atención, puede notar que las reglas para el contexto de instalación y el contexto del script de detección no son exactamente las mismas. Aquí están las reglas ofensivas:

Cuando el comportamiento de instalación de una aplicación se establece en "Instalar como sistema", el instalador se ejecuta como sistema [independientemente de la implementación para el usuario].

Cuando se implementa una aplicación para un usuario, se ejecuta un script de detección de PowerShell para esa aplicación como ese usuario [independientemente de si el comportamiento de instalación está configurado en "Instalar como sistema"].

Esto significa queuna aplicación que tiene un comportamiento de instalación "Instalar como sistema"yse implementa en una colección de usuarios utilizará el contexto del sistema para la instalación, pero el contexto del usuario para la detección.

Alguien que escriba scripts de detección para aplicaciones donde el comportamiento de instalación sea "Instalar como sistema" debe tener cuidado de evitar depender de cualquier parte del entorno que cambie entre el sistema y los contextos del usuario. De lo contrario, la detección de una aplicación implementada en una colección del sistema puede tener éxito, mientras que la detección de exactamente la misma aplicación implementada en una colección de usuarios falla.

Guion

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

información relacionada