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 个字节,每天总共 24 位)。这是为了匹配我所拥有的 loginHours 下的显示。但是,我的编码如下(每​​天的位串)

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 中转换其中任何一个都是直接转换,这与现实不符。

有没有人有 Java、C#.NET 或其他伪代码来正确解码 logonHours 属性?

4

1 回答 1

3

当我在举手寻求帮助后十分钟后弄清楚这些事情时,我讨厌它。关键在此页面中:Active Directory Permitted Logon Times with C# .Net 3.5 using System.DirectoryServices.AccountManagement - 特别是位的顺序以及数组以非 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 回答