Tìm kiếm trang web

Chuỗi tác vụ SCCM linh hoạt với PowerShell


Điều này được minh họa sau đây bằng một ví dụ thực tế. Trình tự nhiệm vụ tương ứng nên được sử dụng trong khoảng. 350 ứng dụng, do đó với mỗi thay đổi (Ứng dụng A vào, Ứng dụng B ra, Ứng dụng C ra…) cần có nỗ lực thủ công tương ứng. Quy trình này có thể được tự động hóa bằng cách thực hiện các thay đổi với Powershell. Một khách hàng lớn trong lĩnh vực ngân hàng nhận ra điều này nhờ ScriptRunner.

Vì mục đích này, một mẫu chuỗi nhiệm vụ đã được tạo, chứa tất cả các bước không bao giờ hoặc chỉ rất hiếm khi thay đổi (các biến trình tự nhiệm vụ, trình cài đặt .NET, các bản vá, v.v.). Mẫu này được sao chép từ tập lệnh và bản sao chứa đầy dữ liệu phát hành mới hoàn chỉnh sẽ được sử dụng. Trong trường hợp cụ thể này, dữ liệu phát hành được chứa trong một tệp văn bản với tất cả các tham số ứng dụng và đã được cung cấp tên chính xác từ Mô hình ứng dụng SCCM.

Chi tiết về kịch bản

Trước tiên hãy tải mô-đun ConfigMgr Powershell:

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

Hàm PowerShell sau đây được sử dụng để sao chép trình tự hiện có, mẫu:

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

Nguồn Technet

Việc gọi hàm sẽ tạo ra một chuỗi nhiệm vụ mới từ mẫu:

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

Sau đó, đối tượng của chuỗi mới được tải để chỉnh sửa thông qua Get-CMTaskSequenz:

$CMTS = Get-CMTaskSequence -Name $TargetTS

Lưu ý: Tất cả các bước trong trình tự phải được thêm hoặc trả về dưới dạng IResultObject.

Phương thức GetSequence hiện có thể được sử dụng để chỉnh sửa chuỗi nhiệm vụ:

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

Bây giờ chúng ta có trình tự về Thuộc tính ConnectionManager trong biến $TaskSequence, với các bước có thể được thêm vào.

Chúng tôi xác định bước mới mà chúng tôi muốn thêm là “Cài đặt ứng dụng” thông qua Trình quản lý kết nối đã được sử dụng:

$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 là ứng dụng thực tế khớp với tên trong tệp văn bản. Bước “Cài đặt ứng dụng” cũng được đặt tên của ứng dụng.

Lưu ý: Bạn phải cẩn thận ở đây vì GUI chỉ có thể gán 40 ký tự cho tên bước nhưng tập lệnh Powershell không có giới hạn ở đây. Tên dài hơn không khiến trình tự ngừng hoạt động nhưng không thể chỉnh sửa chúng sau này trong GUI.

Để chọn ứng dụng mà chúng tôi muốn thêm vào bước này, chúng tôi cần có ID ứng dụng duy nhất (ScopeID). Điều này nằm trong đối tượng ModelName.

Bây giờ phần chính của bước đã được mô tả:

  • Loại đã được xác định (SMS_TaskSequence_InstallApplicationAction)
  • Tên đã được xác định ($app, tức là tên từ tệp văn bản)
  • Ứng dụng được xác định bằng ScopeID.

Bước này có nhiều đối tượng và tùy chọn hơn không được sử dụng ở đây để làm rõ.

Một lựa chọn rất thú vị chắc chắn là ContinueOnErrorWith

dòng$newStep.ContinueOnError=“true ” trong SCCM, dấu kiểm tại “Tiếp tục gặp lỗi ” sẽ được đặt. Tuy nhiên, khi được sử dụng trong vòng lặp “Cho-Mỗi”, điều này sẽ áp dụng cho mọi bước - điều này hơi kém hấp dẫn hoặc không mong muốn trong các chuỗi sản xuất.

Sau khi tạo nhiều bước, chúng sẽ được lưu trữ trong một mảng được tạo và gán cho một nhóm chuỗi nhiệm vụ. Trong ví dụ này, nhóm này được gọi là ỨNG DỤNG.

Để làm điều này, nhóm được đánh địa chỉ đơn giản bằng số thứ tự của nó (bắt đầu bằng 0, trong đó 0 có nghĩa là không có nhóm):

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

Vì vậy bạn chọn nhóm 1 và thêm các bước từ mảng vào nhóm đó.

Bây giờ chuỗi nhiệm vụ phải được lưu hoặc ghi lại. Việc này được thực hiện tương tự như cách “mở” trình tự:

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

Mẫu trước tập lệnh

Mẫu trước kịch bản

Trình tự mới sau tập lệnh

Trình tự mới sau kịch bản

Mở rộng ScriptRunner bằng Trình kết nối ScriptRunner và tích hợp hệ thống giám sát, quản lý dịch vụ CNTT, phiếu, quản lý quyền, v.v. để tạo các vòng điều khiển hoàn toàn tự động trong hoạt động CNTT của bạn.

Bài viết liên quan