Visual Basic Network Services
NetLocalGroupEnum: Enumerate Local Groups and Descriptions
Posted:   Thursday April 19, 2001
Updated:   Monday December 26, 2011
Applies to:   VB4-32, VB5, VB6
Developed with:   VB6, Windows 2000
OS restrictions:   Windows NT4 / Windows 2000, Windows XP
Author:   VBnet - Randy Birch


NetLocalGroupEnum: Enumerate Local Groups
Network connection to a domain controller, and/or an operating system listed above.

NetLocalGroupEnum, one of Windows Network Management Functions, returns information about each local group account on the specified server. Unlike the demo using the LOCALGROUP_INFO_0 structure, this demo uses the LOCALGROUP_INFO_1 structure which contains an additional member - the description associated with the user group.

On Windows NT, no special group membership is required to successfully execute the NetLocalGroupEnum function. However, on Windows 2000/XP, if you call this function on a Windows 2000/XP domain controller running Active Directory, access is allowed or denied based on the access-control list (ACL) for the securable object. The default ACL permits all authenticated users and members of the "Pre-Windows 2000 compatible access" group to view the information. By default, the "Pre-Windows 2000 compatible access" group includes Everyone as a member. This enables anonymous access to the information if the system allows anonymous access.

If you call this function on a Windows 2000/XP member server or workstation, all authenticated users can view the information. Anonymous access is also permitted if the RestrictAnonymous policy setting allows anonymous access.

servername  [in] Pointer to a constant Unicode string specifying the name of the remote server on which the function is to execute. The string must begin with \\. If this parameter is NULL, the local computer is used

level  [in] Specifies the information level of the data. This parameter can be one of the following values.

Value Meaning
0 Return local group names. The bufptr parameter points to an array of LOCALGROUP_INFO_0 structures.
1 Return local group names and the comment associated with each group. The bufptr parameter points to an array of LOCALGROUP_INFO_1 structures.

bufptr  [out] Pointer to the address of the buffer that receives the information structure. The format of this data depends on the value of the level parameter. This buffer is allocated by the system and must be freed using the NetApiBufferFree function. Note that you must free the buffer even if the function fails with ERROR_MORE_DATA.

prefmaxlen  [in] Specifies the preferred maximum length of returned data, in bytes. If you specify MAX_PREFERRED_LENGTH, the function allocates the amount of memory required for the data. If you specify another value in this parameter, it can restrict the number of bytes that the function returns. If the buffer size is insufficient to hold all entries, the function returns ERROR_MORE_DATA. For more information, see Network Management Function Buffers and Network Management Function Buffer Lengths in the MSDN.

entriesread  [out] Pointer to a DWORD value that receives the count of elements actually enumerated.

totalentries  [out] Pointer to a DWORD value that receives the approximate total number of entries that could have been enumerated from the current resume position. For more information, see the following Remarks section.

resumehandle  [in/out] Pointer to a value that contains a resume handle that is used to continue an existing local group search. The handle should be zero on the first call and left unchanged for subsequent calls. If this parameter is NULL, then no resume handle is stored. For more information, see the following Remarks section.

Return Values  If the function succeeds, the return value is NERR_Success. If the function fails, the return value can be one of the following error codes: ERROR_ACCESS_DENIED, ERROR_MORE_DATA, NERR_InvalidComputer or NERR_BufTooSmall.

 BAS Module Code

 Form Code
To a form, add a listview (ListView1) and a command button (Command1). Add the following code:

Option Explicit
' Copyright 1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
' Distribution: You can freely use this code in your own
'               applications, but you may not reproduce 
'               or publish this code on any web site,
'               online service, or distribute as source 
'               on any media without express permission.
'Windows type used to call the Net API
Private Const MAX_PREFERRED_LENGTH As Long = -1
Private Const NERR_SUCCESS As Long = 0&
Private Const ERROR_MORE_DATA As Long = 234&

  lgrpi1_name     As Long
  lgrpi1_comment  As Long
End Type

Private Declare Function NetLocalGroupEnum Lib "netapi32" _
  (servername As Byte, _
   ByVal Level As Long, _
   buff As Long, _
   ByVal buffsize As Long, _
   entriesread As Long, _
   totalentries As Long, _
   resumehandle As Long) As Long
Private Declare Function NetApiBufferFree Lib "netapi32" _
  (ByVal lpBuffer As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
   Alias "RtlMoveMemory" _
  (pTo As Any, uFrom As Any, _
   ByVal lSize As Long)
Private Declare Function lstrlenW Lib "kernel32" _
  (ByVal lpString As Long) As Long

Private Sub Form_Load()

   Command1.Caption = "Enum w/Description"
   With ListView1
      .ColumnHeaders.Add , , "Group Name"
      .ColumnHeaders.Add , , "Description"
      .ColumnHeaders.Item(1).Width = 2000
      .ColumnHeaders.Item(2).Width = 3800
      .View = lvwReport
      .FullRowSelect = True
   End With

End Sub

Private Sub Command1_Click()

   Dim bServer()  As Byte
   Dim tmp        As String
   bServer = "\\workstation" & vbNullChar
  'required to show server in caption
   tmp = bServer
   Label1.Caption = GetLocalGroupsAndDescription(bServer) & _
                    " local groups found on " & tmp
End Sub

Private Function GetLocalGroupsAndDescription(bServer() As Byte) As Long

   Dim bufptr        As Long
   Dim entriesread   As Long
   Dim totalentries  As Long
   Dim success       As Long
   Dim resumehandle  As Long
   Dim nStructSize   As Long
   Dim cnt           As Long
   Dim itmx          As ListItem
   Dim lgis          As LOCALGROUP_INFO_1
   nStructSize = Len(lgis)
   success = NetLocalGroupEnum(bServer(0), _
                               1, bufptr, _
                               MAX_PREFERRED_LENGTH, _
                               entriesread, _
                               totalentries, _

   If success = NERR_SUCCESS And _
      success <> ERROR_MORE_DATA Then
      For cnt = 0 To entriesread - 1
        'get one chunk of data and cast
        'into an LOCALGROUP_INFO_1 type
         CopyMemory lgis, ByVal bufptr + (nStructSize * cnt), nStructSize
        'add the group name and comment to the listview
         Set itmx = ListView1.ListItems.Add(, , GetPointerToByteStringW(lgis.lgrpi1_name))
         itmx.SubItems(1) = GetPointerToByteStringW(lgis.lgrpi1_comment)
   End If
   GetLocalGroupsAndDescription = entriesread

End Function

Public Function GetPointerToByteStringW(ByVal dwData As Long) As String
   Dim tmp() As Byte
   Dim tmplen As Long
   If dwData <> 0 Then
      tmplen = lstrlenW(dwData) * 2
      If tmplen <> 0 Then
         ReDim tmp(0 To (tmplen - 1)) As Byte
         CopyMemory tmp(0), ByVal dwData, tmplen
         GetPointerToByteStringW = tmp
     End If
   End If
End Function


PayPal Link
Make payments with PayPal - it's fast, free and secure!


Copyright 1996-2011 VBnet and Randy Birch. All Rights Reserved.
Terms of Use  |  Your Privacy


Hit Counter