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
从任务序列我需要在 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