0

在一个涉及 Active Directory 的项目中,我一直在使用 System.DirectoryServices。我很好奇 UserAccountControl 属性的实现来控制特定帐户的属性。如果我想在我自己的应用程序中使用字节组合来实现设置来确定 x 或 y 设置的状态,我将如何在 C# 中执行此操作?假设我想在我自己的类上实现一个 useraccountcontrol 属性,并且我想使用字节组合来确定帐户应该拥有哪些权限。

这是它在 Active Directory 中的修改方式:http: //support.microsoft.com/kb/305144

这里是对象定义的地方:http: //msdn.microsoft.com/en-us/library/ms680832%28VS.85%29.aspx

编辑:

假设我有一个自己的 User 类,并且我想实现一个类似于在 Active Directory 中实现 UserAccountControl 的方式的属性。假设我想要一组四个字节来存储设置。

我想使用最后一个字节来确定帐户状态,0 = 帐户不活动 1 = 帐户活动 2 = 帐户已过期 4 = 一些其他状态 8 = 另一个状态。

然后左边的下一个字节我想包含帐户类型:16=Admin Account,32=Regular Account,64=Guest Account,128=Other Account。

然后使用左边的下一个字节来设置一些其他设置,以便 256 = 某些东西,512 = 其他东西,1024 = 其他东西,等等。

我想将其结合起来使用按位组合来设置帐户属性。我脑子里有这个想法,但我不确定如何实现它,或者我想要做什么是否有意义。

编辑:在收到答案并进行更多挖掘后,我发现这个链接更多地讨论了设置标志:http: //msdn.microsoft.com/en-us/library/ms229062.aspx

4

1 回答 1

1

让我们定义一个辅助类型:

[Flags]
public enum UserAccountControl {
    // values from http://support.microsoft.com/kb/305144
    Script = 0x0001,
    AccountDisabled = 0x0002,
    HomeDirRequired = 0x0008,
    Lockout = 0x0010,
    PasswordNotRequired = 0x0020,
    PasswordCantChange = 0x0040,
    EncryptedTextPasswordAllowed = 0x0080,
    TempDuplicateAccount = 0x0100,
    NormalAccount = 0x0200,
    InterDomainTrustAccount = 0x0800,
    WorkstationTrustAccount = 0x1000,
    ServerTrustAccount = 0x2000,
    DontExpirePassword = 0x10000,
    MnsLogonAccount = 0x20000,
    SmartcardRequired = 0x40000,
    TrustedForDelegation = 0x80000,
    Delegated = 0x100000,
    UseDesKeyOnly = 0x200000,
    DontReqPreauth = 0x400000,
    PasswordExpired = 0x800000,
    TrustedToAuthForDelegation = 0x1000000
}

您可以在intenum类型之间进行转换(我假设您知道如何将这些值之一作为整数获取)。然后您可以使用按位运算符操作值,如下所示:

void manipulateUserFlags(UserAccountControl uac) {
    // Set the SCRIPT flag (bitwise OR)
    uac |= UserAccountControl.Script;

    // Clear the ACCOUNTDISABLE flag (complement, bitwise AND)
    uac &= ~UserAccountControl.AccountDisabled;

    // Check for the HOMEDIR_REQUIRED flag (bitwise AND)
    if((uac & UserAccountControl.HomeDirRequired) != UserAccountControl.None) {
        // ...
    }

    // Toggle the NORMAL_ACCOUNT flag (bitwise XOR)
    uac ^= UserAccountControl.NormalAccount;

    // Check for several types of trust, and a required password
    if((uac & UserAccountControl.WorkstationTrustAccount
            & UserAccountControl.ServerTrustAccount
            & ~UserAccountControl.PasswordNotRequired) != UserAccountControl.None) {
        // ...
    }
}

这些是同样适用于整数的按位运算符,但enum在 C# 中建议使用类型,因为它们的类型更强。整数的按位操作在 C 或 C++ 中更有意义,因为您可以直接在条件中对整数进行测试,而且这些语言无论如何都不是强类型的。

但是,如果您打算将其作为库的一部分来实现,或者通常执行这些操作,我会考虑围绕它进行更多设计,使用几个enum基于属性的属性来表示类似设置int ToADValueUserAccountControl FromADValue方法的组。这将为您提供放置任何验证逻辑的清晰位置,并使操作这些属性的代码更具可读性。

于 2010-11-02T23:33:30.560 回答