SCCM 2012集合路径查找



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

我们最近迁移到SCCM 2012,此功能不再工作,因为2012使用的是文件夹而不是子集合。有人知道我如何在SCCM 2012中完成这一功能吗?

我在为自己的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\子文件夹(\子文件夹\子文件夹等)

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

我猜您正在查找集合嵌套的文件夹路径。例如:文件夹1|_子文件夹1|_子文件夹2|_集合1

下面是一个PowerShell脚本,它可能会让您了解需要做什么。https://gallery.technet.microsoft.com/scriptcenter/SCCM-2012-Get-all-d14664df

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

SMS_ObjectContainerNode是表示控制台中文件夹的对象。https://msdn.microsoft.com/en-us/library/cc145264.aspx

如果你有麻烦,也许有人有一些vb.net示例代码,如果没有,我可以为你准备一些东西。

最新更新