Categories: MSDN / DotNet / Java / Scripts / Linux / PHP Ask - La ask - La Answer

cant get it to work

Craig, I appreciate your help, but I just can't get it to work, here my modified
code after your suggestion, now I am using structure USER_INFO_20

Craig Clearman <chclear@nospam.please> wrote:
>Mike,
>
>>Private Type USER_INFO_11
>> usri11_name As Long
>> usri11_full_name As Long
>>End Type
>
>That's not the structure of USER_INFO_11.
>
>> dwLevel = 0
>
>And, you're passing level zero, not level 11.
>
>Ciao, Craig
===========================================================

Option Explicit

'Private Type USER_INFO_0
' usri0_name As Long
'End Type
Private Type USER_INFO_20
usri20_name As Long
usri20_full_name As Long
usri20_comment As Long
usri20_flags As Long
usri20_user_id As Long
End Type

Private Declare Function apiNetUserEnum _
Lib "netapi32.DLL" Alias "NetUserEnum" _
(ByVal servername As Long, _
ByVal level As Long, _
ByVal filter As Long, _
bufptr As Long, _
ByVal prefmaxlen As Long, _
entriesread As Long, _
totalentries As Long, _
resume_handle As Long) _
As Long

Private Declare Function apiNetAPIBufferFree _
Lib "netapi32.DLL" Alias "NetApiBufferFree" _
(ByVal buffer As Long) _
As Long

Private Declare Function apilstrlenW _
Lib "kernel32" Alias "lstrlenW" _
(ByVal lpString As Long) _
As Long

Private Declare Sub sapiCopyMem _
Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)

Private Const FILTER_TEMP_DUPLICATE_ACCOUNT = &H1&
Private Const FILTER_NORMAL_ACCOUNT = &H2&
Private Const FILTER_INTERDOMAIN_TRUST_ACCOUNT = &H8&
Private Const FILTER_WORKSTATION_TRUST_ACCOUNT = &H10&
Private Const FILTER_SERVER_TRUST_ACCOUNT = &H20&
Private Const MAX_PREFERRED_LENGTH = -1&

Private Const NERR_SUCCESS = 0
Private Const ERROR_MORE_DATA = 234&
Private Const NERR_BASE = 2100
Private Const NERR_InvalidComputer = (NERR_BASE + 251)
Private Const ERROR_BAD_NETPATH = 53&
Private Const ERROR_INVALID_LEVEL = 124&

Function fEnumDomainUsers( _
ByVal strServerName As String) _
As Boolean
' if strServerName=vbNullString,
' assume local machine
' This code only enums global accounts
'
On Error GoTo ErrHandler

Dim abytServerName() As Byte
Dim pBuf As Long
'Dim pTmpBuf As USER_INFO_0
Dim pTmpBuf As USER_INFO_20
Dim dwLevel As Long
Dim dwPrefMaxLen As Long
Dim dwEntriesRead As Long
Dim dwTotalEntries As Long
Dim dwResumeHandle As Long
Dim i As Long
Dim dwTotalCount As Long
Dim nStatus As Long

Dim szName As String
Dim szFullName As String

Dim iRecordsAffected As Integer

' assume MAX_PREFERRED_LENGTH
dwPrefMaxLen = MAX_PREFERRED_LENGTH
abytServerName = strServerName & vbNullChar
dwLevel = 20
Do
'only global users
nStatus = apiNetUserEnum(VarPtr(abytServerName(0)), _
dwLevel, _
FILTER_NORMAL_ACCOUNT, _
pBuf, _
dwPrefMaxLen, _
dwEntriesRead, _
dwTotalEntries, _
dwResumeHandle)
'// If the call succeeds,
If ((nStatus = NERR_SUCCESS) Or (nStatus = ERROR_MORE_DATA)) Then
'// Loop through the entries.
For i = 0 To dwEntriesRead - 1
Call sapiCopyMem(pTmpBuf, ByVal (pBuf + (i * 4)), Len(pTmpBuf))
'// Print the name of the user account.
szName = String$(apilstrlenW(pTmpBuf.usri20_name) * 2, vbNullChar)
szFullName = String$(apilstrlenW(pTmpBuf.usri20_full_name)
* 2, vbNullChar)

Call sapiCopyMem(ByVal szName, ByVal pTmpBuf.usri20_name, Len(szName))
Call sapiCopyMem(ByVal szFullName, ByVal pTmpBuf.usri20_full_name,
Len(szFullName))

Debug.Print StrConv(szName, vbFromUnicode)
Debug.Print StrConv(szFullName, vbFromUnicode)

szName = StrConv(szName, vbFromUnicode)
szFullName = StrConv(szFullName, vbFromUnicode)

dwTotalCount = dwTotalCount + 1
Next
End If

MsgBox dwTotalCount

If (nStatus = NERR_InvalidComputer) Then
'Invalid computer
fEnumDomainUsers = False
MsgBox "Invalid computer"
Exit Function
End If

If (nStatus = ERROR_BAD_NETPATH) Then
'Invalid computer
fEnumDomainUsers = False
MsgBox "BAD NETPATH"
Exit Function

End If
Call apiNetAPIBufferFree(pBuf)
pBuf = 0
Loop While (nStatus = ERROR_MORE_DATA)
If Not (pBuf = 0) Then Call apiNetAPIBufferFree(pBuf)

fEnumDomainUsers = True
ExitHere:
Exit Function
ErrHandler:
fEnumDomainUsers = False
Resume ExitHere
End Function

Private Sub Form_Load()

'As a parameter you have to specify a Server name
'If this parameter is Null(Empty String) then Default will be
'your workstation's name.
'Example fEnumDomainUsers ("\\Server")
fEnumDomainUsers ("\\Server")

End Sub
[5203 byte] By [Mike] at [2007-11-10 0:20:06]
# 1 Re: cant get it to work
Mike,

>Craig, I appreciate your help, but I just can't get it to work, here my modified
>code after your suggestion, now I am using structure USER_INFO_20

Let me guess. It works for the first, but starts failing then?

That's because you are walking the pointer with the wrong size:

Use:
Call sapiCopyMem(pTmpBuf, ByVal (pBuf + (i *
Len(pTmpBuf))), Len(pTmpBuf))

Instead of i * 4.

The structure is now 20 bytes long, not four.

Ciao, Craig
Craig Clearman at 2007-11-11 20:04:13 >
# 2 Re: cant get it to work
Mike,

>Craig, I appreciate your help, but I just can't get it to work, here my modified
>code after your suggestion, now I am using structure USER_INFO_20

Let me guess. It works for the first, but starts failing then?

That's because you are walking the pointer with the wrong size:

Use:
Call sapiCopyMem(pTmpBuf, ByVal (pBuf + (i *
Len(pTmpBuf))), Len(pTmpBuf))

Instead of i * 4.

The structure is now 20 bytes long, not four.

Ciao, Craig
Craig Clearman at 2007-11-11 20:05:19 >