如何在C#中修改自定义SCCM SMS_TaskSequence_Action属性?

贾斯汀·谢德尔(Justin Shidell)

我正在尝试使用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之后),因为步骤可以是SMS_TaskSequence_Action或任意数量的嵌套SMS_TaskSequence_Group对象。

假设我重复了所有步骤,那么如何对他们要更改的特定SMS_TaskSequence_Action类进行更改并正确应用它们?在tsp对象上可以使用.Get()和.Put(),但是我似乎无法弄清楚如何更新步骤。

赛伯多尔

我认为您缺少的是在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#编写的用例的好例子,但是这个德语powershell教程(代码用英语注释,保存在第5步完成)使我相信必须这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章