here is what I am using for Configuration Manager 2007...
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.ConfigurationManagement.ManagementProvider;
using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine;
using Microsoft.Win32;
namespace AddToCollection
{
class Program
{
static string CollectionName;
static string SiteServer;
static string SiteCode;
static List<string> MachineList;
static void Main(string[] args)
{
SiteServer = SCCM.GetDefaultConnectionInfo("ServerName");
SiteCode = SCCM.GetDefaultConnectionInfo("SiteCode");
ParseParams();
if (CollectionName.Length > 2 && MachineList.Count > 0)
{
SCCM WKS = new SCCM(SiteServer, SiteCode);
WKS.OpenConnection();
string CollectionId = WKS.GetCollectionId(CollectionName);
if (CollectionId.Length == 8)
{
List<string> MachinesInCollection = WKS.GetCollection(CollectionId);
foreach (string MachineName in MachineList)
{
if (MachinesInCollection.Contains(MachineName))
Console.WriteLine(MachineName + " already in collection.");
else
{
int ResourceId = WKS.GetResourceId(MachineName);
if (ResourceId > 1)
{
if (WKS.AddToCollection(CollectionId, ResourceId))
Console.WriteLine(MachineName + " added.");
else
Console.WriteLine(MachineName + " failed to add machine to collection.");
}
}
}
}
else
{
System.Threading.Thread.Sleep(5000);
Console.WriteLine("Collection not found.");
Environment.Exit(12);
}
System.Threading.Thread.Sleep(5000);
Environment.Exit(0);
}
else
{
Console.WriteLine("Invalid parameter.");
Console.WriteLine("AddToCollection "+
");
System.Threading.Thread.Sleep(5000);
Environment.Exit(87);
}
}
static void ParseParams()
{
MachineList = new List<string>();
foreach (string item in Environment.GetCommandLineArgs())
{
if (item.StartsWith("/") || item.StartsWith("-"))
{
try
{
string param = item.Substring(1, item.IndexOf(":") - 1).ToUpper();
string paramValue = item.Remove(0, item.IndexOf(":")+1);
if (param=="SITESERVER" || param=="SERVER")
SiteServer = paramValue;
if (param == "SITECODE")
SiteCode = paramValue;
if (param == "MACHINENAME" || param == "HOSTNAME" ||
param == "COMPUTERNAME" || param == "MACHINE" ||
param == "HOST" || param == "COMPUTER")
MachineList.Add(paramValue);
if (param == "COLLECTION" || param == "COLLECTIONID" ||
param == "COLLECTIONNAME")
CollectionName = paramValue;
if (param == "FILE" || param == "FILENAME" ||
param == "LIST" || param == "MACHINELIST" ||
param == "HOSTLIST" || param == "COMPUTERLIST")
{
foreach (string ComputerName in File.ReadAllLines(paramValue))
{
if (ComputerName.Trim().Length > 0)
MachineList.Add(ComputerName.Trim().ToUpper());
}
}
}
catch { }
}
}
}
}
public class SCCM
{
private WqlConnectionManager SiteServerConnection;
private string SiteServerName, SiteServerCode;
private bool _IsConnected;
public delegate void ReportProgressHandler(string Message);
public event ReportProgressHandler ReportProgress;
public SCCM(string SiteServer, string SiteCode)
{
SiteServerName = SiteServer;
SiteServerCode = SiteCode;
_IsConnected = false;
}
public SCCM()
{
SiteServerName = GetDefaultConnectionInfo("ServerName");
SiteServerCode = GetDefaultConnectionInfo("SiteCode");
}
~SCCM()
{
CloseConnection();
}
public WqlConnectionManager GetConnectionObject()
{
return SiteServerConnection;
}
public void OpenConnection()
{
if (!_IsConnected)
{
SiteServerConnection = new WqlConnectionManager();
SiteServerConnection.Connect(SiteServerName);
_IsConnected = true;
}
}
public void CloseConnection()
{
if (_IsConnected)
{
SiteServerConnection.Close();
_IsConnected = false;
}
}
public bool Connected
{
get { return _IsConnected; }
set { if (value) OpenConnection(); else CloseConnection(); }
}
public static string GetDefaultConnectionInfo(string ValueName)
{
RegistryKey ConfigMgrAdminKey = Registry.CurrentUser.OpenSubKey(
@"Software\Microsoft\ConfigMgr\Admin UI\MRU\DefaultSite");
if (ConfigMgrAdminKey == null) return null;
string result = ConfigMgrAdminKey.GetValue(ValueName).ToString();
ConfigMgrAdminKey.Close();
return result;
}
public string GetCollectionId(string CollectionName)
{
if (CollectionName.Length == 8)
{
if (CollectionName.StartsWith(SiteServerCode, StringComparison.CurrentCultureIgnoreCase))
{
string hexValue = CollectionName.Remove(0, 3);
try
{
int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
if (decValue >= 1)
return CollectionName;
}
catch { }
}
}
string wql = "SELECT * FROM SMS_Collection WHERE Name = '{0}'";
IResultObject CollectionItems = SiteServerConnection.QueryProcessor.ExecuteQuery(String.Format(wql, CollectionName));
foreach (IResultObject item in CollectionItems)
return item["CollectionId"].StringValue;
return null;
}
private IResultObject Query(string WQL)
{
if (_IsConnected)
return SiteServerConnection.QueryProcessor.ExecuteQuery(WQL);
else
return null;
}
public int GetResourceId(string ComputerName)
{
try
{
// string wql = "SELECT Name FROM SMS_Collection WHERE CollectionID = 'SMS00001' AND Name='" + ComputerName + "'";
// SMS_Collection can contain invalid machines - use SMS_FullCollectionMembership instead
string wql = "SELECT * FROM SMS_FullCollectionMembership WHERE CollectionID = 'SMS00001' AND Name='" + ComputerName + "'";
IResultObject ItemList = Query(wql);
double i = 0;
foreach (IResultObject item in ItemList)
return item["ResourceID"].IntegerValue;
}
catch { Console.WriteLine(ComputerName + " not found."); }
return -1;
}
public List<string> GetCollection(string CollectionNameOrID)
{
List<string> SystemList = new List<string>();
CollectionNameOrID = GetCollectionId(CollectionNameOrID);
string wql = "SELECT Name FROM SMS_FullCollectionMembership WHERE CollectionID = '{0}'";
IResultObject ItemList = Query(String.Format(wql, CollectionNameOrID));
double i = 0;
foreach (IResultObject item in ItemList)
{
SystemList.Add(item["Name"].StringValue);
if (ReportProgress != null)
{
i += 1;
ReportProgress(((i / ItemList.Count) * 100).ToString() + "%");
}
}
return SystemList;
}
public bool AddToCollection(string CollectionID, int ResourceID)
{
try
{
IResultObject collection = SiteServerConnection.GetInstance("SMS_Collection.collectionId='"+CollectionID+"'");
IResultObject collectionRule = SiteServerConnection.CreateEmbeddedObjectInstance("SMS_CollectionRuleDirect");
collectionRule["ResourceClassName"].StringValue = "SMS_R_System";
collectionRule["ResourceID"].IntegerValue = ResourceID;
//collectionRule["Rule_Name"].StringValue = RuleName;
Dictionary<string,> Params = new Dictionary<string,>();
Params.Add("collectionRule", collectionRule);
collection.ExecuteMethod("AddMembershipRule", Params);
return true;
}
catch (SmsException e)
{
return false;
}
}
}
}
</string></string></string></string></string></string>