需要帮助使用 C# 代码执行 SCCM 任务序列

Need help using C# code to execute SCCM Task Sequence

我将以我对 C# 编码知之甚少作为序言。 PowerShell、VBS 等非常好。但我至少知道足够危险。我们有一个在机器上本地运行的 C# 程序。其目的是安装 SCCM 客户端并查找公布的任务序列。出于本练习的目的,假设将正确的任务序列部署到该机器所在的集合中——我知道不是这样——它启动 If 块,因为它找到了通告的 TS。

代码中还有很多其他内容,但这是脚本失败部分的主要内容。 FWIW,这是在 try/catch 块中,TS 名称是“Windows 10 Upgrade”。我什至重命名了 TS,认为是其中的空格导致它失败。不开心。

ManagementScope scope = new ManagementScope(@"\localhost\ROOT\ccm\clientsdk");
ObjectQuery query = new ObjectQuery("SELECT * FROM CCM_Program");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
Write_Log("Searching for Policy");

ManagementObjectCollection allpackages = searcher.Get();
     foreach (ManagementObject pkg in allpackages)
     {
          Write_Log(pkg["PackageName"].ToString());
          if (pkg["PackageName"].ToString() == "Windows 10 Upgrade")
          {
               Write_Log("Found:" + pkg["PackageName"].ToString());
               Write_Log("About to execute WMI Invoke for pkg: " + pkg);
               ManagementClass wmiClass = new managementClass(@"\localhost\ROOT\ccm\clientSDK:CCM_ProgramsManager");
               ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);
               Write_Log("ExecuteProgram Result: " + outMPParams["ReturnValue"].ToString());
               if (outMPParams["ReturnValue"].ToString() == "0")
                    Write_Log("SCCM TS Started");
                    Application.Exit();
                }

本地主机被解析为计算机名称,这样很好。失败的部分是:

ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);

现在它完全脱离了 try/catch 块,出现“未找到 TS”并且没有其他错误。令人沮丧的是,我加载了一堆 Write_log 条目以尝试捕获错误是什么,但是那一步真的很好地打破了它并直接进入了 catch 块。

有人有使用 C# 执行 SCCM 相关任务的经验吗?上面的语法看起来正确吗?

就像我说的,我从另一家公司继承了代码,并试图让它为我们工作。我只是对这个电话了解不够,在网上找不到任何关于它试图做什么的信息。

非常感谢任何帮助!!

好吧,这不是我要找的答案,但我能够拼凑一些 PS 代码来满足我的需要。首先我查询有哪些可用的包:

$AllPackages = Get-WmiObject -Class ccm_program -Namespace root\ccm\ClientSDK 

然后我用这个

逗弄机器策略
Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000021}” | out-null

稍等一下,然后用这个来评估它:

Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000022}” | out-null

然后我执行 ForEach 循环以获取我获得的信息:

ForEach ($Pkg in $AllPackages) {
     $PackageID = $Pkg.PackageID
     $ProgramID = $Pkg.ProgramID
     $PackageName = $Pkg.PackageName

     if ($PackageName -eq $TSName) {

然后外星人用

打电话回家
([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)

这就是她写的全部内容。我在一个 While 块中完成所有这些工作,并在它启动后立即退出。

如果有人还在看,我有一个问题...

如何从 WMI 调用中获取返回结果?我试过这个

$RetVal=(([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)).ExitCode

但它不喜欢它。该操作是否 return 有价值?

感谢您的帮助!