Список пользователей в Active Directory

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Список пользователей в Active Directory

Сообщение Леонид »

Добрый день!

C6 9058 ABC

Собственно subj.
Есть красивое решение от WadimZapara (http://forum.clarionlife.net/phpbb/view ... tory#p9933), но т.к. я ни разу не работал с ADO - есть непонятки (а дока по этому делу практически отстутствует в Help-е)

В частности, в примере, кусок кода:

MAP
MODULE('OCXWork.dll')
INCLUDE('OCXWork.inc')
END
END

Что-то за DLL-ка и inc-файл?

С уважением Мартюшев Леонид
LeonidMV@yandex.ru
leonid@007.pfr.ru
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Список пользователей в Active Directory

Сообщение WadimZapara »

Это был дан не пример, а работоспособная функция

! - это комментарии с примером работы
упомянутая в комментариях DLL - та, в которой реализована у меня эта функция
упомянутый в комментариях INC - соответственно, тот файл, где содержится описание (заголовок) этой функции

вставлены комментарии прямо из моего inc-файла - в спешке не затёр лишнего

если нужны функции определения DNS-имени: / GetNetInfo() /
и имени пользователя / GetLoginName() /
- так и скажи

а LDAP_User() дана полностью рабочая и готовая к употреблению (и параметры прокомментированы)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Список пользователей в Active Directory

Сообщение WadimZapara »

Код: Выделить всё

  MAP
    MODULE('WINDOWS')
      GetUserName(*CString, *ULong),BOOL,RAW,PASCAL,DLL(TRUE),NAME('GetUserNameA')
    END
    GetLoginName Function(),String
  END

GetLoginName Function() !,String
Buff CString(256)
LenB ULong(255)
  Code
  If ~GetUserName(Buff, LenB) Then Buff = ''.
  Return (Buff)
Это узнаёт Login пользователя, запустившего программу с этим вызовом.
Для решения задачи "получить список пользователей AD" - данная функция не поможет.
Вторая, кстати, - тоже. (тебе ведь известно DNS-имя домена)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Список пользователей в Active Directory

Сообщение WadimZapara »

Так, что правке под твои нужды подлежит функция LDAP_User (которая в предложенном виде ищет инфу о заданном пользователе в заданном домене).

нужно строчку Execute изменить как-то так:

Код: Выделить всё

'Execute("SELECT samAccountName FROM ''LDAP://' & DomainNameWithPoints &''' WHERE objectCategory=''user''")'
а потом в цикле, пока objConnection{objRecordset &'.EOF()'} <> '-1' получать Login-ы
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 17:07

Re: Список пользователей в Active Directory

Сообщение Леонид »

Спастбо. Буду разбираться. Но и функции GetUserName, GetLoginName думаю пригодятся. Кто ж знает, что еще попросят
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Список пользователей в Active Directory

Сообщение WadimZapara »

пользуйтесь, кому понравится... (100% рабочий код)

Код: Выделить всё

WSADESCRIPTION_LEN  Equate(256)
WSASYS_STATUS_LEN   Equate(128)

TWSAData  Group, Type        !ТИП СТРУКТУРЫ ДЛЯ ОРГАНИЗАЦИИ РАБОТЫ С ФУНКЦИЯМИ NET API
wVersion       Short
wHighVersion   Short
szDescription  CString(WSADESCRIPTION_LEN + 1)
szSystemStatus CString(WSASYS_STATUS_LEN + 1)
iMaxSockets    UnSigned
iMaxUdpDg      UnSigned
lpVendorInfo   Long
          End

PHostEnt  Group, Type        ! ТИП СТРУКТУРЫ, ССЫЛКУ НА КОТОРУЮ ВОЗВРАЩАЕТ GetHostByName
h_name         ULong        ! PChar
h_aliases      ULong        ! ^PChar           - указатель на массив
h_addrtype     UShort       ! Smallint (2b)
h_length       UShort       ! Smallint (2b)
h_addr_list    ULong        ! ^PChar           - указатель на массив
          End

    MAP
       MODULE('Windows')
         WSAStartup    (Short, *Group), Signed,PASCAL,RAW     ! Подключение к NET API
         WSACleanup    (), Signed,PASCAL                      ! Отключение от NET API
         GetHostName   (*CString, Signed), Signed,PASCAL,RAW  ! Получение имени КОМПА
         GetHostByName (*CString), *Group,PASCAL,RAW          ! Получение сетевой информации КОМПА
         inet_ntoa     (ULong), *CString,PASCAL,RAW           ! Перевод IP в читаемый вид
       END
       GetNetInfo    (*CString DNSName, *Byte NumAdapters, *CString IPstr), Byte, Name('GetNetInfo@ZWM_Function')
       GetValFromAddr(String Type_WCS124L6R8, ULong addr, Long Leng=-1), ?, Name('GetValFromAddr@ZWM_Function')
    END

!==========================================================================================
GetNetInfo           FUNCTION (*CString DNSName, *Byte NumAdapters, *CString IPstr) 
!==========================================================================================
WSAData Like(TWSAData)
str     CString(WSADESCRIPTION_LEN + 1)
p       &PHostEnt

pcs     &CString
aN      Ulong
a       ULong
ipl     ULong
Ok      Byte(TRUE)

  CODE

  Clear(DNSName); Clear(NumAdapters); Clear(IPstr)
  If WSAStartUp(101h, WSAData) Then         ! ERROR
    Clear(Ok)
  Else                                      ! нет ошибки подключения, продолжаем...
     If GetHostName(str,0FFh) Then          ! ERROR
       Clear(Ok)
     Else                                   ! в "str" имя MACHINE
        p &= Address(GetHostByName(str))    ! в структуре "p" - данные об этом компе
        If p &= NULL Then                   ! ERROR
          Clear(Ok)
        Else
          DNSName = GetValFromAddr('C', p.h_name)    ! в "str" - DNS-имя тачки
          aN = p.h_addr_list                ! здесь адрес адреса первого IP
          a = GetValFromAddr('L', aN) ! адрес первого IP
          Loop While a                        ! пока адрес <> 0
            NumAdapters += 1                  ! есть адаптер
            ! получить текст по адресу "a"
            ipl = GetValFromAddr('L', a)      !это 4 байта, подлежащие преобразованию
            pcs &= inet_ntoa(ipl)             !стандартное преобразование
            If IPstr Then IPstr = IPstr & '<13><10>'.
            IPstr = IPstr & pcs
            aN += 4
            a = GetValFromAddr('L', aN) ! адрес очередного IP
          End ! Loop While a
        End ! If p &= Null
     End
     If WSACleanup() Then Clear(Ok).
  End
  If ~ NumAdapters Then Clear(Ok).
  Return (Ok)

!==========================================================================================
GetValFromAddr       FUNCTION (String Type_WCS124L6R8, ULong addr, Long Leng=-1) !, ?
!==========================================================================================
! Реализует возврат значения по указателю.
! На входе: addr    - адрес значения
!           Type_?  - литера 'C' или 'c'         - вернуть String, то есть в ADDR адрес CString
!                     литера 'W' или 'w'         - вернуть String, полагая в ADDR адрес WideString (Unicode),
!                                                  при этом может быть задан параметр Leng > 0 число символов (а не байт)
!                     литера 'S' или 's'         - вернуть String, то есть в ADDR адрес String, при этом обязателен
!                                                  параметр Leng > 0, число байт
!                     литера '1'                 - вернуть Byte,    то есть в ADDR адрес байта
!                     литера '2'                 - вернуть USort,   то есть в ADDR адрес 2-байтового числа
!                     литера 'L' или 'l' или '4' - вернуть Long,    то есть в ADDR адрес 4-байтового числа
!                     литера '6'                 - вернуть строку из 6 байт
!                     литера 'R' или 'r' или '8' - вернуть REAL
! Следующие структуры используют одно и то же место в памяти
! и реализуют получение по адресу значения

AddressX  Group                 ! адрес на значение переменной
addrX       ULong
lng         ULong
          End
pCString  Group,Over(AddressX)    ! ссылка на CSTRING
_str        &CString
          End
p_String  Group,Over(AddressX)    ! ссылка на STRING
_str        &String
          End
pLong     Group,Over(AddressX)    ! ссылка на ULong
_long       &ULong
          End
pByte     Group,Over(AddressX)    ! ссылка на Byte
_byte       &Byte
          End
pUShort   Group,Over(AddressX)    ! ссылка на UShort
_short      &UShort
          End
pReal     Group,Over(AddressX)    ! ссылка на Real
_real       &Real
          End

  CODE
  
  AddressX.addrX = addr
  Case Upper(Type_WCS124L6R8)
    Of 'C'
      Return(pCString._str)
    Of 'W'
      Return( WideCStr_To_Str(pCString._str, Leng) )
    Of 'S'
      If Leng < 1 Then Return ('').
      AddressX.lng = Leng
      Return(p_String._str)
    Of '1'
      Return(pByte._byte)
    Of '2'
      Return(pUShort._short)
    Of '4' OrOf 'L'
      Return(pLong._long)
    Of '6'
      AddressX.lng = 6
      Return(p_String._str)
    Of '8' OrOf 'R'
      Return(pReal._real)
    Else
      IF MESSAGE('Непоправимая ошибка программиста.|'& |
                 'Нужно задавать тип источника как один из:|'& |
                 '  "C" или "c"         - CSTRING|'& |
                 '  "W" или "w"         - Unicode CSTRING или Unicode STRING|'& |
                 '  "S" или "s"         - STRING|'& |
                 '  "L" или "l" или "4" - ULONG|'& |
                 '  "R" или "r" или "8" - REAL|'& |
                 '  "1"                 - BYTE|'& |
                 '  "2"                 - USHORT|'& |
                 '  "6" (специальный)   - STRING(6)||'& |
                 'Для типа "W" может быть задана длина строки Unicode (в символах)'& |
                 'Для типа "S" ДОЛЖНА быть задана длина строки (в байтах)' |
            , 'GetValFromAddr - ERROR.', ICON:HAND, '&STOP|&IGNORE') = 1 THEN
        HALT(999)
      END
      Return('')
  End
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Ответить