Как изменить пользовательское свойство SCCM SMS_TaskSequence_Action в C #? - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь обновить классы SCCM SMS_TaskSequence_Action в WMI, используя C #. Я могу полностью перечислить классы SMS_TaskSequence_Step; но я не могу изменить и / или «обновить» WMI так, как я ожидал.


Я использую консольное приложение .NET 4.7.2, включая ссылки на специфичные для AMD64 библиотеки "adminui.wqlqueryengine.dll" и "microsoft.configurationmanagement.managementprovider.dll".

Я ожидал, что смогу использовать IResultObject.Get () и .Put (), но они выдают «System.NotImplementedException». Я могу использовать SetArrayItems () для объекта ts (последовательность задач), но изменения, похоже, не применяются.


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, но я не могу понять, как обновить шаги.

1 Ответ

2 голосов
/ 28 июня 2019

Я думаю, что вам не хватает, это вызов SetSequence после SetArrayItems, так что вы просто завершили шаги, но не сохранили новые шаги в 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-м шаге) заставляет меня поверитьэто должно быть сделано так.

...