How to Create a Static Collection
Applies To: System Center Configuration Manager 2007, System Center Configuration Manager 2007 R2, System Center Configuration Manager 2007 R3, System Center Configuration Manager 2007 SP1, System Center Configuration Manager 2007 SP2
In Microsoft System Center Configuration Manager 2007, your application uses SMS_Collection Server WMI Class to define the attributes of a collection, such as the membership rules and the refresh schedule. The MemberClassName property contains the system-generated class name that contains the members of the collection.
Members of a collection are specified by using direct rules, query rules, or both. Direct rules define an explicit resource, and query rules define a dynamic collection that is regularly evaluated based on the current state of the site.
Note
When creating a direct membership rule, remember that the rule must always have the same name as the computer that the rule specifies.
Your application uses the SMS_CollectionRuleDirect Server WMI Class class to define direct rules. This approach is used for resources that are static in nature. For example, if you have a limited number of licenses for a particular software application, the application should use direct rules to advertise to specific computers or users.
Collections are closely tied to packages, programs and advertisements. For more information, see Software Distribution Overview.
The following examples require the following values:
A Windows Management Instrumentation (WMI) connection object.
An existing parent collection ID (in this case, the C# example uses a static reference to COLLROOT).
A new static collection name.
A new static collection comment.
The 'owned by this site' flag.
A resource class name.
A resource ID.
Note
If the All Systems (SMS00001) collection has been removed from the site server, the VBScript example will not work.
Example of the subroutine call in Visual Basic:
Call CreateStaticCollection(swbemconnection, "SMS00001", "New Static Collection Name", "New static collection comment.", true, "SMS_R_System", 2)
Example of the method call in C#:
CreateStaticCollection (WMIConnection, "SMS00001", "New Static Collection Name", "New static collection comment.", true, "SMS_R_System", 2)
To create a static collection
Set up a connection to the SMS Provider. For more information, see About the SMS Provider in Configuration Manager.
Create the new collection object by using the SMS_Collection Server WMI Class class.
Define the collection to which the new collection is subordinate.
Create the direct rule by using the SMS_CollectionRuleDirect Server WMI Class class.
Add the rule to the collection.
Refresh the collection.
Example
The following example method creates a collection.
For information about calling the sample code, see Calling Configuration Manager Code Snippets.
' Set up a connection to the local provider.
Set swbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set swbemconnection= swbemLocator.ConnectServer(".", "root\sms")
Set providerLoc = swbemconnection.InstancesOf("SMS_ProviderLocation")
For Each Location In providerLoc
If location.ProviderForLocalSite = True Then
Set swbemconnection = swbemLocator.ConnectServer(Location.Machine, "root\sms\site_" + Location.SiteCode)
Exit For
End If
Next
Call CreateStaticCollection(swbemconnection, "SMS00001", "New Static Collection Name", "New static collection comment.", true, "SMS_R_System", 2)
Sub CreateStaticCollection(connection, existingParentCollectionID, newCollectionName, newCollectionComment, ownedByThisSite, resourceClassName, resourceID)
' Create the collection.
Set newCollection = connection.Get("SMS_Collection").SpawnInstance_
newCollection.Comment = newCollectionComment
newCollection.Name = newCollectionName
newCollection.OwnedByThisSite = ownedByThisSite
' Save the new collection and save the collection path for later.
Set collectionPath = newCollection.Put_
' Define to what collection the new collection is subordinate.
' IMPORTANT: If you do not specify the relationship, the new collection will not be visible in the console.
Set newSubCollectToSubCollect = connection.Get("SMS_CollectToSubCollect").SpawnInstance_
newSubCollectToSubCollect.parentCollectionID = existingParentCollectionID
newSubCollectToSubCollect.subCollectionID = CStr(collectionPath.Keys("CollectionID"))
' Save the subcollection information.
newSubCollectToSubCollect.Put_
' Create the direct rule.
Set newDirectRule = connection.Get("SMS_CollectionRuleDirect").SpawnInstance_
newDirectRule.ResourceClassName = resourceClassName
newDirectRule.ResourceID = resourceID
' Add the new query rule to a variable.
Set newCollectionRule = newDirectRule
' Get the collection.
Set newCollection = connection.Get(collectionPath.RelPath)
' Add the rules to the collection.
newCollection.AddMembershipRule newCollectionRule
' Call RequestRefresh to initiate the collection evaluator.
newCollection.RequestRefresh False
End Sub
public void CreateStaticCollection(WqlConnectionManager connection, string newCollectionName, string newCollectionComment, bool ownedByThisSite, string resourceClassName, int resourceID)
{
// Clear the screen.
Console.Clear();
try
{
// Create a new SMS_Collection object.
IResultObject newCollection = connection.CreateInstance("SMS_Collection");
// Populate new collection properties.
newCollection["Name"].StringValue = newCollectionName;
newCollection["Comment"].StringValue = newCollectionComment;
newCollection["OwnedByThisSite"].BooleanValue = ownedByThisSite;
// Save the new collection object and properties.
// In this case, it seems necessary to 'get' the object again to access the properties.
newCollection.Put();
newCollection.Get();
// Create new SMS_CollectToSubCollect instance to define collection parent/child relationship.
IResultObject newSubCollectToSubCollect = connection.CreateInstance("SMS_CollectToSubCollect");
// Define parent relationship (in this case, off the main collection node).
newSubCollectToSubCollect["parentCollectionID"].StringValue = "COLLROOT";
newSubCollectToSubCollect["subCollectionID"].StringValue = newCollection["CollectionID"].StringValue;
newSubCollectToSubCollect.Put();
// Create a new static rule object.
IResultObject newStaticRule = connection.CreateInstance("SMS_CollectionRuleDirect");
newStaticRule["ResourceClassName"].StringValue = resourceClassName;
newStaticRule["ResourceID"].IntegerValue = resourceID;
// Add the rule. Although not used in this sample, staticID contains the query identifier.
Dictionary<string, object> addMembershipRuleParameters = new Dictionary<string, object>();
addMembershipRuleParameters.Add("collectionRule", newStaticRule);
IResultObject staticID = newCollection.ExecuteMethod("AddMembershipRule", addMembershipRuleParameters);
// Start collection evaluator.
Dictionary<string, object> requestRefreshParameters = new Dictionary<string, object>();
requestRefreshParameters.Add("IncludeSubCollections", false);
newCollection.ExecuteMethod("RequestRefresh", requestRefreshParameters);
// Output message.
Console.WriteLine("Created collection" + newCollectionName);
}
catch (SmsException ex)
{
Console.WriteLine("Failed to create collection. Error: " + ex.Message);
throw;
}
}
The example method has the following parameters:
Parameter | Type | Description | |
---|---|---|---|
connection swbemconnection |
|
A valid connection to the SMS Provider. |
|
newCollectionName |
|
The unique name that represents the collection in the Configuration Manager console. |
|
newCollectionComment |
|
General comment or note that documents the collection. |
|
ownedByThisSite |
|
true if the collection originated at the local Configuration Manager site. |
|
resourceClassName |
|
The resource name of the static rule object. |
|
resourceID |
|
The resource ID. |
Compiling the Code
The C# example requires:
Namespaces
System
System.Collections.Generic
System.ComponentModel
Microsoft.ConfigurationManagement.ManagementProvider
Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine
Assembly
adminui.wqlqueryengine
microsoft.configurationmanagement.managementprovider
Robust Programming
For more information about error handling, see About Configuration Manager Errors.
Security
For more information about securing Configuration Manager applications, see Securing Configuration Manager Applications.
See Also
Reference
SMS_Collection Server WMI Class
Concepts
SMS_CollectionRuleDirect Server WMI Class
Configuration Manager Collections
Configuration Manager Software Distribution
Software Distribution Packages
Software Distribution Programs
Software Distribution Advertisements
How to Use Configuration Manager Objects with WMI
How to Use Configuration Manager Objects with Managed Code
How to Connect to an SMS Provider in Configuration Manager by Using Managed Code
How to Connect to an SMS Provider in Configuration Manager by Using WMI