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 |
1 | Получить информацию о пользователях. Параметр SortedBuffer указывает на массив структуры NET_DISPLAY_USER |
2 | Получить информацию о компьютере. Параметр SortedBuffer указывает на массив структуры NET_DISPLAY_MACHINE |
3 | Получить информацию о группе. Параметр SortedBuffer указывает на массив структуры NET_DISPLAY_GROUP |
' Установите на форме список 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