我正在尝试构建一个C#应用程序,提供全球一级支持团队使用的最常见的SCCM 2012功能。
因此,最重要的功能之一是将计算机(resourceID)作为DirectMembershipRule添加到集合中。
我已经使用Powershell完成了类似的操作并创建了一个GUI。但是由于多线程和GUI使“脚本”越来越不稳定,我想继续使用DotNet应用程序。 不幸的是,我在C#中根本没有经验。尽管如此,我已经设法从我们的SQL数据库中读取并收集已经集合的名称,集合的计算机和其他人。
通过WMI方法添加到集合似乎最可靠,并且我完全陷入困境。我设法从我们的服务器接收了诸如Bios Info或Disk info之类的WMI数据,但是无法触发为成员资格规则创建新实例的方法。
我很乐意在这里得到一些帮助。 : - )
答案 0 :(得分:0)
没有太多东西可以找到,但是如果你看一下this example,第二部分会从评论“添加到所有系统集合”开始。这基本上解释了这个。您需要使用的是System Center Configuration Manager控制台文件夹中的两个dll,AdminUI.WQLQueryengine.dll和Microsoft.ConfigurationManagement.Managementprovider.dll。有了这些,您基本上可以编写代码,就像可以找到的VBS的许多WMI示例一样。它看起来像这样:
using Microsoft.ConfigurationManagement.ManagementProvider;
using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine;
SmsNamedValuesDictionary namedValues = new SmsNamedValuesDictionary();
using (WqlConnectionManager connection = new WqlConnectionManager(namedValues)) {
connection.Connect("<site server>");
IResultObject collection = connection.GetInstance("SMS_Collection.collectionId='<CollectionID>'");
IResultObject collectionRule = connection.CreateEmbeddedObjectInstance("SMS_CollectionRuleDirect");
collectionRule["ResourceClassName"].StringValue = "SMS_R_System";
collectionRule["ResourceID"].IntegerValue = <ResourceID>;
Dictionary<string, object> inParams = new Dictionary<string, object>();
inParams.Add("collectionRule", collectionRule);
collection.ExecuteMethod("AddMembershipRule", inParams);
}
在没有这些dll帮助的情况下,Imo基本上也应该可以使用“普通”WMI调用但是因为这是在MS示例中完成的方式,我总是假设某种优势并且这样做。