2017-03-07 2 views
0

Ich benutze DirectorySearcher, um eine Liste von Benutzern in AD zu erhalten, um sie mit meiner App zu synchronisieren, und habe Code aus verschiedenen SO-Quellen kopiert, bekomme aber keine Eigenschaftswerte. Ich verwende den folgenden Code:ASP.NET LDAP SearchResults Eigenschaften, die Byte-Array zurückgeben

 DirectorySearcher search = new DirectorySearcher(); 
     SearchResultCollection results = null; 
     string sDefaultOU = "LDAP://..."; 
     DirectoryEntry de = new DirectoryEntry(sDefaultOU); 
     string userName = "DonaldDuck"; 
     search = new DirectorySearcher 
     { 
      SearchRoot = de, 
      PropertiesToLoad = { "displayname", "sAMAccountName"}, 
      Filter = "(sAMAccountName=" + userName + ")"  
     }; 
     results = search.FindAll(); 

     foreach (SearchResult result in results) 
     { 
      String name; 
      if (result.Properties["sAMAccountName"].Count > 0) 
      { 
       name = result.Properties["sAMAccountName"][0].ToString(); 
      }  
     } 

jedoch anstelle des Namens gleich sein zu „Donald Duck“, wird es „Byte [10]“ oder Byte [x] sein, wobei x die Länge.

Kann jemand sehen, was ich falsch mache.

Wenn ich hinzufügen, einen Filter es einen Benutzer gibt, so dass ich bin ziemlich sicher, dass der Code in Bezug arbeitet

des Suchens

Antwort

2

Offenbar dieses Problem von anderen konfrontiert wurde: LDAP DirectoryEntry SearchResult returns data differently in Windows 8 than Win7

AD LDAPv3 wird unter Verwendung der Werte codiert, unter Verwendung von UTF8 , die im obigen Link erwähnte Lösung könnte für Sie arbeiten:

if (result.Properties["sAMAccountName"][0].GetType().IsArray) 
{ 
    name = System.Text.Encoding.UTF8.GetString((byte[])result.Properties["sAMAccountName"][0]); 
} 
else 
{ 
    name = result.Properties["sAMAccountName"][0].ToString(); 
} 
+0

Absolut großartig. Ich habe das nirgends entdeckt, danke – grayson

1

statt

foreach (SearchResult result in results) 
    { 
     String name; 
     if (result.Properties["sAMAccountName"].Count > 0) 
     { 
      name = result.Properties["sAMAccountName"][0].ToString(); 
     }  
    } 

versuchen

foreach (SearchResult result in results) 
    { 
     String name; 
     if (result.Properties["sAMAccountName"].Count > 0) 
     { 
      var thisDE=result.GetDirectoryEntry(); 
      name = thisDE.Properties["sAMAccountName"].Value.ToString(); 
     }  
    } 

EDIT: Beispiel Ich benutze diese Hilfsmethode, um meine Domain zu suchen (wenn userDomainAndName = "DOMAIN \ UserName"), aber Sie sollten in der Lage sein, es für das, was Sie wollen, zu optimieren.

public static DirectoryEntry GetUserDirectoryEntryFromCurrentDomain(string userDomainAndName) 
    { 
     var Split = userDomainAndName.Split(@"\\".ToCharArray()); 

     var DomainNetBiosNAme = Split[0]; 
     var UserName = Split[1]; 

     var QueryString = $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={UserName}))"; 

     DirectoryEntry rootDSE = GetDirectoryObject(
      "LDAP://" + DomainNetBiosNAme + "/rootDSE"); 

     string domain = "LDAP://" + (string)rootDSE.Properties[ 
      "defaultNamingContext"][0]; 

     var Searcher = new DirectorySearcher(new DirectoryEntry(domain), QueryString); 
     var Result = Searcher.FindOne(); 

     var tReturn = Result.GetDirectoryEntry(); 
     return tReturn; 

    } 

dann meine Nutzer zu erhalten PrimarySMTP Adresse (zum Beispiel) ..

var TheUsersDirectoryEntry=GetUserDirectoryEntryFromCurrentDomain(userDomainAndName); 
var TheUsersPrimarySMTP=TheUsersDirectoryEntry.Properties["mail"].Value.ToString(); 
+0

Vielen Dank. Ich probierte dieses vorher aber ich erhalte "Ausnahme-Details: System.Runtime.InteropServices.COMException: Unbekannter Fehler (0x8000500c)", wenn es versucht, Namen zu erhalten. – grayson

+1

8000500c ist in der Regel eine Erlaubnis verweigert und/oder falsche LDAP-Pfad Fehler .. http://stackoverflow.com/questions/1722398/error-0x80005000-and-directoryservices Nur eine kurze Frage aber, warum versuchen Sie zu Holen Sie den SAMAccountName zurück, wenn Sie es bereits wissen? Bitte sehen Sie meine Bearbeitung - ich werde meine Arbeitshilfe Methode und Anwendungsbeispiel hinzufügen .. – Alan

+0

Vielen Dank für Ihre Hilfe. In der Praxis würde ich eine spezifischere Organisationseinheit verwenden und keinen Filter hinzufügen. Dies war nur, um die Antwort zu begrenzen, so hatte ich "gute" Daten zu debuggen – grayson

Verwandte Themen