Как я могу извлечь одно и то же значение атрибута 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 OutlookCase 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.