Example Code for Creating an Application Directory Partition

The following C++ code example creates a new application directory partition using ADSI.

/********************************************************************

    CreateApplicationPartitionIADs()

    Description: Creates an application directory partition.

    Parameters:

    pwszDCADsPath - Contains the ADsPath of the partition. This must
    also contain the DNS name of the domain controller on which the
    partition will be created. For example, the ADsPath 
    "LDAP://DC01.fabrikam.com/DC=test,DC=com" would cause the 
    partition to be created on DC01.fabrikam.com. The distinguished
    name of the partition will be "<pwszPartitionPath>,DC=test,DC=com".

    pwszUsername - Contains the user name to be used for 
    authentication.

    pwszPassword - Contains the password to be used for
    authentication.

    pwszPartitionPath - Contains the relative distinguished name of
    the partition. This must be in the form of "DC=dynamicdata".

    pwszDescription - Contains a string that will be used for the 
    description property for the domainDNS object.

********************************************************************/

HRESULT CreateApplicationPartitionIADs(LPCWSTR pwszDCADsPath, 
                                       LPCWSTR pwszUsername, 
                                       LPCWSTR pwszPassword,
                                       LPCWSTR pwszPartitionPath,
                                       LPCWSTR pwszDescription)
{
    HRESULT hr = E_FAIL;

    IADsContainer *padsDC;

    /* 
    Bind to the specified domain controller. The path must be in the 
    form "LDAP://<server DNS name>/<partition path>", in most cases,
    the <partition path> will not be a valid path, so ADS_FAST_BIND 
    is used to allow the bind to succeed even if the path is invalid. 
    ADS_USE_DELEGATION is used to enable the LDAP provider to use the 
    credentials to contact the Domain Naming FSMO role holder to
    create or modify the crossRef object.
    */
    hr = ADsOpenObject( pwszDCADsPath,
                        pwszUsername,
                        pwszPassword,
                          ADS_SECURE_AUTHENTICATION | 
                          ADS_FAST_BIND | 
                          ADS_USE_DELEGATION,
                        IID_IADsContainer, 
                        (LPVOID*)&padsDC);

    if(SUCCEEDED(hr))
    {
        CComBSTR sbstrPath = pwszPartitionPath;
        IDispatch *pDisp;
        
        // Create the domainDNS object.
        hr = padsDC->Create(CComBSTR("domainDNS"), 
                            sbstrPath, 
                            &pDisp);

        if(SUCCEEDED(hr))
        {
            IADs *padsPartition;

            // Get the IADs interface.
            hr = pDisp->QueryInterface(IID_IADs, 
                                       (LPVOID*)&padsPartition);
            if(SUCCEEDED(hr))
            {
                CComVariant svar;

                // Set the instanceType property.
                svar = DS_INSTANCETYPE_IS_NC_HEAD | 
                       DS_INSTANCETYPE_NC_IS_WRITEABLE;
                hr = padsPartition->Put(CComBSTR("instanceType"), 
                                        svar);

                // Set the description property.
                svar = pwszDescription;
                hr = padsPartition->Put(CComBSTR("description"), 
                                        svar);

                // Commit the new object to the server.
                hr = padsPartition->SetInfo();

                padsPartition->Release();
            }
            
            pDisp->Release();
        }
        
        padsDC->Release();
    }

    return hr;
}

The following Visual Basic Scripting Edition code example shows how to create a new application directory partition using ADSI.

' CreateApplicationPartitionVBS()
' 
' Description: Creates an application directory partition.
' 
' Parameters:
' 
' DCADsPath - Contains the ADsPath of the partition. This must also 
' contain the DNS name of the domain controller on which the
' partition will be created. For example, the ADsPath 
' "LDAP://DC01.fabrikam.com/DC=test,DC=com" would cause the partition
' to be created on DC01.fabrikam.com. The distinguished name of the
' partition will be "<pwszPartitionPath>,DC=test,DC=com".
' 
' Username - Contains the user name to be used for authentication.
' 
' Password - Contains the password to be used for authentication.
' 
' PartitionPath - Contains the relative distinguished name of the 
' partition. This must be in the form of "DC=dynamicdata".
' 
' Description - Contains a string that will be used for the 
' description property for the domainDNS object.

Const ADS_SECURE_AUTHENTICATION =   1
Const ADS_FAST_BIND             =  32
Const ADS_USE_DELEGATION        = 256

Const DS_INSTANCETYPE_IS_NC_HEAD      = 1
Const DS_INSTANCETYPE_NC_IS_WRITEABLE = 4

Sub CreateApplicationPartitionVBS(  DCADsPath, _
                                    Username, _
                                    Password, _
                                    PartitionPath, _
                                    Description)
    set oNSP = GetObject("LDAP:")

    ' Bind to the specified domain controller. The path must be in the
    ' form "LDAP://<server DNS name>/<partition path>", in most cases, 
    ' the <partition path> will be an invalid path, so ADS_FAST_BIND 
    ' is used to allow the bind to succeed even if the path is 
    ' invalid. ADS_USE_DELEGATION is used to enable the LDAP provider
    ' to use the credentials to contact the Domain Naming FSMO role
    ' holder to create or modify the crossRef object.
    If Username = "" or Username = vbNullString Then
        set oParent = oNSP.OpenDSObject(DCADsPath, _
            vbNullString, _
            vbNullString, _
            ADS_SECURE_AUTHENTICATION Or _
                ADS_FAST_BIND Or _
                ADS_USE_DELEGATION)
    Else
        set oParent = oNSP.OpenDSObject(DCADsPath, _
            Username, _
            Password, _
            ADS_SECURE_AUTHENTICATION Or _
                ADS_FAST_BIND Or _
                ADS_USE_DELEGATION)
    End If
    

    ' Create the domainDNS object.
    set oNewPartition = oParent.Create("domainDNS", PartitionPath)

    ' Set the instanceType property.
    oNewPartition.Put "instanceType", DS_INSTANCETYPE_IS_NC_HEAD Or _
        DS_INSTANCETYPE_NC_IS_WRITEABLE 

    ' Set the description property.
    oNewPartition.Put "description", Description

    ' Commit the new object to the server.
    oNewPartition.SetInfo

    set oNewPartition = Nothing
    set oFalseParent = Nothing
    set oNSP = Nothing
    set oPathName = Nothing
End Sub

The following Visual Basic .NET code example shows how to create a new application directory partition using System.DirectoryServices.

Imports System.DirectoryServices

' CreateApplicationPartitionVBNet()
' 
' Description: Creates an application directory partition.
' 
' Parameters:
' 
' DCADsPath - Contains the ADsPath of the partition. This must also 
' contain the DNS name of the domain controller that the partition  
' will be created on. For example, the ADsPath  
' "LDAP://DC01.fabrikam.com/DC=test,DC=com" would cause the partition
' to be created on DC01.fabrikam.com. The distinguished name of the 
' partition will be "<pwszPartitionPath>,DC=test,DC=com".
' 
' Username - Contains the user name to be used for authentication.
' 
' Password - Contains the password to be used for authentication.
' 
' PartitionPath - Contains the relative distinguished name of the 
' partition. This must be in the form of "DC=dynamicdata".
' 
' Description - Contains a string that will be used for the 
' description property for the domainDNS object.

Sub CreateApplicationPartitionVBNet(ByVal DCADsPath As String, 
                                    ByVal Username As String, 
                                    ByVal Password As String, 
                                    ByVal PartitionPath As String, 
                                    ByVal Description As String)
    Dim parent As DirectoryEntry
    Dim domainDNS As DirectoryEntry

    ' Bind to the specified domain controller. The path must be in the 
    ' form "LDAP://<server DNS name>/<partition path>", in most cases, 
    ' the <partition path> will be an invalid path, so  
    ' AuthenticationTypes.FastBind is used to enable the bind to
    ' succeed even if the path is invalid. 
    ' AuthenticationTypes.Delegation is used to enable the LDAP 
    ' provider to use the credentials to contact the Domain Naming
    ' FSMO role holder to create or modify the crossRef object.
    parent = New DirectoryEntry(DCADsPath, _
        Username, _
        Password, _
        AuthenticationTypes.Secure Or _
            AuthenticationTypes.FastBind Or _
            AuthenticationTypes.Delegation)

    ' Create the domainDNS object.
    domainDNS = parent.Children.Add(PartitionPath, "domainDNS")

    ' Set the instanceType property.
    domainDNS.Properties("instanceType").Value = 5

    ' Set the description property.
    domainDNS.Properties("description").Value = Description

    ' Commit the new object to the server.
    domainDNS.CommitChanges()
End Sub

The following C# code example shows how to create a new application directory partition using System.DirectoryServices.

using System;
using System.DirectoryServices;

/********************************************************************

    CreateApplicationPartitionCS()

    Description: Creates an application directory partition.

    Parameters:

    DCADsPath - Contains the ADsPath of the partition. This must also 
    contain the DNS name of the domain controller that the partition  
    will be created on. For example, the ADsPath 
    "LDAP://DC01.fabrikam.com/DC=test,DC=com" would cause the 
    partition to be created on DC01.fabrikam.com. The distinguished
    name of the partition will be 
    "<pwszPartitionPath>,DC=test,DC=com".

    Username - Contains the user name to be used for authentication.

    Password - Contains the password to be used for authentication.

    PartitionPath - Contains the relative distinguished name of the 
    partition. This must be in the form of "DC=dynamicdata".

    Description - Contains a string that will be used for the 
    description property for the domainDNS object.

*******************************************************************/

static void CreateApplicationPartitionCS(string DCADsPath, 
    string Username, 
    string Password,
    string PartitionPath,
    string Description)
{
    /* 
    Bind to the specified domain controller. The path must be in the
    form "LDAP://<server DNS name>/<partition path>", in most cases, 
    the <partition path> will be an invalid path, so 
    AuthenticationTypes.FastBind is used to enable the bind to 
    succeed even if the path is invalid. 
    AuthenticationTypes.Delegation is used to allow the LDAP 
    provider to use the credentials to contact the Domain Naming
    FSMO role holder to create or modify the crossRef object.
    */
    DirectoryEntry parent = new DirectoryEntry(DCADsPath, 
        Username, 
        Password, 
        AuthenticationTypes.Secure | 
        AuthenticationTypes.FastBind | 
        AuthenticationTypes.Delegation);

    // Create the domainDNS object.
    DirectoryEntry domainDNS = parent.Children.Add(PartitionPath, 
                                                   "domainDNS");

    // Set the instanceType property.
    domainDNS.Properties["instanceType"].Value = 5;

    // Set the description property.
    domainDNS.Properties["description"].Value = Description;

    // Commit the new object to the server.
    domainDNS.CommitChanges();
}