Как я могу извлечь одно и то же значение атрибута employeeID, отображаемое Outlook?
Наша компания использует ActiveDirectory по различным причинам. Один из них - обрабатывать контакты Outlook и идентификаторы входа пользователя.
Я написал программу для обнаружения зарегистрированного идентификатора пользователя и для поиска в Active Directory с использованием извлеченного идентификатора входа. Извлеченная информация из Active Directory затем сохраняется в базе данных.
Вот код, который я использовал для вывода информационных данных ActiveDirectory:
Dim enTry As DirectoryEntry = _
New DirectoryEntry("LDAP://myCOMPANY/DC=myCOMPANY,DC=myCOMPANY,DC=com")
Dim mySearcher As DirectorySearcher = New DirectorySearcher(enTry)
mySearcher.Filter = "(&(objectClass=user)(anr=" & thisUser & "))"
'thisUser is the variable holding the Windows ID that is accessing the ASPX page
mySearcher.PropertiesToLoad.Add("employeeID") 'just in case I need to do this.
Dim resEnt As SearchResult
Try
For Each resEnt In mySearcher.FindAll()
Dim fullname As String = resEnt.GetDirectoryEntry.Properties.Item("cn").Value
'fullname will always pull the right information
Dim e_id As String = resEnt.GetDirectoryEntry.Properties.Item("employeeID").Value
'e_id will sometimes be NOTHING, sometimes will contain an ID that
' is different from the one displayed in Outlook Contact Information
' and sometimes it will be matching the employeeID listed in Outlook info
Catch ex as Exception
Log("Failed to pull AD data: " & ex.Message)
End Try
По какой-то причине некоторые пользователи не имеют значений для своего поля employeeID, а некоторые имеют.
Тем не менее, все пользователи будут отображать значение employeeID при просмотре в Outlook.
Я разработал следующее изображение, чтобы помочь вам понять, что я переживаю.
Изображение разделено на две части, раздел для каждого CASE.
=============================================== =========
В случае 1 сотрудник выполнил вход в Windows с помощью своего идентификатора: xms33808
Outlook показывает, что его идентификатор сотрудника 16078
Outlook показывает, что его псевдоним электронной почты xms33808
Командное окно ASP.Net показывает, что его employeeID xms33808
, что не соответствует действительности
=============================================== =======
=============================================== ========
В случае 2 сотрудник подключился к Windows с помощью ID: 25163
Outlook показывает, что его идентификатор сотрудника 25163
Outlook показывает, что его псевдоним электронной почты MutawaAAB
Окно командной строки ASP.Net показывает, что его employeeID NOTHING
.
=============================================== ========
Мой вопрос: как я могу извлечь ту же самую информацию о значении employeeID, которую отображает Outlook?
![Case 1: employeeID is different from ASP.Net than Outlook]()
![Case 2: employeeID is found in Outlook, but Nothing in ASP.Net]()
Ответы
Ответ 1
Наконец, я нашел атрибут, содержащий идентификатор сотрудника.
Для тех, кто ищет ответ на тот же вопрос, вот имя атрибута:
extensionattribute2
То, как я столкнулся с этим, - это распечатать все значения атрибутов, хранящиеся в результатах поиска.
For Each resEnt In mySearcher.FindAll()
Debug.Print("The properties of the " + resEnt.GetDirectoryEntry().Name + " are :")
For Each singleAttribute As String In DirectCast(resEnt.Properties, ResultPropertyCollection).PropertyNames
Debug.Print(singleAttribute & Convert.ToString(" = "))
For Each singleValue As [Object] In DirectCast(resEnt.Properties, ResultPropertyCollection)(singleAttribute)
Debug.Print(vbTab + singleValue.ToString)
Next
Next
Next
Затем я просмотрел вывод и нашел номер значка, напечатанный рядом с extensionattribute2
..
Очень странное имя для свойства, которое должно называться employeeID
или staffID
или BadgeNumber
или что-нибудь еще, что имеет смысл.
Впоследствии я изменил свой код, который ищет в Active Directory, чтобы искать не только учетную запись Sama, но и эту extensionattribute2
вещь, так как каждый сотрудник имеет уникальный идентификатор.
Dim LookFor As String = "25163"
Dim mySearcher As DirectorySearcher = New DirectorySearcher(enTry)
mySearcher.Filter = "(&(| (anr=" & LookFor & ")" & _
"(extensionattribute2=" & LookFor & "))" & _
"(objectCategory=Person)(objectClass=user))"
Ответ 2
Если вы используете .net 3.5 или выше, вы можете использовать следующее, что намного проще, чем LDAP и т.д.
Добавьте ссылку и оператор Imports для System.DirectoryServices.AccountManagement
Чтобы получить подробную информацию для конкретного пользователя:
Dim objPC As PrincipalContext = Nothing
Dim objADUser As UserPrincipal = Nothing
Try
objPC = New PrincipalContext(ContextType.Domain, "YourDomain")
objADUser = UserPrincipal.FindByIdentity(objPC, "NetworkLogin")
Catch ex As Exception
End Try
Чтобы получить подробную информацию о текущем зарегистрированном пользователе
Dim objADUser As UserPrincipal = Nothing
Try
objADUser = UserPrincipal.Current
Catch ex As Exception
End Try
Затем вы можете опросить объект objADUser и получить всевозможные детали, такие как
objADUser.VoiceTelephoneNumber
objADUser.EmailAddress
objADUser.EmployeeNumber and many others.....
Ответ 3
Существует смутно похожий атрибут AD, называемый "employeeNumber". Может быть, Outlook действительно использует это свойство для заполнения его отображения?
На этой странице поддержки Microsoft на контактных карточках Outlook "employeeID" не является полем, который вы можете использовать. Однако, "employeeNumber".
http://support.microsoft.com/kb/981022
Надеемся, что это поможет хотя бы ускорить ваши усилия по устранению неполадок.
Ответ 4
Лучший способ - подключиться к серверу обмена и запросить необходимые данные, а затем проанализировать информацию, требуемую от xml.