Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > ActiveDirectory и VB 6.0


Автор: Kverter 7.11.2013, 11:00
Здравствуйте!!!Возник такой вопрос: есть сервер с AD,есть клиент написанный на VB с возможностью подключения dll. Стоит задача написать dll которая возвращает свойства некого объекта из AD.
Такое возможно сделать на VB 6.0? Просто я написал библиотеку на С# но ее ни как не подключить к проекту на VB. 

Автор: Akina 7.11.2013, 11:14
А зачем под такую фигню DLL клепать? эту информацию ты можешь прямо в проекте получать, либо дёрнув за соотв. API-функцию, либо за что-нить более высокое - скажем, через WMI...

Автор: Kverter 7.11.2013, 11:20
Затем что уже есть приложуха написанная, к ней нужно дописать dll, вообщем вот что я пока надумал 

Код

Private Sub Command1_Click()
    '
    'Declare Variables
    Dim objUser, objRootDSE
    Dim strDomainDN, strDomain
 
    Set objRootDSE = GetObject("LDAP://CN=xxx,CN=xx,DC=xxxx,DC=xxx,DC=ru")
    strDomainDN = objRootDSE.Get("sAMAccountName")
    strDomain = objRootDSE.Get("userPrincipalName")
    Text2.Text = strDomain
    Text1.Text = strDomainDN
  
End Sub
это все выводит, проблема теперь вывести все группы безопасности в которых состоит пользователь в c# использовал функцию GetAuthorizationGroups().

Автор: Akina 7.11.2013, 12:57
А попробуй покопаться в WMI-класссах... в том же Win32_Groups, к примеру... ну а коли совсем не получится - дёрни тот же фреймворк, ne же функцию, но из VB. Или ещё проще - на VB.Net, для него это занятие так и вовсе родное - с фреймворком общаться.

Автор: Kverter 7.11.2013, 14:31
Появился другой вопрос еще,как вернуть имя текущего доменного пользователя? 

Автор: Akina 7.11.2013, 14:47
НА самом деле вопрос-то неоднозначный. Сеанс может быть подключен сразу к нескольким сервисам каталога, причём с разными именами учётных записей.
Думаю, хотя и не убеждён, что нужно будет шерстить пространство имён LDAP:

Добавлено через 19 секунд
PS. Проверить не могу - у меня eDir.

Автор: Kverter 7.11.2013, 15:57
Получил полное имя пользователя с помощью след. функции:
Код

Function WMI_UserFullName() As String
    login$ = CreateObject("WScript.Network").UserName   

    Set objWMIService = GetObject("winmgmts://./root/CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", , 48)
    For Each objItem In colItems  
       If objItem.Name = login$ Then WMI_UserFullName = objItem.FullName
    Next
End Function

только долговато,пока все записи переберет,теперь другой вопрос у меня есть имя пользователя в AD(CN=.....),могу ли я вернуть полный путь?

Автор: Akina 7.11.2013, 16:05
А зачем перебор всех аккаунтов? кто мешает сразу получить нужную запись?

Код

WMI_UserFullName =  GetObject("winmgmts://./root/CIMV2").ExecQuery("SELECT * FROM Win32_UserAccount WHERE Name = '" & CreateObject("WScript.Network").UserName & "'", , 48)(0).FullName

Автор: Kverter 12.11.2013, 09:01
Вывыливается ошибка, не могу понять почему, вроде все логично

Автор: Akina 12.11.2013, 09:05
А собирай не всё сразу, а по одному шажку. Я в принципе не убеждён до конца в GetObject.ExecQuery(0)...
Да и текст ошибки мог бы показать.

Автор: Kverter 12.11.2013, 09:38
Заработало вот так:
Код

Function WMI_UserFullName() As String
    login$ = CreateObject("WScript.Network").UserName
    'WMI_UserFullName = GetObject("winmgmts://./root/CIMV2").ExecQuery("SELECT * FROM Win32_UserAccount WHERE Name = '" & login$ & "'", , 48)(0).FullName

   Set objWMIService = GetObject("winmgmts://./root/CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount WHERE Name = '" & login$ & "'", , 48)
    For Each objItem In colItems
       If objItem.Name = login$ Then WMI_UserFullName = objItem.FullName
    Next
End Function

Можешь помочь еще в поиске пользователя в AD, вот функция получения домена
Код

Public Function Domain() As Variant
    Set objRoot = GetObject("LDAP://rootDSE")
    DomainRoot = objRoot.Get("defaultNamingContext")
    Domain = DomainRoot
    End Function

нужно найти пользователя в этом домене. Имя пользователя возвращает функция WMI_UserFullName.

Автор: Kverter 12.11.2013, 10:07
можно обойтись без "winmgmts"??  Вроде как эта штука не работает в windows 2000(а нужно)

Автор: Kverter 12.11.2013, 11:26
Вроде все сделал, теперь когда закомпилил в exe на моей машине все норм, на другой Run-time error ‘429’ Activex component can't create object.
как я понимаю каких то библиотек не хватает,как узнать каких?

Автор: Kverter 14.11.2013, 09:13
Доброго времени суток!!!!Вроде все дописал, все работает, но не на всех машинах. На некоторых возникает 429 при использовании любой из написанных функций. вот пример одной из них:
Код

Public Function GetsAMAccountName() As Variant
On Error GoTo ErrorHandler
Set objRootDSE = GetObject("LDAP://CN=xxx,CN=xxx,DC=xxx,DC=xxxx,DC=ru")
'On Error GoTo ErrorHandler
    strDomainDN = objRootDSE.Get("sAMAccountName")
    GetsAMAccountName = strDomainDN
    GoTo Ends:
ErrorHandler:
MsgBox Err 
   Resume Next
Ends:
End Function


я так понимаю он не создает объект,вопрос почему????

Автор: Akina 14.11.2013, 09:26
Неплохо бы указывать, на какой строке код валится. На GetObject? на .Get? Опять же посмотри повнимательнее на http://msdn.microsoft.com/en-us/library/ms806997.aspx#buildingadapps_using_good_ldap, запроси расширенный код ошибки...
Кстати, а нафига промежуточная переменная? да ещё не определённая на уровне функции?

Автор: Kverter 14.11.2013, 09:33
Вываливается на GetObject.

Добавлено через 2 минуты и 50 секунд
Я думаю может дело в какой нибудь либи от vb? не на всех машинах стоит vb

Автор: Akina 14.11.2013, 09:44
Используемые приложением библиотеки ты можешь посмотреть тем же ProcessExplorer, скажем. Но чаще при таком сообщении проблема не в отсутствии, а в недостатке прав. Проверь ЛДАП-классиды на проблемной машине...

Автор: Kverter 14.11.2013, 09:47
А можно поподробней???не совсем все понял

Добавлено через 7 минут и 21 секунду
Может быть проблема в неких компонентах vb??? просто погуглив у некоторых возникает такая ошибка из за того что не зарегистрирован в системе какой либо компонент.

Автор: Akina 14.11.2013, 10:17
Вот я и говорю - проверяй LDAP-овские CLSID-ы на наличие и корректность.

Автор: Kverter 14.11.2013, 10:40
Проблема в том что я не знаю как это проверить хД

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)