【发布时间】:2016-05-19 16:00:42
【问题描述】:
我有一个执行各种 SCCM 功能的 vb.net (2015) 应用程序。这些功能之一是集合查找。因此,它使用 SMS_CollectToSubCollect WMI 类进行递归搜索并显示路径。
我们最近迁移到 SCCM 2012,此功能不再有效,因为 2012 使用文件夹而不是子集合。有谁知道我如何在 SCCM 2012 中完成此功能?
【问题讨论】:
标签: vb.net visual-studio-2012 sccm
我有一个执行各种 SCCM 功能的 vb.net (2015) 应用程序。这些功能之一是集合查找。因此,它使用 SMS_CollectToSubCollect WMI 类进行递归搜索并显示路径。
我们最近迁移到 SCCM 2012,此功能不再有效,因为 2012 使用文件夹而不是子集合。有谁知道我如何在 SCCM 2012 中完成此功能?
【问题讨论】:
标签: vb.net visual-studio-2012 sccm
我在为我自己的 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 中,注意以下查询:Select * from SMS_ObjectContainerNode Where ContainerNodeID = '$ParentContainerID'
SMS_ObjectContainerNode 是代表控制台中文件夹的对象。 https://msdn.microsoft.com/en-us/library/cc145264.aspx
如果你有问题,也许有人有一些 vb.net 示例代码,如果没有,我可以为你准备一些东西。
【讨论】: