Búsqueda de sitios web

Secuencia de tareas SCCM flexible con PowerShell


Esto se ilustra a continuación con un ejemplo práctico. La secuencia de tareas respectiva debe utilizarse durante aprox. 350 aplicaciones, por lo que con cada cambio (entrada de aplicación A, salida de aplicación B, salida de aplicación C...) fue necesario el correspondiente esfuerzo manual. El proceso podría automatizarse realizando los cambios con Powershell. Un importante cliente del sector bancario se da cuenta de ello con ScriptRunner.

Para ello se creó una plantilla de secuencia de tareas que contiene todos los pasos que nunca o rara vez cambian (variables de secuencia de tareas, instalador .NET, parches, etc.). Esta plantilla se copia del script y la copia se completa con los datos completos de la nueva versión que se utilizarán. En este caso específico, los datos de la versión están contenidos en un archivo de texto con todos los parámetros de la aplicación y ya cuentan con el nombre correcto del modelo de aplicación SCCM.

Al guión en detalle

Primero cargue el módulo ConfigMgr Powershell:

Import modules ($Env:SMS_ADMIN_UI_PATH.Substring(0,$Env:SMS_ADMIN_UI_PATH.Length-5) + ‘ConfigurationManager.psd1’)

La siguiente función de PowerShell se utiliza para copiar la secuencia existente, la plantilla:

function duplicate_tasksequence ($origTSName,$newTSName) {
try{
		$ns_root = “ROOTSMSSite_$sitecode”
		$origTSPkg = GWMI -ComputerName $siteServer -Namespace $ns_root -Class “SMS_TaskSequencePackage” -Filter “Name=’$origTSName'”” “SMS_TaskSequencePackage”.

# check if template exists

if ($origTSPkg.PackageID -ne “”){
		Write-Host “Template FOUND!” -ForegroundColor Green
		$methodTSPkgName = “SMS_TaskSequencePackage”
		$mc = [WMIClass]”$($ns_root):$($methodTSPkgName)”
		$inParamsGet = $mc.psbase.GetMethodParameters(“GetSequence”)
		$inParamsGet.TaskSequencePackage = $origTSPkg
		$outParamsGet = $mc.psbase.InvokeMethod(“GetSequence”,$inparamsGet,$null)
		$newTS = $outParamsGet.TaskSequence
		$newTSPkg = ([WMIClass]”$($ns_root):$($methodTSPkgName)”).CreateInstance()
		$newTSPkgID = $newTSPkg.PackageID
		$newTSPkg = $origTSPkg
		$newTSPkg.name = $newTSName
		$newTSPkg.PackageID = $newTSPkgID
		$inParamsSet = $mc.psbase.GetMethodParameters(“SetSequence”)
-==- proudly presents
		$inParamsSet.TaskSequencePackage = $newTSPkg
		$outParamsSet = $mc.psbase.InvokeMethod(“SetSequence”,$inParamsSet,$null)
		$ntsPkg = GWMI -ComputerName $siteServer -Namespace $ns_root -Class “SMS_TaskSequencePackage” | where { $outParamsSet.SavedTaskSequencePackagePath.Contains($_.PackageID)}
		return $ntsPkg.PackageID
		}
else{
		return “”
		}
}
catch{
		return $null;
		}
}

Fuente Technet

Llamar a la función crea una nueva secuencia de tareas a partir de la plantilla:

$newSequence = duplicate_tasksequence "$TSTemplate" "$TargetTS"

Luego, el objeto de la nueva secuencia se carga para editarlo mediante Get-CMTaskSequenz:

$CMTS = Get-CMTaskSequence -Name $TargetTS

Nota: Todos los pasos de la secuencia deben agregarse o devolverse como IResultObject.

El método GetSequence ahora se puede utilizar para editar la secuencia de tareas:

$Parameters = New-Object “System.Collections.Generic.Dictionary[string, object]”
$Parameters.Add(“TaskSequencePackage”,$CMTS)
$TSmethod =$CMTS.ConnectionManager.ExecuteMethod(“SMS_TaskSequencePackage”, “GetSequence”, $Parameters)
$TaskSequence = $TSmethod.GetSingleItem(“TaskSequence”)

Ahora tenemos la secuencia sobre la propiedad ConnectionManager en una variable $TaskSequence, con la que se pueden agregar pasos.

Definimos el nuevo paso que queremos agregar como “Instalar acción de aplicación” a través del Administrador de conexión que ya se ha utilizado:

$newStep = $CMTS.ConnectionManager.CreateEmbeddedObjectInstance("SMS_TaskSequence_InstallApplicationAction")
foreach ($app in $Applications){
		$appName= (Get-CMApplication -Name $app)
		$newStep.Name = “$app”
		$newStep.ApplicationName = $appName.ModelName
		if( $appName.LocalizedDisplayName -eq $null){ #Error Handling - If App is not available in SCCM Site -> EXIT
				Write-Host “NOT FOUND: $app — PLEASE ADD THE APPLICATION TO SCCM SITE $SiteCode” -ForegroundColor Red
				Exit
}

$appName es la aplicación real que coincide con el nombre del archivo de texto. El paso "Instalar aplicación" también recibe el nombre de la aplicación.

Nota: Debe tener cuidado aquí, ya que la GUI solo puede asignar 40 caracteres para el nombre de un paso, pero el script de Powershell no tiene límite aquí. Los nombres más largos no hacen que la secuencia deje de funcionar, pero no se pueden editar más adelante en la GUI.

Para seleccionar la aplicación que queremos agregar al paso, necesitamos el ID de aplicación único (ScopeID). Este se encuentra en el objeto ModelName.

Ahora se ha descrito la parte principal del paso:

  • El tipo fue definido (SMS_TaskSequence_InstallApplicationAction)
  • El nombre fue definido ($app, es decir, el nombre del archivo de texto)
  • La aplicación se definió utilizando ScopeID.

El paso tiene más objetos y opciones que no se utilizan aquí para mayor claridad.

Una opción muy interesante seguramente sea ContinuarOnErrorWith

en la línea$newStep.ContinueOnError=“true” en SCCM se establecería la marca de verificación en “Continuar en caso de error”. Sin embargo, cuando se utiliza en el bucle "Para-Cada", esto se aplicaría a cada paso, lo cual resulta algo poco atractivo o indeseable en secuencias productivas.

Una vez creados muchos pasos, se almacenan en una matriz generada y se asignan a un grupo de secuencia de tareas. En el ejemplo, este grupo se llama APLICACIONES.

Para hacer esto, simplemente se aborda el grupo con su número secuencial (comenzando con 0, donde 0 significa que no hay grupo):

$TaskSequenceSteps = $TaskSequence.GetArrayItems(“Steps”)
$TaskSequenceSteps = $TaskSequence.GetArrayItems(“Steps”)
$GroupSteps = $TaskSequenceSteps[1].GetArrayItems(“Steps”)
$GroupSteps.Add($newStep);

# Write array into sequence

$TaskSequenceSteps[1].SetArrayItems(“Steps”, $GroupSteps);
$TaskSequence.SetArrayItems(“Steps”, $taskSequenceSteps);
}

Entonces selecciona el grupo 1 y agrega los pasos de la matriz a ese grupo.

Ahora la secuencia de tareas debe guardarse o reescribirse. Esto se hace de la misma manera que “abrir” la secuencia:

$Parameters = New-Object “System.Collections.Generic.Dictionary[string, object]”
$Parameters.Add(“TaskSequence”, $TaskSequence)
$Parameters.Add(“TaskSequencePackage”, $CMTS)
$TSmethod = $CMTS.ConnectionManager.ExecuteMethod(“SMS_TaskSequencePackage”,”SetSequence”, $Parameters)

La plantilla antes del guión

Plantilla antes del guión.

La nueva secuencia después del guión

Nueva secuencia después del guión.

Amplíe ScriptRunner con ScriptRunner Connectors e integre su sistema de monitoreo, gestión de servicios de TI, tickets, gestión de derechos, etc. para crear bucles de control totalmente automatizados en sus operaciones de TI.

Artículos relacionados