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));
}
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
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 []. –
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