Finalmente tuve éxito al utilizar scripts de detección de PowerShell en clientes con AllSigned
polí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:
- ¿En qué contexto ejecuta el cliente SCCM los scripts de detección de PowerShell? ¿Sistema? ¿Usuario?
- ¿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
unX
son nombres de usuariocnX
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. 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:
- 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.
- 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.
- 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)
}