| Platform SDK: Active Directory, ADSI, and Directory Services |
The following code fragment creates a group on a member server or a computer running Windows NT Workstation/Windows 2000 Professional:
void wmain( int argc, wchar_t *argv[ ])
{
HRESULT hr;
IDirectoryObject * pDirObjectRoot = NULL;
IDirectoryObject * pDirObjectSampleLocal = NULL;
BOOL bMixedMode;
IADsContainer * pIADsCont = NULL;
// Initialize COM
CoInitialize(0);
IUnknown * pUnk;
// Since we are using the WinNT provider, bind to the specific computer name,
// put your computer name in the string below
#ifdef USE_OPEN_OBJECT
hr = ADsOpenObject(L"WinNT://MyComputerName,computer", ADS_OPENOBJECT_USERNAME, ADS_OPENOBJECT_PASSWORD ,
ADS_SECURE_AUTHENTICATION,IID_IADsContainer, (void**) &pIADsCont);
#else
hr = ADsGetObject(L"WinNT:// MyComputerName,computer", IID_IADsContainer, (void**) &pIADsCont);
#endif
if (SUCCEEDED(hr))
{
IDispatch * pIDispatch = NULL;
BSTR bsGroup = SysAllocString(L"group");
BSTR bsName = SysAllocString(L"ThisIsAGroup");
hr = pIADsCont->Create(bsGroup,bsName , &pIDispatch);
if (SUCCEEDED(hr))
{
puts(QueryAllInterfaces(pIDispatch));
IADsGroup * pGroup = NULL;
hr = pIDispatch->QueryInterface(IID_IADsGroup,(void**)&pGroup);
if (SUCCEEDED(hr))
{
hr = pGroup->SetInfo();
if(SUCCEEDED(hr))
{
// NOW- add some users (fill these in with Valid Users)
BSTR bsUserOne = SysAllocString(L"WinNT://MyComputerName /Administrator");
BSTR bsUserTwo = SysAllocString(L"WinNT://MyComputerName /jcooper");
hr = pGroup->Add(bsUserOne);
if (SUCCEEDED(hr))
{
hr = pGroup->Add(bsUserTwo);
if (SUCCEEDED(hr))
{
IADsMembers * pADsMembers = NULL; // Ptr to Members of the IADsGroup
BOOL fContinue = TRUE; // Looping Variable
IEnumVARIANT * pEnumVariant = NULL; // Ptr to the Enum variant
IUnknown * pUnknown = NULL; // IUnknown for getting the ENUM initially
VARIANT VariantArray[FETCH_NUM]; // Variant array for temp holding returned data
ULONG ulElementsFetched = NULL; // Number of elements fetched
// Get a interface pointer to the IADsCollection of members
hr = pGroup->Members(&pADsMembers);
if (SUCCEEDED(hr))
{
// Ask the IADsCollection of members for a new ENUM Interface
// Note the enum comes back as an IUnknown *
hr = pADsMembers->get__NewEnum(&pUnknown);
if (SUCCEEDED(hr))
{
// QI the IUnknown * for a IEnumVARIANT interface
hr = pUnknown->QueryInterface(IID_IEnumVARIANT, (void **)&pEnumVariant);
if (SUCCEEDED(hr))
{
// While have not hit errors or end of data....
while (fContinue)
{
ulElementsFetched = 0;
// Get a "batch" number of group members- number of rows specified by FETCH_NUM
hr = ADsEnumerateNext(pEnumVariant, FETCH_NUM, VariantArray, &ulElementsFetched);
if (ulElementsFetched )//SUCCEEDED(hr) && hr != S_FALSE)
{
// Loop through the current batch- printing the path
// for each member
for (ULONG i = 0; i < ulElementsFetched; i++ )
{
IDispatch * pDispatch = NULL; // ptr for holding dispath of element
IADs * pIADsGroupMember = NULL; // IADs ptr to group member
BSTR bstrPath = NULL; // Holds path of object
// Get the dispatch ptr for the variant
pDispatch = VariantArray[i].pdispVal;
assert(HAS_BIT_STYLE(VariantArray[i].vt,VT_DISPATCH));
// Get the IADs interface for the "member" of this group
hr = pDispatch->QueryInterface(IID_IADs,
(VOID **) &pIADsGroupMember) ;
if (SUCCEEDED(hr))
{
// Get the ADsPath property for this member
hr = pIADsGroupMember->get_ADsPath(&bstrPath) ;
if (SUCCEEDED(hr))
{
// Print the ADsPath of the group member
printf("\tMember Object: %ws\n", bstrPath);
SysFreeString(bstrPath);
}
pIADsGroupMember->Release();
pIADsGroupMember = NULL;
}
}
// Clear the variant array
memset(VariantArray, 0, sizeof(VARIANT)*FETCH_NUM);
}
else
fContinue = FALSE;
}
pEnumVariant->Release();
pEnumVariant = NULL;
}
pUnknown->Release();
pUnknown = NULL;
}
pADsMembers ->Release();
pADsMembers = NULL;
}
}
}
SysFreeString(bsUserOne);
SysFreeString(bsUserTwo);
bsUserOne = NULL;
bsUserTwo = NULL;
}
pGroup->Release();
pGroup = NULL;
}
pIDispatch->Release();
pIDispatch = NULL;
}
pIADsCont->Release();
pIADsCont = NULL;
}
CoUninitialize();
}
The following code creates a group on a member server or a computer running Windows NT Workstation/Windows 2000 Professional:
On Error Resume Next
Dim IADsCont As IADsContainer
Dim oIADsGroup As IADsGroup
Dim ListIADsMembers As IADsMembers
Dim Member As IADs
sComputer = InputBox("This script creates a group on a member server or workstation." & vbCrLf & vbCrLf & "Specify the computer name:")
sGroup = InputBox("Specify the group name:")
If sComputer = "" Then
MsgBox "No computer name was specified. You must specify a computer name."
Exit Sub
End If
If sGroup = "" Then
MsgBox "No group name was specified. You must specify a group name."
Exit Sub
End If
'''''''''''''''''''''''''''''''''''''''
'Bind to the computer
'''''''''''''''''''''''''''''''''''''''
Set IADsCont = GetObject("WinNT://" & sComputer & ",computer")
If (Err.Number <> 0) Then
BailOnFailure Err.Number, "on GetObject method"
End If
'''''''''''''''''''''''''''''''''''''''
'Create the group
'''''''''''''''''''''''''''''''''''''''
'Only Local groups can be created on member servers and Windows NT Workstation/Windows 2000 Professional.
Set oIADsGroup = IADsCont.Create("localGroup", sGroup)
If (Err.Number <> 0) Then
BailOnFailure Err.Number, "on IADsContainer::Create method"
End If
'''''''''''''''''''''''''''''''''''''''
'Write the group to the computer's security database.
'''''''''''''''''''''''''''''''''''''''
oIADsGroup.SetInfo
'''''''''''''''''''''''''''''''''''''''
'Read the group that was just created
'and display its name and its members.
'''''''''''''''''''''''''''''''''''''''
strText = "The group " & oIADsGroup.Name & " was created on computer " & sComputer & "."
If (Err.Number <> 0) Then
BailOnFailure Err.Number, "on IADsGroup::Name method"
End If
Set ListIADsMembers = oIADsGroup.members
If (Err.Number <> 0) Then
BailOnFailure Err.Number, "on IADsGroup::members method"
End If
'Get the enumerate the members of the group from the members object
cmember = 0
For Each Member In ListIADsMembers
If cmember = 0 Then
strText = strText & vbCrLf & " " & "Members:"
End If
strText = strText & vbCrLf & " " & Member.Name & " (" & Member.Class & ")"
cmember = cmember + 1
Next
If cmember = 0 Then
strText = strText & vbCrLf & " " & "No members"
End If
Call show_groups(strText, sComputer)
'''''''''''''''''''''''''''''''''''''''
'Display subroutines
'''''''''''''''''''''''''''''''''''''''
Sub show_groups(strText, strName)
MsgBox strText, vbInformation, "Create group on " & strName
End Sub