Atlanta Custom Software Development 

 
   Search        Code/Page
 

User Login
Email

Password

 

Forgot the Password?
Services
» Web Development
» Maintenance
» Data Integration/BI
» Information Management
Programming
  Database
Automation
OS/Networking
Graphics
Links
Tools
» Regular Expr Tester
» Free Tools

How to Add/Remove NT user account programatically

Total Hit ( 5501)

Rate this article:     Poor     Excellent 

 Submit Your Question/Comment about this article

Rating


 


This article will show you use of NetUserAdd and NetUserDel API to add/remove useraccount.

Windows NT and Windows 2000 exposes LanMan 32-bit Application Programming Interfaces (APIs) to provide network services. These APIs are called only from 32-bit programs running on a Windows NT or Windows 2000 and are used to control both the local and remote Windows NT (or Windows 2000) machines that you have permission to access.

Note:
WhileWindows2000supportsLanManAPIsforbackwardscompatibilityitisrecommendedthatADSIbeusedinsteadformostofthefunctionsbelow.FormoreinformationaboutADSIsearchforActiveDirectoryServicesInterfaceorADSIintheMicrosoftKnowledgeBaseorMSDN
This article contains code examples of using the following LanMan APIs:
NetUserAddusingLevel1structureNetUserDelNetAPIBufferFreeNetAPIBufferAllocat
Note: LAN Manager APIs use various level of structures. You can use any supported level depending on information required. For example in this article i have used NetUserAdd API with level-1 structure USER_INFO_1 but you can also use USER_INFO_2, USER_INFO_3 or USER_INFO_4 depending on information you want to specify when you add the user account.

Although, Visual Basic stores strings internally as UNICODE, it converts them to ANSI when it calls APIs. Normally this isn't a problem because most 32-bit APIs have both an ANSI and a UNICODE version. However, LanMan APIs only support UNICODE. The code snippet below demonstrates how to use Byte arrays to pass UNICODE parameters.

Instead of using strings, for example:

Click here to copy the following block
X = My_ANSI_API("Some String")


use Byte arrays, such the one below, because they aren't converted to ANSI:

Click here to copy the following block
Dim Temp() As Byte, Message As String
Message = "Some String"
Temp = Message & vbNullChar   '
MyUnicodeAPI Temp(0)
Message = Temp         ' modified me

Now lets check the actual code which will first add sample user TestUser1 on local machine and then it will delete that account.

Step-By-Step Example

- Create a standard exe project
- Add the following code in form1

Click here to copy the following block
Const NERR_BASE = 2100
Const ERROR_ACCESS_DENIED = 5&
Const NERR_GroupExists = (NERR_BASE + 123)
Const NERR_InvalidComputer = (NERR_BASE + 251)
Const NERR_NotPrimary = (NERR_BASE + 126)
Const NERR_PasswordTooShort = (NERR_BASE + 145)
Const NERR_UserExists = (NERR_BASE + 124)
Const NERR_UserNotFound = (NERR_BASE + 121)

' for dwPriv
Const USER_PRIV_MASK = &H3
Const USER_PRIV_GUEST = &H0
Const USER_PRIV_USER = &H1
Const USER_PRIV_ADMIN = &H2

' for dwFlags
Const UF_SCRIPT = &H1
Const UF_ACCOUNTDISABLE = &H2
Const UF_HOMEDIR_REQUIRED = &H8
Const UF_LOCKOUT = &H10
Const UF_PASSWD_NOTREQD = &H20
Const UF_PASSWD_CANT_CHANGE = &H40
Const UF_NORMAL_ACCOUNT = &H200  ' Needs to be ORed with the
' other flags
'.. .. ..
'.. .. ..

Private Type USER_INFO_0          ' Level 0
  ptrname As Long
End Type

Private Type USER_INFO_1          ' Level 1
  ptrname As Long
  ptrPassword As Long
  dwPasswordAge As Long
  dwPriv As Long
  ptrHomeDir As Long
  ptrcomment As Long
  dwFlags As Long
  ptrScriptPath As Long
End Type

Private Declare Function NetAPIBufferFree Lib "NETAPI32.dll" Alias _
    "NetApiBufferFree" (ByVal Ptr As Long) As Long

Private Declare Function NetAPIBufferAllocate Lib "NETAPI32.dll" Alias _
    "NetApiBufferAllocate" (ByVal ByteCount As Long, Ptr As Long) As Long

Private Declare Function StrToPtr Lib "Kernel32" Alias "lstrcpyW" _
    (ByVal Ptr As Long, Source As Byte) As Long

' Add using Level 1 user/group structure
Private Declare Function NetUserAdd1 Lib "NETAPI32.dll" Alias "NetUserAdd" _
    (servername As Byte, ByVal level As Long, Buffer As USER_INFO_1, ParmError As Long) As Long

Private Declare Function NetUserDel Lib "NETAPI32.dll" (servername As Byte, _
    UserName As Byte) As Long

Function DelUser(ByVal servername As String, ByVal UserName As String) As Long
  Dim UNArray() As Byte, SNArray() As Byte
  UNArray = UserName & vbNullChar
  SNArray = servername & vbNullChar
  DelUser = NetUserDel(SNArray(0), UNArray(0))
End Function

Function AddUser(ByVal servername As String, ByVal UserName As String, _
  ByVal PWD As String) As Long

  Dim result As Long, UNPtr As Long, PWDPtr As Long, ParmError As Long
  Dim SNArray() As Byte, UNArray() As Byte, PWDArray() As Byte
  Dim UserStruct As USER_INFO_1
  '
  ' Move to byte arrays
  '
  SNArray = servername & vbNullChar
  UNArray = UserName & vbNullChar
  PWDArray = PWD & vbNullChar
  '
  ' Allocate buffer space
  '
  result = NetAPIBufferAllocate(UBound(UNArray) + 1, UNPtr)
  result = NetAPIBufferAllocate(UBound(PWDArray) + 1, PWDPtr)
  '
  ' Copy arrays to the buffer
  '
  result = StrToPtr(UNPtr, UNArray(0))
  result = StrToPtr(PWDPtr, PWDArray(0))
  '
  ' Fill the structure
  '
  With UserStruct
    .ptrname = UNPtr
    .ptrPassword = PWDPtr
    .dwPasswordAge = 3
    .dwPriv = USER_PRIV_USER
    .ptrHomeDir = 0
    .ptrcomment = 0
    .dwFlags = UF_NORMAL_ACCOUNT Or UF_SCRIPT
    .ptrScriptPath = 0
  End With
  '
  ' Add the user
  '
  result = NetUserAdd1(SNArray(0), 1, UserStruct, ParmError)
  AddUser = result
  If result <> 0 Then
    Debug.Print "Error " & result & " in parameter " & ParmError _
        & " when adding user " & UserName
  End If
  '
  ' Release buffers from memory
  '
  result = NetAPIBufferFree(UNPtr)
  result = NetAPIBufferFree(PWDPtr)
End Function

Function GetError(errCode As Long) As String
  Select Case errCode
    Case NERR_InvalidComputer
      GetError = "The computer name is invalid."
    Case NERR_NotPrimary
      GetError = "The operation is allowed only on the primary domain controller of the domain."
    Case NERR_PasswordTooShort
      GetError = "The password is shorter than required according to policy."
    Case NERR_UserExists
      GetError = "The user name already exists."
    Case NERR_GroupExists
      GetError = "The group name already exists."
    Case NERR_UserNotFound
      GetError = "The user name could not be found."
    Case ERROR_ACCESS_DENIED
      GetError = "Access is denied"
    Case Else
      GetError = "Error#" & Err.LastDllError
  End Select
End Function

Private Sub Form_Load()
  Dim ret As Long

  '//Note: If server is remote machine then you must specify name starting with "\\"
  '//You can leave servername blank or put "." if its local machine
  ret = AddUser(".", "TestUser1", "pwd123")
  If ret = 0 Then
    MsgBox "User added", vbInformation
  Else
    MsgBox GetError(ret)
    Exit Sub
  End If

  ret = MsgBox("Do you want to delete the user which you just added?", vbQuestion + vbYesNo)
  If ret = vbYes Then
    ret = DelUser(".", "TestUser1")
    If ret = 0 Then
      MsgBox "User Deleted", vbInformation
    Else
      MsgBox GetError(ret)
      Exit Sub
    End If
  End If
End Sub


Submitted By : Nayan Patel  (Member Since : 5/26/2004 12:23:06 PM)

Job Description : He is the moderator of this site and currently working as an independent consultant. He works with VB.net/ASP.net, SQL Server and other MS technologies. He is MCSD.net, MCDBA and MCSE. In his free time he likes to watch funny movies and doing oil painting.
View all (893) submissions by this author  (Birth Date : 7/14/1981 )


Home   |  Comment   |  Contact Us   |  Privacy Policy   |  Terms & Conditions   |  BlogsZappySys

© 2008 BinaryWorld LLC. All rights reserved.