ADからユーザーの詳細を取得して別のシステムにインポートするツールに取り組んでいます。objectSidを一意の識別子として使用することを計画していましたが、何らかの理由で、LDAP結果のobjectSidがActiveDirectoryのオブジェクトSidと一致しないことがわかりました。ほとんどのバイトは同じですが、いくつかは異なり、LDAPの結果のバイト数がADよりも少ない場合があります。
ADのユーザーからのobjectSid:
decimal: [ 1, 5, 0, 0, 0, 0, 0, 5, 21, 0, 0, 0, 35, 106, 222, 96, 236, 251, 239, 68, 32, 255, 234, 203, 122, 4, 0, 0]
hex: [01, 05, 00, 00, 00, 00, 00, 05, 15, 00, 00, 00, 23, 6A, DE, 60, EC, FB, EF, 44, 20, FF, EA, CB, 7A, 04, 00, 00]
LDAP結果を介した同じユーザーのobjectSid:
decimal: [ 1, 5, 0, 0, 0, 0, 0, 5, 21, 0, 0, 0, 35, 106, 63, 96, 63, 63, 63, 68, 32, 63, 63, 63, 122, 4, 0, 0]
hex: [01, 05, 00, 00, 00, 00, 00, 05, 15, 00, 00, 00, 23, 6A, 3F, 60, 3F, 3F, 3F, 44, 20, 3F, 3F, 3F, 7A, 04, 00, 00]
LDAPの結果では、128を超える値が63/3Fとして返されるように見えます。別のユーザーの場合、LDAPの結果に1バイト(疑問符)がありません。
hex from AD: [01 05 00 00 00 00 00 05 15 00 00 00 23 6A DE 60 EC FB EF 44 20 FF EA CB 88 04 00 00]
hex from LDAP: [01 05 00 00 00 00 00 05 15 00 00 00 23 6A 3F 60 3F 3F 3F 44 20 3F 3F 3F ?? 04 00 00]
これらのテストを実行するために使用しているコードの主要部分は次のとおりです。
final String ldapADServer = "ldap://" + cmdLine.getOptionValue("ldap");
final String bindDN = cmdLine.getOptionValue("u");
final String bindCredential = cmdLine.getOptionValue("p");
final String baseCtxDN = cmdLine.getOptionValue("d");
final Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, bindDN);
env.put(Context.SECURITY_CREDENTIALS, bindCredential);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapADServer);
env.put("com.sun.jndi.ldap.trace.ber", System.err);
final LdapContext ctx = new InitialLdapContext(env, null);
final String searchFilter = "(&(objectClass=user) (sAMAccountName=" + accountName + "))";
final SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
final StringBuilder builder = new StringBuilder();
final NamingEnumeration<SearchResult> results = ctx.search(baseCtxDN, searchFilter, searchControls);
while (results != null && results.hasMoreElements()) {
final SearchResult result = results.nextElement();
builder.append(LdapHelper.getSearchResultDetails(result, ""));
}
logger.info("Search results: {}{}", StringUtils.NEW_LINE, builder.toString());
LdapHelperは、すべての属性をループして、適切にフォーマットされた文字列で返します。objectGUIDとobjectSidは16進形式で出力されます。
JRE6とJRE7を使用してテストを実行しましたが、同じ結果になりました。私たちのADサーバーはWindowServer2008 RC2であり、私は389と3268の両方のADポートを使用しようとしました。
今から他のJavaLDAPライブラリを調べますが、他の誰かがこれらの問題に遭遇したかどうか、またはこれがなぜであるか、そしてそれを回避する方法を誰かが知っているかどうかを確認したいと思いました。つまり、ADから適切な値を取得する方法はありますか?