我正在阅读有关如何通过C#使用AD的this文章。在文章的中间部分,会出现以下代码。
用户帐户属性是复选框。有没有人知道下面的代码行将返回一个选中的复选框?如果选中多个复选框,该怎么办?我以为回归的布尔会更直观吗?
//Add this to the create account method
int val = (int)newUser.Properties["userAccountControl"].Value;
//newUser is DirectoryEntry object
为什么我们做逻辑或以下?它是如何在int和第二个值之间起作用的(是一个字节?)
newUser.Properties["userAccountControl"].Value = val | 0x80000;
//ADS_UF_TRUSTED_FOR_DELEGATION
我知道这听起来很天真...
由于
答案 0 :(得分:1)
userAccountControl
属性包含一个双字节值,其中每个位具有重要意义。如果该位打开,则使用某个选项 - 如果它未打开,则该选项不存在。
这比拥有大量布尔值更紧凑,空间更优化。此外,许多“较旧的”Win16和Win32 API只是这样工作。
按位“AND”运算符用于检查是否存在这样的单个位:
if(newUser.Properties [“userAccountControl”]。Value& 0x400 == 0x400)
在这种情况下,设置0x400位。
为了实际设置一个位,使用按位“OR”运算符:
newUser.Properties [“userAccountControl”]。Value = val |为0x800
这将设置“0x800”位。
这是基本的逐位布尔逻辑,真的。确实有点混乱 - 但.NET有一些帮助使事情变得更容易(例如,查看BitArray数据类型)
答案 1 :(得分:0)
userAccountControl是一个标志字段,这就是他们将它放入int的原因。
有关详细信息,请参阅http://support.microsoft.com/kb/305144。
答案 2 :(得分:0)
根据您提供的信息,我猜他们正在使用标志类型系统来指示所选项目。每个选项都有一个特定的值,它们会相加,以便您可以返回选中的内容。
这可以通过逻辑证明,也可以用于查看是否包含特定值。