如何在 C# 中修改自定义 SCCM SMS_TaskSequence_Action 属性?
How do you modify a custom SCCM SMS_TaskSequence_Action property in C#?
我正在尝试使用 C# 在 WMI 中更新 SCCM SMS_TaskSequence_Action classes。我可以成功地完全枚举SMS_TaskSequence_Step classes;但我似乎无法按照我期望的方式修改 and/or "update" 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 class 包含一个 SMS_TaskSequence,我可以从中检索 SMS_TaskSequence_Step classes组成任务序列。我也知道我需要递归地枚举步骤(遵循 SDK),因为步骤可以是 SMS_TaskSequence_Action 或任意数量的嵌套 SMS_TaskSequence_Group 对象。
假设我递归执行所有步骤,如何对他们想要更改的特定 SMS_TaskSequence_Action classes 进行更改并正确应用它们?使用 .Get() 和 .Put() 适用于 tsp 对象,但我似乎无法弄清楚如何更新步骤。
我认为您缺少的是在 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 步完成)让我相信必须这样做方式。
我正在尝试使用 C# 在 WMI 中更新 SCCM SMS_TaskSequence_Action classes。我可以成功地完全枚举SMS_TaskSequence_Step classes;但我似乎无法按照我期望的方式修改 and/or "update" 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 class 包含一个 SMS_TaskSequence,我可以从中检索 SMS_TaskSequence_Step classes组成任务序列。我也知道我需要递归地枚举步骤(遵循 SDK),因为步骤可以是 SMS_TaskSequence_Action 或任意数量的嵌套 SMS_TaskSequence_Group 对象。
假设我递归执行所有步骤,如何对他们想要更改的特定 SMS_TaskSequence_Action classes 进行更改并正确应用它们?使用 .Get() 和 .Put() 适用于 tsp 对象,但我似乎无法弄清楚如何更新步骤。
我认为您缺少的是在 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 步完成)让我相信必须这样做方式。