|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | |
Related: |
NetLocalGroupEnum: Enumerate Local Groups | |
Prerequisites | ||||||
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. 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.
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 | ||||||
None. | ||||||
|
||||||
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& Private Type LOCALGROUP_INFO_1 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 ListView1.ListItems.Clear 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, _ resumehandle) 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) Next 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 |
||||||
Comments | ||||||
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |