//=====================================================================
//== Create Windows User using ADSI C++ sample - Copyright © 2007, Dave Moats
//==
//== This sample is provided 'as-is', without any express or implied warranty.
//== In no event will the authors be held liable for any damages arising from
//== the use of this sample code.
//==
//== Permission is granted to anyone to use this sample code for any purpose,
//== including commercial applications, subject to the following restrictions:
//==
//== The origin of this code must not be misrepresented;
//==       you must not claim that you wrote the original code.
//==       If you use this code, an acknowledgment in the
//==       documentation is requested - shown below:
//==
//== Portions Copyright © 2007, Dave Moats (http://www.davemoats.com/).
//==
//=====================================================================
//===================================================================
//==
//==    ADSI create user sample - will work on an NT4 domain or for
//==                                           local windows accounts
//==
//==    NOTE: Do NOT use this sample on Active Directory, this sample
//==             uses the ADSI WinNT provider and for Active Diretory, you
//==             should use the ADSI LDAP provider
//==
//===================================================================
#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

//===================================================================
// libraries needed to use ADSI
//===================================================================
#pragma comment ( lib, "Activeds.lib" )
#pragma comment ( lib, "Adsiid.lib" )

//===================================================================
// ADSI header
//===================================================================
#include <activeds.h>

//===================================================================
// COM header for VARIANT wrapper
//===================================================================
#include <comdef.h>

//===================================================================
// standard headers
//===================================================================
#include <stdio.h>


int wmain ( int argc, wchar_t *argv[] )
{
   int retVal = 0;

   CoInitialize ( NULL);

   HRESULT hr = E_FAIL;

   // some strings needed to set up the account
   BSTR pswdExpiredText = SysAllocString ( L"PasswordExpired" );
   BSTR userClass = SysAllocString ( L"user" );

   // make sure the allocation worked as expected
   if ( ( pswdExpiredText != NULL ) && ( userClass != NULL ))
   {
         // setting up the pointers needed to create the user
         IADsContainer* domainContainer = NULL;
         IDispatch* newUserPtr = NULL;
         IADsUser* createdUser = NULL;

         // try to bind to domain or server and get a container
         // pointer to it
         hr = ADsGetObject ( L"WinNT://someDomain or Server",
                                       IID_IADsContainer,
                                       ( void**)&domainContainer );
           
         // using the SUCCEEDED macro to check the return value
         if ( SUCCEEDED ( hr ))
         {
               // since we were able to bind to the domain/server
               // let's try to create a user object
               hr = domainContainer->Create ( userClass,
                                                            L"User's samAccountName",
                                                            &newUserPtr );
               if ( SUCCEEDED ( hr ))
               {
                     // get the interface to the newly created user
                     hr = newUserPtr->QueryInterface ( IID_IADsUser,
                                                                        ( void**)&createdUser );
                     if ( SUCCEEDED ( hr ))
                     {
                           // set the password
                           hr = createdUser->SetPassword ( L"User's Password" );

                           if ( SUCCEEDED ( hr ))
                                 hr = createdUser->put_FullName ( L"User's Full Name" );

                           if ( SUCCEEDED ( hr ))
                                 hr = createdUser->SetInfo ( );

                           if ( SUCCEEDED ( hr ))
                           {
                                 // since everything else was set, now try to
                                 // expire the password so the user has to change
                                 // it on first log on
                                 _variant_t pswdExpiration;

                                 createdUser->Get ( pswdExpiredText, &pswdExpiration );
                                 pswdExpiration.boolVal = -1;

                                 createdUser->Put ( pswdExpiredText, pswdExpiration );
                                 retVal = createdUser->SetInfo ( );

                                 pswdExpiration.Clear ( );
                           }

                           // cleanup the user pointer
                           createdUser->Release ( );
                     }

                     // cleanup the dispatch pointer
                     newUserPtr->Release ( );
               }

               // cleanup the domain pointer
               domainContainer->Release ( );
         }            
   }

   // free the strings we created earlier
   if ( pswdExpiredText != NULL )
         SysFreeString ( pswdExpiredText );

   if ( userClass != NULL )
         SysFreeString ( userClass );

   if ( SUCCEEDED ( hr ))
         printf ( "Created User\n" );
   else
         printf ( "Did NOT Create User\n" );

   CoUninitialize ( );

   return retVal;
}



Copyright © 2005 - 2013 Dave Moats.  All rights reserved.  Links: Copyright © by their respective owners.
NO WARRANTIES EXTENDED.  Void where prohibited by law.  Please report any issues or broken links.
You may link to this site freely from your own site.  You may quote from this site, but please include a link to the original source on the originating site.