【问题标题】:How do you modify a custom SCCM SMS_TaskSequence_Action property in C#?如何在 C# 中修改自定义 SCCM SMS_TaskSequence_Action 属性?
【发布时间】:2019-06-27 22:01:45
【问题描述】:

我正在尝试使用 C# 更新 WMI 中的 SCCM SMS_TaskSequence_Action 类。我可以完全成功枚举 SMS_TaskSequence_Step 类;但我似乎无法按照预期的方式修改和/或“更新”WMI。


我正在使用 .NET 4.7.2 控制台应用程序,包括对 AMD64 特定的“adminui.wqlqueryengine.dll”和“microsoft.configurationmanagement.managementprovider.dll”库的引用。

我希望我可以使用 IResultObject.Get() 和 .Put(),但它们会抛出“System.NotImplementedException”。我可以在 ts(任务序列)对象上使用 SetArrayItems(),但似乎没有应用更改。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.ConfigurationManagement.ManagementProvider;
using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine;

namespace SCCM
{
    class Program
    {
        static Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine.WqlConnectionManager wqlcm;

        static void Main(string[] args)
        {
            wqlcm = new WqlConnectionManager();
            wqlcm.Connect("ServerName");

            IResultObject taskSequencePackages = wqlcm.QueryProcessor.ExecuteQuery("select * from SMS_TaskSequencePackage");

            foreach (IResultObject tsp in taskSequencePackages)
            {
                tsp.Get();
                //tsp["Name"].StringValue = "Setting a custom Task Sequence Package Name";
                //tsp.Put();

                Console.WriteLine("Task Sequence Name: " + tsp["Name"].StringValue);
                Console.WriteLine("Sequence: " + tsp["Sequence"].StringValue);

                Dictionary<string, object> parameters = new Dictionary<string, object>();
                parameters.Add("TaskSequencePackage", tsp);

                IResultObject sequence = wqlcm.ExecuteMethod("SMS_TaskSequencePackage", "GetSequence", parameters);
                IResultObject ts = sequence.GetSingleItem("TaskSequence");

                // Get a list of steps.  
                List<IResultObject> actionSteps = ts.GetArrayItems("Steps");

                // Find the action to be deleted.  
                foreach (IResultObject actionStep in actionSteps)
                {
                    if (actionStep["__CLASS"].StringValue == "MyCustomTaskSequenceAction" && actionStep["__SUPERCLASS"].StringValue == "SMS_TaskSequence_Action")
                    {
                        // Throws a "System.NotImplementedException": The method or operation is not implemented.  
                        //actionStep.Get();

                        actionStep["CommandLine"].StringValue = "Some New Command Line";

                        ts.SetArrayItems("Steps", actionSteps);
                        break;
                    }
                }
            }
        }
    }
}

我还知道 SMS_TaskSequencePackage 类包含一个 SMS_TaskSequence,我可以从中检索构成任务序列的 SMS_TaskSequence_Step 类。我也知道我需要递归枚举步骤(遵循 SDK),因为 Step 可以是 SMS_TaskSequence_Action 或任意数量的嵌套 SMS_TaskSequence_Group 对象。

假设我递归执行所有步骤,如何更改他们想要更改的特定 SMS_TaskSequence_Action 类并正确应用它们?使用 .Get() 和 .Put() 对 tsp 对象有效,但我似乎无法弄清楚如何更新步骤。

【问题讨论】:

    标签: c# .net sms wmi sccm


    【解决方案1】:

    我认为您缺少的是在 SetArrayItems 之后对 SetSequence 的调用,因此您刚刚完成了步骤,但没有将新步骤保存到 ts,因此您需要类似以下内容:

    Dictionary<string, object> inParams = new Dictionary<string, object>();  
    inParams.Add("TaskSequence", ts);  
    inParams.Add("TaskSequencePackage", tsp);  
    
    // Associate the task sequence with the package. Note that a call to Put is not required.  
    IResultObject result = connection.ExecuteMethod("SMS_TaskSequencePackage", "SetSequence", inParams); 
    

    我无法为您的用例用英语和 c# 找到一个好的示例,但 this german powershell tutorial(代码用英语注释,保存在第 5 步完成)让我相信必须以这种方式完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2011-06-20
      相关资源
      最近更新 更多