2017-06-21 3 views
1

Je peux récupérer objectSID et de nombreux autres attributs sans erreur, mais pas sidHistory (J'ai besoin de sidHistory pour voir quel compte dans le domaine A correspond à un compte dans le domaine B).Récupération de sidHistory à partir de LDAP avec Java

est ici le code qui fonctionne pour la plupart des attributs, y compris objectSID: « ? »

void dumpCSV(Attributes attrs, String[] displayList, Logger lg) { 
    // Assume we're only dealing with single valued attributes (for now) 
    StringBuilder sb = new StringBuilder(); 
    for (String attName : displayList) { 
     String name = attName.trim().toLowerCase(); 
     Attribute att = attrs.get(name); 
     if (sb.length() > 0) 
      sb.append(","); 
     if (att != null) { 
      String v = "?"; 
      try { 
       if ((name.equals("objectsid")) || (name.equals("sidhistory"))) 
        v = binString(att); 
       else { 
        v = (String) att.get(); 
        if (name.equals("pwdlastset") || name.equals("lastlogontimestamp") || name.equals("lastlogon") || name.equals("accountexpires")) 
         v = TickConverter.tickDate(v); 
       } 
       sb.append(Logger.tidyString(v)); 
      } catch (NamingException e) { 
       System.err.println("NamingException, " + e); 
       return; 
      } 
     } 
    } 
     lg.logln(sb.toString()); 
    } 
} 

static String binString(Attribute att) { 
    try { 
     byte bin[] = (byte[]) att.get(); 
     return decodeSID(bin); 
    } catch (NamingException e) { 
     System.err.println("NamingException, " + e); 
     return "?"; 
    } 
} 

// taken from http://www.adamretter.org.uk/blog/entries/LDAPTest.java, in turn borrowed from Oracle docs 
public static String decodeSID(byte[] sid) { 
    final StringBuilder strSid = new StringBuilder("S-"); 

    // get version 
    final int revision = sid[0]; 
    strSid.append(Integer.toString(revision)); 

    //next byte is the count of sub-authorities 
    final int countSubAuths = sid[1] & 0xFF; 

    //get the authority 
    long authority = 0; 
    //String rid = ""; 
    for(int i = 2; i <= 7; i++) { 
     authority |= ((long)sid[i]) << (8 * (5 - (i - 2))); 
    } 
    strSid.append("-"); 
    strSid.append(Long.toHexString(authority)); 

    //iterate all the sub-auths 
    int offset = 8; 
    int size = 4; //4 bytes for each sub auth 
    for(int j = 0; j < countSubAuths; j++) { 
     long subAuthority = 0; 
     for(int k = 0; k < size; k++) { 
      subAuthority |= (long)(sid[offset + k] & 0xFF) << (8 * k); 
     } 

     strSid.append("-"); 
     strSid.append(subAuthority); 

     offset += size; 
    } 

    return strSid.toString();  
} 

Si je tente de récupérer sidHistory en utilisant ce, tyhe valeur que je reçois est.

Même si j'utilise un namingEnumeration, comme je pense que je devrais probablement, je reçois "Exception dans le fil" AWT-EventQueue-0 "java.util.NoSuchElementException: Vector Enumeration", probablement parce que je suis en train de l'enregistrer le mauvais typoe (et j'ai essayé quelques types différents).

extrait est:

String v; 
NamingEnumeration nenum = att.getAll(); 
while (nenum.hasMore()) { 
    v = ""; 
    if (name.equals("objectsid")) { 
     v = binString(att); 
     nenum.next(); 
    } else if (name.equals("sidhistory")) { 
     nenum.next(); 
     String[] vv = ((String[]) nenum.next()); 
     v = vv[0]; 
    } else 
    v = (String) nenum.next(); 
    if (name.equals("pwdlastset") || name.equals("lastlogontimestamp") || name.equals("lastlogon") || name.equals("accountexpires")) 
     v = TickConverter.tickDate(v); 
    lg.logln(name + "=" + Logger.tidyString(v)); 
} 
+0

La recherche de l'ensemble d'attributs pour les attributs qui vous intéressent est vaine. Vous devriez récupérer les attributs que vous voulez, via 'Attributes.get()', et ensuite regarder dans leurs valeurs. D'une part, votre chemin est inefficace et, d'autre part, il néglige l'insensibilité à la casse des noms d'attribut. – EJP

+0

Salut EJP: Je fais cela - notez "for (String attName: displayList)" et "Attribute att = attrs.get (name)". Je spécifie les attributs particuliers que je veux dans displayList []. –

+0

Alors, pourquoi testez-vous le nom après? Pourquoi la boucle? Pourquoi ne pas simplement obtenir ceux que vous voulez, via les noms que vous voulez? Code très étrange. – EJP

Répondre

1

Nous avons utilisé un code similaire à: Nous notons nous l'avons vu à http://book2s.com/java/src/package/net/sf/michaelo/tomcat/realm/activedirectoryrealm.html

... 
Attribute sidHistory = roleAttributes.get("sIDHistory;binary"); 
List<String> sidHistoryStrings = new LinkedList<String>(); 
if (sidHistory != null) 
{ 
    NamingEnumeration<?> sidHistoryEnum = sidHistory.getAll(); 
    while (sidHistoryEnum.hasMore()) 
    { 
    byte[] sidHistoryBytes = (byte[]) sidHistoryEnum.next(); 
    sidHistoryStrings.add(new Sid(sidHistoryBytes).toString()); 
    } 
... 
} 

sidHistory est multi-valeurs et binaire (octetString) est ce qui cause la plus les maux de tête des gens.

Espérons que cela aide.

+0

Merci beaucoup. C'est exactement ce que je recherchais. –