c# 使用 SCCM 2016 从 wql 内部连接获取结果

c# get result from wql inner join with SCCM 2016

从任务序列我需要在 2 个不同的 类

中有 2 个信息
public static readonly string TSPackageClassString = "SMS_TaskSequencePackage";
public static readonly string TSContainerItem = "SMS_ObjectContainerItem";  

我的 WMI 查询

string query = string.Format(CultureInfo.InvariantCulture,
               "SELECT {0}.PackageID, {0}.Name, {0}.SecuredScopeNames, {0}.ObjectPath, {1}.ContainerNodeID " +
               "FROM {0} INNER JOIN {1} ON {1}.InstanceKey = {0}.PackageID " +
               "WHERE {1}.ObjectType = 20",
                TSPackageClassString, TSContainerItem);

运行查询

IResultObject listOfTaskSequences = connection.QueryProcessor.ExecuteQuery(query);

枚举查询返回的对象集合

foreach (IResultObject TS in listOfTaskSequences)
{
     MessageBox.Shox(TS.ToString());
}

消息框
Screenshot

然后我找不到这样浏览结果的方法:

string packageID = TS["PackageID"].StringValue;
string folderID =  TS["ContainerNodeID"].StringValue;
// or ...
string packageID = TS["SMS_TaskSequencePackage.PackageID"].StringValue;
string folderID =  TS["SMS_ObjectContainerItem.ContainerNodeID"].StringValue;

感谢您的帮助!

您必须这样写(需要为 System.Management.ManagementBaseObject 引用 System.Management):

using System.Management;

string folderID = ((ManagementBaseObject)TS["SMS_ObjectContainerItem"].ObjectValue)["ContainerNodeID"].ToString();

// or

ManagementBaseObject tsp = TS["SMS_TaskSequencePackage"].ObjectValue as ManagementBaseObject;
string packageID = tsp["PackageID"].ToString();

话虽这么说,但我认为整个使用 ManagementBaseObjects 的工作可能非常复杂且烦人,而且 WMI 通常很慢,所以如果您可以直接在数据库中而不是在 WMI 数据库中执行 SCCM 查询,您会更快,没有奇怪的中间数据类型,也有可能使用比 WQL

更强大的 SQL