SCCM 2012集合路径查找

时间:2016-05-19 16:00:42

标签: vb.net visual-studio-2012 sccm

我有一个执行各种SCCM功能的vb.net(2015)应用程序。其中一个功能是集合查找。因此它执行递归搜索并使用SMS_CollectToSubCollect WMI类显示路径。

我们最近迁移到SCCM 2012,此功能不再有效,因为2012使用文件夹而非子集合。有谁知道如何在SCCM 2012中完成这项功能?

2 个答案:

答案 0 :(得分:1)

我在为自己的C#应用​​程序寻找解决方案时遇到了这个线程,我需要在其中显示SCCM控制台内“用户/设备集合”文件夹的完整路径。似乎找不到专门针对C#的任何直接答案或解决方案,因此我决定在这里与可能处于相似位置的任何人分享自己的解决方案。该代码已在Visual Studio 2017中成功测试。

对于那些有兴趣在C#应用程序中显示完整集合文件夹路径(可能容易转换为vb)的人:

我从Peter van der Woude获取了此PowerShell脚本 并将其转换为可以在我的C#应用​​程序中使用,以使用列表集的完整路径填充列表框。无论子文件夹位于多少层深度,都可以使用递归来查找完整的文件夹路径。

要在文件夹内检索“收藏”项目,可以使用“ SMS_ObjectContainerItem”

请注意:如果要显示“用户”集合文件夹,请将ObjectType更改为“ 5001”,“ 5000”是“设备集合”。 另外,到SCCM服务器的连接在其他地方处理,因此请确保将“ sccmConnection”替换为您自己的连接。

您需要添加对SCCM SDK中找到的AdminUI.WqlQueryEngine.dll文件的引用。

它可能可以进一步简化,但是对于本示例,我使用了下面的代码。随时使用/修改/简化:

using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine;

   string ObjectFolder, ObjectParentFolder, ParentContainerNode;
            bool ParentFolder = false;
            int ParentContainerNodeID = 0;
         ListBox collectionLb, appLb;

 internal void RetrieveCollections(int ObjType)
    {
        string ContainerNode = "SELECT * FROM SMS_ObjectContainerNode WHERE ObjectType= " + "'" + ObjType + "'";

        WqlQueryResultsObject ContainerNodeResults = sccmConnection.QueryProcessor.ExecuteQuery(ContainerNode) as WqlQueryResultsObject;
        foreach (WqlResultObject NodeResult in ContainerNodeResults)
        {
            if (NodeResult != null)
            {
                ObjectParentFolder = NodeResult["Name"].StringValue;
                ObjectParentFolder = "\\" + ObjectParentFolder;
            }
            else
            {
                ObjectParentFolder = "Root";
            }

            if (NodeResult["ParentContainerNodeID"].IntegerValue == 0)
            {
                ParentFolder = false;
                collectionLb.Items.Add(ObjectParentFolder);
            }
            else
            {
                ParentFolder = true;
                this.ParentContainerNodeID = NodeResult["ParentContainerNodeID"].IntegerValue;
                ObjectFolder = NodeResult["Name"].StringValue;
                ObjectFolder = "\\" + ObjectFolder;
            }

            while (ParentFolder == true)
            {
                ParentContainerNode = "SELECT * FROM SMS_ObjectContainerNode " +
                                "WHERE ContainerNodeID = " + ParentContainerNodeID;
                WqlQueryResultsObject ParentContainerNodeResults = sccmConnection.QueryProcessor.ExecuteQuery(ParentContainerNode) as WqlQueryResultsObject;
                foreach (WqlResultObject ParentNodeResult in ParentContainerNodeResults)
                {

                    ObjectParentFolder = ParentNodeResult["Name"].StringValue;
                    ObjectParentFolder = "\\" + ObjectParentFolder;
                    string temp = ObjectParentFolder + ObjectFolder;

                    if (ParentNodeResult["ParentContainerNodeID"].IntegerValue == 0)
                    {    
                        ParentFolder = false;
                        collectionLb.Items.Add(temp);
                    }
                    else
                    {
                        this.ParentContainerNodeID = ParentNodeResult["ParentContainerNodeID"].IntegerValue;
                        ObjectFolder = temp;                           
                    }
                }
            }
        }
    }

结果:\ ROOTFOLDER \ Subfolder(\\ Subfolder \ Subfolder等)

答案 1 :(得分:0)

你是对的,SCCM 2012中的集合结构是扁平的。文件夹取代了集合作为组织方法。

我猜你正在寻找嵌套集合的文件夹路径。例如: 文件夹1  | _ SubFolder1       | _ SubFolder2             | _ Collection 1

这是一个PowerShell脚本,可以说明您需要做什么。 enter image description here

在PowerShell中,请注意查询:从SMS_ObjectContainerNode中选择*其中ContainerNodeID ='$ ParentContainerID'

SMS_ObjectContainerNode是表示控制台中文件夹的对象。 https://gallery.technet.microsoft.com/scriptcenter/SCCM-2012-Get-all-d14664df

如果你遇到麻烦,也许某人有一些vb.net示例代码,如果没有,我可以为你鞭打一些东西。