Функция NetQueryDisplayInformation

Declare Function NetQueryDisplayInformation Lib "netapi32.dll" (ByVal lpwServername As String,  ByVal dwLevel As Long, ByVal dwIndex As Long, ByVal dwReqEntries As Long, ByVal dwMaxLength As Long,  pdwNumEntries As Long, pBuffer As Any) As Long

NetQueryDisplayInformation служит для получения информации пользователе, компьютере, группе

Возвращаемое значение

В успешном случае функция возвращает NERR_Success. В случае ошибки функция возвращает следующие коды ошибок
Код ошибкиОписание
ERROR_ACCESS_DENIEDДоступ отклонен
ERROR_INVALID_LEVELПараметр Level имеет неправильное значение
ERROR_MORE_DATAДанная ошибка сигнализирует о том, что на сервере доступно больше ячеек информации. Это говорит о том, что параметр SortedBuffer содержит не последнюю доступную ячейку информации. Для получения дополнительных данных, необходимо вызвать NetQueryDisplayInformation заново с параметром Index , содержащем значение, возвращённое в next_index члене последней ячейки в SortedBuffe

Параметры

lpwServername
Указатель на Unicode-строку, содержащую имя удаленного сервера. Строка должна начинаться с \\. При использовании локального компьютера используйте 0
dwLevel
Уровень получаемой информации. Может иметь одно из следующих значений
1Получить информацию о пользователях. Параметр SortedBuffer указывает на массив структуры NET_DISPLAY_USER
2Получить информацию о компьютере. Параметр SortedBuffer указывает на массив структуры NET_DISPLAY_MACHINE
3Получить информацию о группе. Параметр SortedBuffer указывает на массив структуры NET_DISPLAY_GROUP
dwIndex
Определяет индекс первой записи, для которой получается информация. Установите в 0 для получения информации об эккаунте, начиная с первой записи
dwReqEntries
Определяет максимальное число записей, для которых получается информация. В Windows 2000, каждый вызов NetQueryDisplayInformation возвращает максимум 100 объектов
dwMaxLength
Задает максимальный размер в байтах буфера SortedBuffer. Рекомендуется использовать значение 0xFFFFFFFF
pdwNumEntries
Число записей в буфере SortedBuffer. Если параметр равен 0, значит нет записей с индексом, больше чем определено
pBuffer
Буфер, определящий отсортированный список запрашиваемой информации. Формат данных зависит от параметра Level. Необходимо освобождать этот буфер при помощи NetApiBufferFree. (Даже если функция потерпело неудачу, возвратив ошибку ERROR_MORE_DATA)

Пример

' Установите на форме список List1
' который будет выводить список пользователей, серверов или групп
' А также два текстовых поля txtPageSize и txtTotal
' txtPageSize выводит число данных на страницу
' txtTotal - общее количество элементов списка
' Также нужны две кнопки btnRun и btnExit
' btnRun вызывает NetQueryDisplayInformation
' а btnExit закрывает приложение
' Еще нужна одна рамка Frame1, в которой расположены
' три переключателя optUser, optMachine, optGroup

Private Declare Sub CopyMem Lib "KERNEL32" Alias "RtlMoveMemory" ( _
        hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

Private Declare Function CopyString Lib "KERNEL32" Alias "lstrcpyW" ( _
        ByVal NewString As String, ByVal OldString As Long) As Long

Private Const NET_USER = 1
Private Const NET_MACHINE = 2
Private Const NET_GROUP = 3
Private Const ERROR_MORE_DATA = 234
Private Const REQUESTED_ENTRIES = 5
Private Const MAX_PREFERRED_LENGTH = &HFFFF

Private Type NET_DISPLAY_USER
    usri1_name As Long      'lpwstr
    usri1_comment As Long   'lpwstr
    usri1_flags As Long
    usri1_full_name As Long 'lpwstr
    usri1_user_id As Long
    usri1_next_index As Long
End Type

Private Type NET_DISPLAY_GROUP
    grpi3_name As Long      'lpwstr
    grpi3_comment As Long   'lpwstr
    grpi3_group_id As Long
    grpi3_attributes As Long
    grpi3_next_index As Long
End Type

Private Type NET_DISPLAY_MACHINE
    usri2_name As Long      'lpwstr
    usri2_comment As Long   'lpwstr
    usri2_flags As Long
    usri2_user_id As Long
    usri2_next_index As Long
End Type

Private Sub btnExit_Click()
    Unload Me
End Sub

Private Sub btnRun_Click()

    Dim pndu() As NET_DISPLAY_USER
    Dim pndm() As NET_DISPLAY_MACHINE
    Dim pndg() As NET_DISPLAY_GROUP
    Dim pszTemp As String, pszServer As String
    Dim pBuffer As Long
    Dim lLevel As Long
    Dim lResult As Long
    Dim lIndex As Long
    Dim lNumEntries As Long
    Dim lTotalEntries As Long
    
    List1.Clear
    
' Получим имя удаленного компьютера. Можно использовать пустую строку
    pszTemp = Chr(0)
    pszTemp = InputBox("Введите имя домена: (например, \\domain-01)", "Русский_Проект")
    If Len(pszTemp) = 0 Then
        pszServer = vbNullString
    Else
        pszServer = StrConv(pszTemp, vbUnicode)
    End If
    
    lIndex = 0
    lTotalEntries = 0
    lNumEntries = 0
    lResult = ERROR_MORE_DATA
    
    If (txtPageSize < 1) Then
        txtPageSize = REQUESTED_ENTRIES
    End If
    
    If (optUser = True) Then
        While lResult = ERROR_MORE_DATA
            List1.AddItem "---------------"
            lResult = NetQueryDisplayInformation(pszServer, NET_USER, lIndex, _
                        txtPageSize, MAX_PREFERRED_LENGTH, lNumEntries, pBuffer)
         
            If lResult = 0 Or lResult = ERROR_MORE_DATA Then
                If lNumEntries > 0 Then
                    ReDim pndu(lNumEntries - 1)
' Копируем информацию в удобный для VB формат
                    CopyMem pndu(0), ByVal pBuffer, Len(pndu(0)) * lNumEntries
                    
                    For i = 0 To lNumEntries - 1
                        List1.AddItem PointerToString(pndu(i).usri1_name)
                    Next
                    
' Get index for next iteration
                    lIndex = pndu(i - 1).usri1_next_index
                End If
            Else
                MsgBox "Ошибка: " & lResult
            End If
            
            If pBuffer Then
' Освобождаем буфер NetAPI
                NetApiBufferFree (pBuffer)
            End If
            
            lTotalEntries = lNumEntries + lTotalEntries
        Wend
    ElseIf (optMachine = True) Then
        While lResult = ERROR_MORE_DATA
            List1.AddItem "---------------"
            lResult = NetQueryDisplayInformation(pszServer, NET_MACHINE, lIndex, _
                        txtPageSize, MAX_PREFERRED_LENGTH, lNumEntries, pBuffer)
         
            If lResult = 0 Or lResult = ERROR_MORE_DATA Then
                If lNumEntries > 0 Then
                    ReDim pndm(lNumEntries - 1)
' Копируем информацию в удобный для VB формат
                    CopyMem pndm(0), ByVal pBuffer, Len(pndm(0)) * lNumEntries
                    
                    For i = 0 To lNumEntries - 1
                        List1.AddItem PointerToString(pndm(i).usri2_name)
                    Next
                    
                    '/* Get index for next iteration
                    lIndex = pndm(i - 1).usri2_next_index
                End If
            Else
                MsgBox "Ошибка: " & lResult
            End If
            
            If pBuffer Then
' Освобождаем буфер NetAPI
                NetApiBufferFree (pBuffer)
            End If
            
            lTotalEntries = lNumEntries + lTotalEntries
        Wend
    ElseIf (optGroup = True) Then
        While lResult = ERROR_MORE_DATA
            List1.AddItem "---------------"
            lResult = NetQueryDisplayInformation(pszServer, NET_GROUP, lIndex, _
                        txtPageSize, MAX_PREFERRED_LENGTH, lNumEntries, pBuffer)
         
            If lResult = 0 Or lResult = ERROR_MORE_DATA Then
                If lNumEntries > 0 Then
                    ReDim pndg(lNumEntries - 1)
' Копируем информацию в удобный для VB формат
                    CopyMem pndg(0), ByVal pBuffer, Len(pndg(0)) * lNumEntries
                    
                    For i = 0 To lNumEntries - 1
                        List1.AddItem PointerToString(pndg(i).grpi3_name)
                    Next
                    
                    '/* Get index for next iteration
                    lIndex = pndg(i - 1).grpi3_next_index
                End If
            Else
                MsgBox "Ошибка: " & lResult
            End If
            
            If pBuffer Then
' Освобождаем буфер NetAPI
                NetApiBufferFree (pBuffer)
            End If
            
            lTotalEntries = lNumEntries + lTotalEntries
        Wend
    Else
        MsgBox "Неверный level!"
    End If

    txtTotal.Text = lTotalEntries
End Sub

Private Function PointerToString(lpszString As Long) As String
    Dim Temp1 As String, res As Long, Temp2 As String
    Temp1 = String(1000, "*")
    res = CopyString(Temp1, lpszString)
    Temp2 = (StrConv(Temp1, vbFromUnicode))
    PointerToString = Left(Temp2, InStr(Temp2, Chr$(0)) - 1)
End Function

Смотри также

NetUserEnum, NetGroupEnum

Категория

Network Management