3

Active DirectoryからlogonHours属性をデコードして、Javaアプリケーションに正しく表示されるようにしようとしています。属性エディタを見ると、次のようになります。

logonHours 03 00 00 00 F0 FF 1F F0 FF 1F F0 FF 1F F0 FF 1F F0 FF 1F 00 FF

これは正確に21バイトの長さであり、これは私が期待していることです(毎日、3バイトでエンコードされ、合計で1日あたり24ビットになります)。これは、私が持っているlogonHoursの下の表示と一致することを意味します。ただし、私のエンコーディングは次のとおりです(毎日のビット文字列)

Sun:     00000000 (00) 00000000 (00) 00000000 (00)
Mon-Fri: 00001111 (0F) 11111111 (FF) 11111000 (F8)
Sat:     00000000 (00) 11111111 (FF) 11000000 (C0)

これにより、logonHours属性と表示の間に何らかのエンコードが発生していると思います。私はPerlコードとVBScriptを見てきました-これらのいずれかをJavaで変換すると、実際には一致しない単純な変換が行われます。

誰かがlogonHours属性を正しくデコードするためのJava、C#.NETまたは他の擬似コードを持っていますか?

4

1 に答える 1

3

手を挙げて助けを求めてから10分後にこれらのことを理解するとき、私はそれを嫌います。重要な点は次のとおりです。System.DirectoryServices.AccountManagementを使用したC#.Net3.5でのActiveDirectoryの許可されたログオン時間-具体的には、ビットの順序と、配列が1から1の問題で始まるという事実。これが私が思いついたJavaのコードです:

private String[] decodeLogonHours(Attribute attr)
{
    byte[] raw = attr.getValueByteArray();
    String[] days = new String[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    ArrayList<String> ret = new ArrayList<String>();

    for (int day = 0 ; day < days.length ; day++) {
        byte[] vBits;
        if (day == 6) {
            vBits = new byte[] { raw[19], raw[20], raw[0] };
        } else {
            vBits = new byte[] { raw[day*3+1], raw[day*3+2], raw[day*3+3] };
        }

        StringBuffer sb = new StringBuffer();
        sb.append(String.format("%s:", days[day]));
        for (int b = 0 ; b < 3 ; b++) {
            sb.append(" ");
            sb.append(decodeLogonBits(vBits[b]));
        }
        ret.add(sb.toString());
    }

    String[] r = new String[ret.size()];
    ret.toArray(r);
    return r;
}

private String decodeLogonBits(byte b) {
    StringBuffer sb = new StringBuffer();
    sb.append((b & 0x01) > 0 ? "1" : "0");
    sb.append((b & 0x02) > 0 ? "1" : "0");
    sb.append((b & 0x04) > 0 ? "1" : "0");
    sb.append((b & 0x08) > 0 ? "1" : "0");
    sb.append((b & 0x10) > 0 ? "1" : "0");
    sb.append((b & 0x20) > 0 ? "1" : "0");
    sb.append((b & 0x40) > 0 ? "1" : "0");
    sb.append((b & 0x80) > 0 ? "1" : "0");
    return sb.toString();
}
于 2012-10-21T17:18:23.727 に答える