【问题标题】:How to get decoded objectGUID from Active directory using UnboundID LDAP SDK in java?java - 如何使用Java中的UnboundID LDAP SDK从Active Directory中获取解码的objectGUID?
【发布时间】:2015-10-19 12:08:22
【问题描述】:

场景 1:我能够从活动目录获取 objectGUID,但它不是可读的字符串格式。我们还需要将其以解码格式存储在 db 中。通过提供的链接“http://www.developerscrappad.com/1109/windows/active-directory/java-ldap-jndi-2-ways-of-decoding-and-using-the-objectguid-from-windows-active-directory/”中的给定示例,它演示了如何解码 objectGUID,但他们认为 objectGUID 长度为 16 字节(128 位)。在我们的例子中,当我尝试获取 objectGUID 时,我得到超过 128 位,有时我得到小于 128 位,即我们没有得到特定的位长度。 我实现的代码供参考:

public class GetLDAPUsers {

public static void main(String args[]) {
    new GetLDAPUsers().getUserFromAD();
}

void getUserFromAD() {
    try {
        LDAPConnection connection = new LDAPConnection("192.xxx.xx.xxx", 389);
        System.out.println(connection);
        String baseDN = "DC=wcomp1,DC=com";
        String[] attributes = { "entryUUID", "sn", "mail", "givenName",
                "objectGUID", "userAccountControl", "isDeleted", "modifyTimestamp", "WhenChanged", "WhenCreated"};
        // Set Ldap Connection Options for server timeout
        LDAPConnectionOptions connOption = new LDAPConnectionOptions();
        connOption.setAutoReconnect(true);
        connOption.setConnectTimeoutMillis(55000);
        connection.setConnectionOptions(connOption);
        //connection bind
        connection.bind("CN=abc,CN=ab,DC=users,DC=com", "password");
        System.out.println("connection successfully");

        //search filter query for search specific user,for all users use (&(objectclass=User)) filter.
        Filter filter = Filter.create("(&(objectclass=User)(givenName=testUserName))");
        SearchRequest searchRequest = new SearchRequest(baseDN, SearchScope.SUB, filter,
                attributes);
        SearchResult searchResult = connection.search(searchRequest);
        //get user detail
        for (SearchResultEntry searchResultEntry : searchResult.getSearchEntries()) {


            System.out.println("user name " + searchResultEntry.getAttribute("givenName").getValue() + 
                    searchResultEntry.getAttribute("objectGUID").getValue()); //We get here objectGUID string which unreadable format 

            //We convert here objectGUID in dashed string 
            System.out.println("decoded objectGUID = " + convertToDashedString(searchResultEntry.getAttribute("objectGUID").getValue().getBytes()));
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static String convertToDashedString(byte[] objectGUID) {
    StringBuilder displayStr = new StringBuilder();
    displayStr.append(prefixZeros((int) objectGUID[3] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[2] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[1] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[0] & 0xFF));
    displayStr.append("-");
    displayStr.append(prefixZeros((int) objectGUID[5] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[4] & 0xFF));
    displayStr.append("-");
    displayStr.append(prefixZeros((int) objectGUID[7] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[6] & 0xFF));
    displayStr.append("-");
    displayStr.append(prefixZeros((int) objectGUID[8] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[9] & 0xFF));
    displayStr.append("-");
    displayStr.append(prefixZeros((int) objectGUID[10] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[11] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[12] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[13] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[14] & 0xFF));
    displayStr.append(prefixZeros((int) objectGUID[15] & 0xFF));
    return displayStr.toString();
}


private static String prefixZeros(int value) {
    if (value <= 0xF) {
        StringBuilder sb = new StringBuilder("0");
        sb.append(Integer.toHexString(value));

        return sb.toString();

    } else {
        return Integer.toHexString(value);
    }
}

}

场景 2:当我尝试在 windows 环境和 linux 环境中使用上述示例获取 objectGUID 时,我会为同一用户获得不同的 objectGUID。

【问题讨论】:

  • 根据您提供的信息,我猜测您的问题已在 URL 中得到解决:ldapwiki.com/wiki/… 提供更多信息和/或一些代码示例。
  • 感谢 jeemster 提供的 cmets,但我无法打开您提供的链接。

标签: java active-directory ldap unboundid-ldap-sdk


【解决方案1】:

您不能将ObjectGUID 解释为字符串。通常,我会设置目录上下文环境以将ObjectGUID 作为byte[] 返回,然后使用转换方法

env.put("java.naming.ldap.attributes.binary", "ObjectGUID");

String newGuid = convertToDashedString(guid);

【讨论】:

    【解决方案2】:

    你可以这样做:

    public static String getGuidFromByteArray(byte[] bytes) {
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        long high = bb.getLong();
        long low = bb.getLong();
        UUID uuid = new UUID(high, low);
        return uuid.toString();
    }
    

    【讨论】:

    • 这是一个完美的答案,值得点赞,感谢@bradvido 的解决方案:)
    【解决方案3】:

    对于春季: 注入属性

    java.naming.ldap.attributes.binary
    

    正确进入 ldapTemplate。

    https://stackoverflow.com/a/52209645/406065

    【讨论】:

      【解决方案4】:

      以上代码更正: searchResultEntry.getAttribute("objectGUID").getValueByteArray()

      以上将为您提供可用于使用 Base64 进行编码的字节数组。

      以下是错误的: searchResultEntry.getAttribute("objectGUID").getValue().getBytes() 会将结果转换为字符串,然后再转换为不正确的字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多