2013-12-09 1 views
10

Unsere Firma benutzt ActiveDirectory aus verschiedenen Gründen. Eine davon ist die Behandlung von Outlook-Kontakten und Benutzer-Login-IDs.Wie kann ich den gleichen employeeID-Attributwert extrahieren, den Outlook anzeigt?

Ich habe ein Programm geschrieben, um die angemeldete Benutzer-ID zu erkennen und das Active Directory mit der extrahierten Login-ID zu durchsuchen. Die abgerufenen Informationen aus dem Active Directory werden dann in einer Datenbank gespeichert.

Hier ist der Code ich ActiveDirectory- Informationsdaten ziehen verwendet:

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 

Aus irgendeinem Grund haben einige Benutzer keine Werte für ihre employeeID Feld, und einige haben.

Alle Benutzer zeigen jedoch beim Anzeigen in Outlook einen employeeID-Wert an.

Ich habe das folgende Bild entworfen, damit Sie verstehen, was ich durchmache. Das Bild ist in zwei Abschnitte unterteilt, einen Abschnitt für jeden CASE.

============================================== ==========

in Fall 1, die Mitarbeiter bei Windows mit seiner ID angemeldet hat: xms33808

Outlook zeigt, dass seine Mitarbeiter ID 16078

Outlook zeigt ist dass sein E-Mail-Alias ​​xms33808

ASP.Net Befehlsfenster zeigt, dass sein Angestellter ID ist xms33808, was nicht wahr ist

====================================== ================

============================== =========================

in Fall 2, die Mitarbeiter bei Windows mit ID angemeldet hat: 25163

Outlook zeigt, dass seine Employee ID 25163

ist Outlook zeigt, dass sein E-Mail-Alias ​​MutawaAAB

ASP.Net Befehlsfenster zeigt, dass seine employeeID NOTHING ist.

============================================== =========

Meine Frage ist: Wie kann ich die gleichen MitarbeiterID Wert Informationen extrahieren, die Outlook anzeigt?

Case 1: employeeID is different from ASP.Net than Outlook Case 2: employeeID is found in Outlook, but Nothing in ASP.Net

+0

Sehr seltsam - Sie haben keinen sekundären AD-Server, oder? –

+0

@DarkcatStudios Nein. Nur ein AD-Server. Aber wie kann ich prüfen, ob es ein anderes gibt? Ich meine, ohne durch menschliche IT-Intervention gehen zu müssen? – Ahmad

Antwort

0

Ich fand schließlich das Attribut, das die Mitarbeiter-ID enthält.

für die Suche nach einer Antwort auf die gleiche Frage suchen, hier ist der Name des Attributs:

extensionattribute2

So wie ich über diesen durch Ausdrucke alle von der Sucheingabe gehalten Attributwerte ist gekommen Ergebnis ..

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 

Dann untersuchte ich die Ausgabe und festgestellt, die Plakette Nummer extensionattribute2 nächsten ausgedruckt ..

Sehr seltsame Bezeichnung für eine Eigenschaft, die employeeID oder staffID oder BadgeNumber oder irgendetwas anderes genannt werden sollte, das Sinn macht.

Später änderte ich meinen Code, der das Active Directory durchsucht, um nicht nur nach dem Sama Account zu suchen, sondern auch nach dieser extensionattribute2 Sache, da jeder Angestellte eine eindeutige ID hat.

Dim LookFor As String = "25163" 
Dim mySearcher As DirectorySearcher = New DirectorySearcher(enTry) 

mySearcher.Filter = "(&(| (anr=" & LookFor & ")" & _ 
         "(extensionattribute2=" & LookFor & "))" & _ 
         "(objectCategory=Person)(objectClass=user))" 
1

Wenn Sie .net 3.5 oder höher Sie können die folgenden verwendet werden, die viel einfacher als LDAP usw. ist ...

einen Verweis hinzufügen und eine Imports-Anweisung für System.DirectoryServices.AccountManagement

Um die Details für einen bestimmten Benutzer zu erhalten:

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 

Um

auf Benutzerdaten für den aktuell angemeldeten zu bekommen
Dim objADUser As UserPrincipal = Nothing 
Try 
    objADUser = UserPrincipal.Current 
Catch ex As Exception 
End Try 

Sie dann befragen Sie das Objekt objADUser und erhalten Sie alle möglichen Details wie

objADUser.VoiceTelephoneNumber 
objADUser.EmailAddress 
objADUser.EmployeeNumber and many others..... 
+0

Wie Bo TX unten erwähnt ... sollten Sie employeeNumber und nicht employeeID, wie auch immer Sie die Details von AD suchen, verwenden. – Mych

+1

'objADUser.EmployeeNumber' verursachte, dass der Code-Editor einen Fehler erzeugte, da' EmployeeNumber' kein gültiges Attribut oder Mitglied/Eigenschaft von 'objADUser' ist. "EmployeeId" ist jedoch. – Ahmad

+0

Ahmad .... Sie haben Recht ... Ich weiß nicht, wo ich EmployeeNumber von – Mych

1

Es gibt ein verwirrend ähnliches AD-Attribut namens 'employeeNumber'. Könnte es sein, dass Outlook diese Eigenschaft tatsächlich verwendet, um die Anzeige zu füllen?

Laut dieser Microsoft Support-Seite auf Outlook-Kontaktkarten ist "employeeID" kein Feld, das Sie verwenden können. 'EmployeeNumber' ist jedoch.

http://support.microsoft.com/kb/981022

Hoffnung hilft dies zumindest Ihre Fehlerbehebung Bemühungen vorantreiben.

+0

Ich habe versucht, den Inhalt von 'resEnt.GetDirectoryEntry.Properties.Item ("MitarbeiterNr") zu untersuchen.Wert, aber es ist nichts für beide Fälle – Ahmad

+0

Es klingt wie Sie möglicherweise mit Ihrem Exchange-Administrator koordinieren müssen. Sie sollten in der Lage sein zu bestätigen, wo und wie dieses Feld zur Anzeige gezogen wird. –

0

Der beste Weg wäre, eine Verbindung zum Exchange-Server herzustellen und die erforderlichen Daten abzufragen und dann die benötigten Informationen aus dem XML-Dokument zu analysieren.

+0

Wie kann ich die XML-Antwort vom AD-Server anzeigen? – Ahmad

+0

Der AD-Server gibt keine XML-Datei aus. Die XML-Datei ist die Antwort der Anfrage an den Exchange-Server. Auf diese Weise wird sie sicherer und analysiert stattdessen Daten aus der AD. –

Verwandte Themen