Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
1

Получить информацию о пользователях из Active Directory

09.01.2018, 15:40. Просмотров 4554. Ответов 18


Всем привет!
Вопрос в следующем. Может ли vb.net работать с доменом?
На форме textbox, button, listview
В текстовое поле ввести имя домена.
Необходимо в listview вывести следующую информацию о пользователях при нажатии на кнопку:
1. Имя, Инициалы, Фамилия, Выводимое имя (скрин1)
2. Имя входа пользователя, Имя входа пользователя (пред-Windows 2000) и Срок действия учетной записи. (когда истикает)
или если истек, то дату) (скрин2)
3 Со вкладки Организация Вывести Отдел (скрин3)
4. При двойном щелчке на запись в msgbox выводились группы в которые включен пользователь.

Помогите с решением. Заранее спасибо.
0
Миниатюры
Получить информацию о пользователях из Active Directory   Получить информацию о пользователях из Active Directory   Получить информацию о пользователях из Active Directory  

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2018, 15:40
Ответы с готовыми решениями:

Как получить и передать информацию о пользователях Windows в приложении клиент-сервер?
Всем доброго времени суток. Возник вопрос по клиент-серверному приложению на сокетах, заключается...

Как получить ФИО в Active Directory?
Всем привет! В нашей конторе развернута AD 2008 (более 1000 юзеров) От начальства поступила задачка...

Получить список учетных записей MS Active Directory
Доброе утро, подскажите пожалуйста, если кто в курсе, какие нибудь winAPI функции или напрямую...

Получить все группы текущего пользователя в Active Directory
Надо использовать AD, чтобы получить группы текущего пользователя. Показать данные о...

18
8117 / 4388 / 1724
Регистрация: 11.02.2013
Сообщений: 9,350
09.01.2018, 15:47 2
Есть два контрола: DirectorySearcher и DirectoryEntry. Они предназначены для работы с AD. Я их не использовал лично, но примеры есть в сети
0
1241 / 950 / 133
Регистрация: 01.10.2009
Сообщений: 2,902
Записей в блоге: 1
09.01.2018, 16:00 3
ViterAlex, классы?

Добавлено через 57 секунд
ViterAlex, классы?pirat2019, тут же
0
8117 / 4388 / 1724
Регистрация: 11.02.2013
Сообщений: 9,350
09.01.2018, 16:32 4
XIST, классы, контролы. Какая разница? Я говорил о контролах из панели инструментов, но ничто не мешает их не ставить на форму, а создавать из кода, как по приведённой тобой ссылке.
1
1241 / 950 / 133
Регистрация: 01.10.2009
Сообщений: 2,902
Записей в блоге: 1
09.01.2018, 16:41 5
ViterAlex, классы?pirat2019, тут жеViterAlex, а прошу прощения, тут вопрос был реально профессиональный, ибо не работал, а так не помню в воочию таких контролов, ибо вакханалия
0
Миниатюры
Получить информацию о пользователях из Active Directory  
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
10.01.2018, 10:38  [ТС] 6
XIST, поискал в инете. смог найти как вывести список пользователей только. а как все остальное - нет.
vb.net
1
2
3
4
5
6
7
8
9
10
Dim directoryEntry As DirectoryEntry = New DirectoryEntry(("WinNT:// имя домена"))
        Dim userNames As String = "<strong class="
        For Each child As DirectoryEntry In directoryEntry.Children
            If (child.SchemaClassName = "User") Then
                userNames = (userNames _
                            + (child.Name + Environment.NewLine))
            End If
 
        Next
        MessageBox.Show(userNames)
Добавлено через 5 минут
XIST, в силах ли вы помочь мне допилить код под мою задачу?

Добавлено через 17 часов 22 минуты
Что никто никогда не задавался такой задачей? никто ничего подобного не делал?
Помогите, пожалуйста!
0
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
10.01.2018, 11:39 7
pirat2019, Вот тут много примеров для работы с AD, думаю по аналогии можно допилить под вашу задачу
1
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
10.01.2018, 11:51  [ТС] 8
Orlangur1991, там проект есть, я скачал его. но не пойму. не фурычит что то ничего. может не правильно у меня что то открывается. вот проект. можете его открыть?
0
Вложения
Тип файла: zip active_directory_in_vbnet_src.zip (27.0 Кб, 16 просмотров)
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
10.01.2018, 11:59 9
pirat2019, Тут можно посмотреть атрибуты

Добавлено через 6 минут
pirat2019, Все открылось и работает. В проекте только модуль, приложение надо пилить, используя готовый код в нем. Как подразумевается. Но вам такой функционал не нужен, как я понимаю. Только поиск организовать. Вот там и можно подглядеть пример
Ещё пример
0
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
10.01.2018, 12:14  [ТС] 10
Orlangur1991, нашел функцию.
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Function GetActiveDirUserDetails(ByVal userid As String) As String
        Dim dirEntry As System.DirectoryServices.DirectoryEntry
        Dim dirSearcher As System.DirectoryServices.DirectorySearcher
        Dim domainName As String = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName
        Try
            dirEntry = New System.DirectoryServices.DirectoryEntry("LDAP://" & domainName)
            dirSearcher = New System.DirectoryServices.DirectorySearcher(dirEntry)
            dirSearcher.Filter = "(samAccountName=" & userid & ")"
 
            dirSearcher.PropertiesToLoad.Add("GivenName")
            'Users e-mail address
            dirSearcher.PropertiesToLoad.Add("sn")
            'Users last name
            Dim sr As SearchResult = dirSearcher.FindOne()
            If sr Is Nothing Then 'return false if user isn't found 
                Return False
            End If
            Dim de As System.DirectoryServices.DirectoryEntry = sr.GetDirectoryEntry()
            Dim userFirstLastName = de.Properties("sn").Value.ToString() + ", " + de.Properties("GivenName").Value.ToString()
            Return userFirstLastName
        Catch ex As Exception ' return false if exception occurs 
            Return ex.Message
        End Try
    End Function
как ее вызвать и данные занести в listview?
0
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
10.01.2018, 12:19 11
pirat2019, при вызове надо передать userid, ну а вернет функция string " LastName, First Name", её и добавляем в listview
0
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
10.01.2018, 12:32  [ТС] 12
Orlangur1991, не покажите как это сделать с кодом? а то я не догоняю...
0
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
10.01.2018, 13:36 13
pirat2019, думаю как-то так, домена под рукой нет, проверить не могу
vb.net
1
2
3
4
       If GetActiveDirUserDetails("WORK") IsNot Nothing Then
            Dim Splitted() As String = Split(GetActiveDirUserDetails("WORK"), ", ")
            ListView1.Items.Add(Splitted(0)).SubItems.Add(Splitted(1))
        End If
0
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
10.01.2018, 15:42  [ТС] 14
Orlangur1991, нашел такой вот код. выводит имя пользователя и дату последнего логина.
как мне можно допилить что бы выводил все параметры, которые указаны в теме?
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Imports System.DirectoryServices
 
Public Class Form1
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListView1.View = View.Details
        ListView1.GridLines = True
        ListView1.Columns.Add("Name", 150)
        ListView1.Columns.Add("Date", 130)
        ListView1.FullRowSelect = True
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dirs As DirectoryEntry = New DirectoryEntry(("WinNT://" + "ors.local"))
        For Each de As DirectoryEntry In dirs.Children
            If (de.SchemaClassName = "User") Then
                If (Not (de.Properties("lastlogin").Value) Is Nothing) Then
                    Dim item As ListViewItem = New ListViewItem({de.Name, de.Properties("lastlogin").Value.ToString})
                    ListView1.Items.Add(item)
                End If
            End If
        Next
 
    End Sub
End Class
Заранее спасибо.
0
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
10.01.2018, 17:59 15
pirat2019, Переделать условие и добавлять в item нужные поля. к примеру
vb.net
1
  Dim item As ListViewItem = New ListViewItem({de.Name, de.Properties("sn").Value.ToString, de.Properties("personalTitle").Value.ToString})
и так далее
0
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
10.01.2018, 18:07  [ТС] 16
Orlangur1991, когда добавляю данные с той ссылки что вы мне дали, то вылезает ошибка:
Цитата Сообщение от Orlangur1991 Посмотреть сообщение
Тут можно посмотреть атрибуты
0
Миниатюры
Получить информацию о пользователях из Active Directory  
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
10.01.2018, 21:41 17
pirat2019, код покажите и место где ошибка возикает
0
0 / 0 / 0
Регистрация: 14.12.2017
Сообщений: 62
11.01.2018, 08:55  [ТС] 18
Orlangur1991, собственно он не сильно и поменялся.
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Imports System.DirectoryServices
 
Public Class Form1
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListView1.View = View.Details
        ListView1.GridLines = True
        ListView1.Columns.Add("1", 150)
        ListView1.Columns.Add("2", 130)
        ListView1.Columns.Add("3", 180)
        ListView1.FullRowSelect = True
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dirs As DirectoryEntry = New DirectoryEntry(("WinNT://" + "ors.local"))
        For Each de As DirectoryEntry In dirs.Children
            If (de.SchemaClassName = "User") Then
                If (Not (de.Properties("lastlogin").Value) Is Nothing) Then
                    Dim item As ListViewItem = New ListViewItem({de.Name, de.Properties("sn").Value.ToString, de.Properties("personalTitle").Value.ToString})
                    ListView1.Items.Add(item)
                End If
            End If
        Next
 
    End Sub
ошибка возникает на строке
vb.net
1
 Dim item As ListViewItem = New ListViewItem({de.Name, de.Properties("sn").Value.ToString, de.Properties("personalTitle").Value.ToString})
0
Лень — мое второе и
2959 / 2189 / 638
Регистрация: 28.11.2014
Сообщений: 3,343
Записей в блоге: 2
12.01.2018, 11:58 19
Лучший ответ Сообщение было отмечено pirat2019 как решение

Решение

Сделать вроде сделал, но если кто подскажет как сделать красиво, будет здорово.
Импортируем пространство имен
vb.net
1
Imports System.Threading
Кнопка
vb.net
1
2
3
4
5
6
7
8
 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ListView1.Items.Clear()
        ProgressBar1.Value = 0
        Dim ADThread As New Thread(AddressOf GetADUsersInfo)
        ADThread.IsBackground = True
        ADThread.Start()
 
    End Sub
Сама процедура
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
Sub GetADUsersInfo()
        Dim givenName As String = ""
        Dim initials As String = ""
        Dim sn As String = ""
        Dim canonicalName As String = ""
        Dim displayName As String = ""
        Dim sAMAccountName As String = ""
        Dim accountExpires As String = ""
        Dim department As String = ""
 
 
        Dim domainName As String = TextBox1.Text
        If domainName.Length < 1 Then
            MsgBox("Введите имя домена!")
            Exit Sub
        End If
 
        Dim domainEntry As DirectoryEntry = New DirectoryEntry("LDAP://" & domainName, "UserAdmin", "PassAdmin", AuthenticationTypes.ReadonlyServer)
 
 
        Dim DomainSearcher As DirectorySearcher = New DirectorySearcher(domainEntry)
        DomainSearcher.Filter = "(&(objectCategory=person)(objectClass=user))"
        DomainSearcher.SearchRoot = domainEntry
        DomainSearcher.SearchScope = SearchScope.Subtree
        Dim results1 As SearchResultCollection
        Try
            results1 = DomainSearcher.FindAll()
        Catch ex As Exception
            MsgBox(ex.Message)
            Exit Sub
        End Try
 
        Dim CountUsers As Integer = results1.Count
 
        Invoke(CType(Sub()
                         ProgressBar1.Maximum = CountUsers
                     End Sub, MethodInvoker))
 
 
            Try
                givenName = results1(i).Properties("givenName")(0).ToString()
            Catch ex As Exception
                givenName = " "
            End Try
            Try
                initials = results1(i).Properties("initials")(0).ToString()
            Catch ex As Exception
                initials = " "
            End Try
            Try
                sn = results1(i).Properties("sn")(0).ToString()
            Catch ex As Exception
                sn = " "
            End Try
            Try
                canonicalName = results1(i).Properties("name")(0).ToString()
            Catch ex As Exception
                canonicalName = " "
            End Try
            Try
                displayName = results1(i).Properties("displayName")(0).ToString()
            Catch ex As Exception
                displayName = " "
            End Try
            Try
                sAMAccountName = results1(i).Properties("sAMAccountName")(0).ToString()
            Catch ex As Exception
                sAMAccountName = " "
            End Try
            Try
                accountExpires = results1(i).Properties("accountExpires")(0).ToString
                If accountExpires = "0" Then
                    accountExpires = "Never"
                Else
                    accountExpires = DateTime.FromFileTime(results1(i).Properties("accountExpires")(0).ToString)
                End If
 
            Catch ex As Exception
                accountExpires = " "
            End Try
            Try
                department = results1(i).Properties("department")(0).ToString()
            Catch ex As Exception
                department = " "
            End Try
            '
            Dim tagLs As String = ""
            Try
                Dim dirSearchResults As SearchResult = DomainSearcher.FindOne()
                Dim propCount As Integer = dirSearchResults.Properties("memberOf").Count
                For j As Integer = 0 To propCount - 1
                    tagLs &= Split(Split(results1(i).Properties("memberOf")(j).ToString(), "CN=", 2)(1), ",", 2)(0) & vbNewLine
                Next
 
            Catch ex As Exception
 
            End Try
 
            Dim k As Integer = i
            Invoke(CType(Sub()
 
                             ListView1.Items.Add(givenName).SubItems.AddRange(New String() _
                  {initials, sn, canonicalName, displayName, sAMAccountName, accountExpires, department})
 
                             ListView1.Items.Item(k).Tag = tagLs
                             ProgressBar1.Value += 1
                             Label1.Text = Math.Round((ProgressBar1.Value / ProgressBar1.Maximum) * 100, 0) & " %"
                         End Sub, MethodInvoker))
 
 
        Next i
 
 
    End Sub
Для просмотра групп
vb.net
1
2
3
4
 Private Sub ListView1_DoubleClick(sender As Object, e As EventArgs) Handles ListView1.DoubleClick
        MsgBox(ListView1.SelectedItems.Item(0).Tag.ToString)
 
    End Sub
Добавлено через 16 часов 38 минут
Может кому будет полезно, Использование LDAP-фильтров
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2018, 11:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Active Directory - Получить список компьютеров из этой службы каталогов и вставить в таблицу Access
На нашем предприятии используется Active Directory. Я бы хотел получить список компьютеров из этой...

Ms active directory -> <-ibm domino directory
Привет всем! :banghead: Начали разработку тонкого клиента СЭД на Xpages но встал вопрос о...

Lotus\domino Directory & Active Directory
Добрый день, столкнулся с такой проблемой. Поставил сервер Domino на win2k8R2. Сервак является и...

Active directory & domino directory?
Добрый день всем, У нас в Active Directory есть такая политика что через 20 дней пользователь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.