Список пользователей в Active Directory
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Список пользователей в 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
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
Это был дан не пример, а работоспособная функция
! - это комментарии с примером работы
упомянутая в комментариях DLL - та, в которой реализована у меня эта функция
упомянутый в комментариях INC - соответственно, тот файл, где содержится описание (заголовок) этой функции
вставлены комментарии прямо из моего inc-файла - в спешке не затёр лишнего
если нужны функции определения DNS-имени: / GetNetInfo() /
и имени пользователя / GetLoginName() /
- так и скажи
а LDAP_User() дана полностью рабочая и готовая к употреблению (и параметры прокомментированы)
! - это комментарии с примером работы
упомянутая в комментариях DLL - та, в которой реализована у меня эта функция
упомянутый в комментариях INC - соответственно, тот файл, где содержится описание (заголовок) этой функции
вставлены комментарии прямо из моего inc-файла - в спешке не затёр лишнего
если нужны функции определения DNS-имени: / GetNetInfo() /
и имени пользователя / GetLoginName() /
- так и скажи
а LDAP_User() дана полностью рабочая и готовая к употреблению (и параметры прокомментированы)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Список пользователей в Active Directory
Код: Выделить всё
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)
Для решения задачи "получить список пользователей AD" - данная функция не поможет.
Вторая, кстати, - тоже. (тебе ведь известно DNS-имя домена)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Список пользователей в Active Directory
Так, что правке под твои нужды подлежит функция LDAP_User (которая в предложенном виде ищет инфу о заданном пользователе в заданном домене).
нужно строчку Execute изменить как-то так:
а потом в цикле, пока objConnection{objRecordset &'.EOF()'} <> '-1' получать Login-ы
нужно строчку Execute изменить как-то так:
Код: Выделить всё
'Execute("SELECT samAccountName FROM ''LDAP://' & DomainNameWithPoints &''' WHERE objectCategory=''user''")'
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Re: Список пользователей в Active Directory
Спастбо. Буду разбираться. Но и функции GetUserName, GetLoginName думаю пригодятся. Кто ж знает, что еще попросят
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Список пользователей в Active Directory
пользуйтесь, кому понравится... (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
Компьютер имеет то преимущество перед мозгом, что им пользуются...