Resultados empíricos
Escribí algunos PowerShell que, cuando se ejecutan como un script de detección, vuelcan las variables de entorno que el script de detección ve en un archivo de registro. Ese guión se encuentra al final de esta respuesta.
Luego hago que el cliente SCCM ejecute este script mediante la implementación de un Tipo de implementación con diferentes parámetros de "Comportamiento de instalación" y "Requisitos de inicio de sesión". Los resultados están en la tabla a continuación:
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
son nombres de usuario
cnX
son 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. Fue una sorpresa suficiente que corrí las pruebas por segunda vez. Los resultados fueron consistentes.
Podemos extraer tentativamente las siguientes hipótesis de la tabla anterior:
- Cuando una aplicación se implementa en un usuario, un script de detección de PowerShell para esa aplicación se ejecuta como ese usuario.
- Cuando se implementa una aplicación en un sistema y se instala el tipo de implementación para el sistema, se ejecuta un script de detección de PowerShell para esa aplicación como el sistema.
- Cuando una aplicación se implementa en un sistema y el tipo de implementación se instala para el usuario, se ejecuta un script de detección de PowerShell para esa aplicación como el usuario conectado.
Las tres hipótesis anteriores están respaldadas por los resultados de la prueba. Bien puede haber algunas otras variables que no se probaron donde estas hipótesis no son válidas. Son, al menos, un buen conjunto de supuestos iniciales cuando se usan scripts de detección de PowerShell.
Contextos incompatibles (¡Cuidado!)
Jason Sandys documentó una prueba similar de las reglas para el contexto de instalación. Si lees esa publicación detenidamente, podrías 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 una aplicación se implementa en un usuario, un script de detección de PowerShell para esa aplicación se ejecuta como ese usuario [independientemente de si el comportamiento de instalación está configurado en "Instalar como sistema"].
Esto significa que una aplicación que tiene el comportamiento de instalación "Instalar como sistema" y se 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 es "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 falla la detección de la misma aplicación implementada en una colección de usuarios.
Guión
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)
}