2017-02-24 4 views
3

Je suis en train d'écrire des contacts dans un ldap ADLDS pour les utiliser comme un annuaire téléphonique pour une Yealink T48G. Parfois, le nom du contact inclut des caractères spéciaux tels que "ö", "ß" et "é". Si ces caractères sont contenus dans les champs « givenName » ou « Sélectionnez » ni le téléphone ni le client ldap peut les afficher correctement et montrer à la place d'autres caractères (par exemple « ö » -> « ¶ »), mais le « nom "et" dn "champs montrent ces caractères correctement. Si j'insère les valeurs de contact via ADSI-Edit ou tout autre outil, le téléphone affiche le nom correctement, mais mon application ne peut plus lire les caractères spéciaux insérés de givenName et affiche des boîtes de questions, mais le dn et les champs de nom sont lus correctement.C#: comment écrire des caractères spéciaux dans ADLDS?

Je l'ai déjà essayé d'utiliser utf-8, utf-16, utf-32, iso-8859-1 et les fenêtres-1252 comme encodage pour mon application.

La question est de savoir comment puis-je stocker ces caractères spéciaux à l'aide de C# dans la propriété givenName pour un inetOrgPerson dans une instance ADLDS?

montré correctement:

Corret special characters

montré de manière incorrecte:

Incorrect special characters

Mon code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.DirectoryServices.Protocols; 
using System.Net; 

namespace LdapContacts 
{  
    public class LdapClient 
    { 
     private LdapConnection connection; 

     public LdapClient(string host, int port, string distinguishedUsername, string password) 
     { 
      connection = new LdapConnection(new LdapDirectoryIdentifier(host, port)); 
      connection.AuthType = AuthType.Basic; 
      connection.Credential = new NetworkCredential(distinguishedUsername, password); 
      connection.Bind(); 
     } 

     public AddResponse SendAddRequest(string distinguishedName, List<DirectoryAttribute> attributes) 
     { 
      AddRequest request = new AddRequest(distinguishedName, attributes.ToArray()); 
      return connection.SendRequest(request) as AddResponse; 
     } 

     public SearchResponse SendSearchRequest(string distinguishedName, string filter) 
     { 
      SearchRequest request = new SearchRequest(); 
      request.DistinguishedName = distinguishedName; 
      request.Filter = filter; 
      request.Scope = SearchScope.Subtree; 
      return connection.SendRequest(request) as SearchResponse; 
     } 
    } 

    public class ContactsToLdap 
    { 
     private static void Main(string[] args) 
     { 
      LdapClient client = new LdapClient(Settings.LdapHost, Settings.LdapPort, Settings.LdapUsername, Settings.LdapPassword); 

      client.SendAddRequest("CN=Testöäüß,CN=Users,CN=testpart,DC=csdomain,DC=local", new List<DirectoryAttribute>() 
      { 
       new DirectoryAttribute("telephoneNumber", ""), 
       new DirectoryAttribute("objectClass", "inetOrgPerson"), 
       new DirectoryAttribute("uid", "io3e"), 
       new DirectoryAttribute("givenName", "â é testnameöüÄß") 
      }); 
      //distinguished name of contactsfolder 
      SearchResponse result = client.SendSearchRequest(Settings.LdapContactsFolder, "(objectClass=inetOrgPerson)"); 
      foreach (SearchResultEntry sResult in result.Entries) 
      { 
       //display the index of the current entry 
       Console.Write((result.Entries.IndexOf(sResult) + 1) + ":\n"); 
       foreach (DirectoryAttribute attribute in sResult.Attributes.Values) 
       { 
        //output the name of the attribute 
        Console.Write("\t" + attribute.Name + " = "); 
        for (int i = 0; i < attribute.Count; i++) 
        { 
         // convert the attribute to a string if it is an byte[] 
         // output if inserted with ADSI-Edit: ? ? testname???? 
         // output if inserted with this code: â é testnameöüÄß 
         if (attribute[i].GetType().Equals(typeof(byte[]))) 
         { 
          Console.Write(Encoding.UTF8.GetString((byte[])attribute[i]) + "; "); 
         } 
         else 
         { 
          Console.Write(attribute[i] + "; "); 
         } 
        } 
        Console.WriteLine(); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 
} 

Répondre

1

Le problème a été résolu en mettant l'ProtocolVersion qui doit être utilisé t o version 3.

connection = new LdapConnection(new LdapDirectoryIdentifier(host, port)); 
connection.SessionOptions.ProtocolVersion = 3; 
+0

Les caractères spéciaux affichés dans le Yealink T48G sont-ils corrects? – boboes

+0

Si vous définissez la version du protocole dans l'interface web du téléphone à la version 3, alors oui. –