当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 的灵活 SCCM 任务序列

作者:精品下载站 日期:2024-12-14 08:08:04 浏览:14 分类:玩电脑

使用 PowerShell 的灵活 SCCM 任务序列


[玩转系统] 使用 PowerShell 的灵活 SCCM 任务序列

下面通过一个实际例子来说明这一点。 相应的任务序列应用于大约。 350 个应用程序,因此每次更改(应用程序 A 输入、应用程序 B 输出、应用程序 C 输出……)都需要相应的手动操作。 可以通过使用 Powershell 进行更改来自动化该过程。银行业的一个主要客户通过 ScriptRunner 实现了这一点。

为此,创建了一个任务序列模板,其中包含从不或很少更改的所有步骤(任务序列变量、.NET 安装程序、补丁等)。该模板是从脚本中复制的,并且该副本填充了要使用的完整的新发布数据。在这种特定情况下,发布数据包含在包含所有应用程序参数的文本文件中,并且已从 SCCM 应用程序模型中提供了正确的名称。

详细脚本

首先加载ConfigMgr Powershell模块:

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

以下PowerShell函数用于复制现有序列、模板:

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

来源科技网

调用该函数会根据模板创建一个新的任务序列:

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

然后通过 Get-CMTaskSequenz 加载新序列的对象以进行编辑:

$CMTS = Get-CMTaskSequence -Name $TargetTS

注意:序列中的所有步骤都必须作为 IResultObject 添加或返回。

现在可以使用 GetSequence 方法来编辑任务序列:

$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”)

现在我们在 $TaskSequence 变量 中拥有有关 ConnectionManager-Property 的序列,可以使用该序列添加步骤。

我们通过已使用的连接管理器将要添加的新步骤定义为“安装应用程序操作”:

$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 是与文本文件中的名称匹配的实际应用程序。 “安装应用程序”步骤也给出了应用程序的名称。

注意:此处必须小心,因为 GUI 只能为步骤名称分配 40 个字符,但 Powershell 脚本在此没有限制。较长的名称不会导致序列停止工作,但稍后无法在 GUI 中进行编辑。

要选择要添加到步骤的应用程序,我们需要唯一的应用程序 ID (ScopeID)。它位于 ModelName 对象中。

现在已经描述了该步骤的主要部分:

  • 类型已定义 (SMS_TaskSequence_InstallApplicationAction)
  • 名称已定义($app,即文本文件中的名称)
  • 该应用程序是使用 ScopeID 定义的。

该步骤有更多对象和选项,为清楚起见,此处未使用这些对象和选项。

一个非常有趣的选项肯定是ContinueOnErrorWith

SCCM 中的 $newStep.ContinueOnError=“true ” 行将设置“错误继续”处的复选标记。然而,当在“For-Each”循环中使用时,这将适用于每个步骤——这在生产序列中有点不吸引人或不受欢迎。

创建许多步骤后,它们将存储在生成的数组中并分配给任务序列组。在示例中,该组称为“应用程序”。

为此,只需使用其序列号对组进行寻址(从 0 开始,其中 0 表示没有组):

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

因此,您选择组 1 并将数组中的步骤添加到该组。

现在必须保存或写回任务序列。这与“打开”序列的方式相同:

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

脚本之前的模板

[玩转系统] 使用 PowerShell 的灵活 SCCM 任务序列

脚本之前的模板

脚本之后的新序列

[玩转系统] 使用 PowerShell 的灵活 SCCM 任务序列

脚本后的新序列

使用 ScriptRunner 连接器扩展 ScriptRunner,并集成您的监控、IT 服务管理、票证、权限管理系统等,以在您的 IT 运营中创建完全自动化的控制循环。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯