« 想春 | トップページ | さくら、さくら »

2009.03.04

[C#]無効ユーザの判定・ビット演算[ActiveDirectory]

ActiveDirectory(AD)上のユーザが
有効であるか無効であるかを判定し、
有効なら無効に、無効なら有効にする
(処理自体には余り意味のない)処理です。

環境:
W2k3 Server R2 SP2(AD)
WinXP & Visual Studio 2005(C#.NET)

ユーザが有効か無効かは、
オブジェクトの userAccountControl 属性を調べますが、
この属性はビットマップ属性であるため、
16 進数のビット演算が必要になります。

ちなみに、UserAccountControl属性値については、
UserAccountControl フラグを使用して
ユーザー アカウント プロパティを操作する方法
(サポート オンライン)
をご参照ください。

で、無効ならばUserAccountControlには
ACCOUNTDISABLE(0x0002=2)が立っています。

以下、コード。
--
//ユーザオブジェクト取得
DirectoryEntry usr =
  new DirectoryEntry("LDAP://CN=Hoge,CN=users,DC=fabrikam,DC=com");

//userAccountControl値を取得
int val = (int) usr.Properties["userAccountControl"].Value;

//ADS_UF_ACCOUNTDISABLEが立っている(=無効である)場合
if ((val & (int)ActiveDs.ADS_USER_FLAG.ADS_UF_ACCOUNTDISABLE)
  == (int)ActiveDs.ADS_USER_FLAG.ADS_UF_ACCOUNTDISABLE)
{
  //ユーザー アカウントを有効にする(=フラグを解除)
  usr.Properties["userAccountControl"].Value
    = val & ~ (int)ActiveDs.ADS_USER_FLAG.ADS_UF_ACCOUNTDISABLE;
}
//ADS_UF_ACCOUNTDISABLEが立ってない(=有効である)場合
else
{
  //ユーザー アカウントを無効にする(=フラグを立てる)
  usr.Properties["userAccountControl"].Value
    = val | (int)ActiveDs.ADS_USER_FLAG.ADS_UF_ACCOUNTDISABLE;
}
//コミット
usr.CommitChanges();

--
ここでC#プログラマに余り馴染みがないのが、
論理演算子「 & | ~ 」ではないでしょうか?
基本自分をCプログラマだと思っている猫目も
ビット演算は結構不得手(^-^;)でして、
以下のページを参考にしました。
humming bird: ビット演算を理解してフラグを使いこなす [C#]
大変判りやすくまとまっています。感謝(^-^)。

アカウントの有効/無効化は以下を参考にしました。
ユーザー アカウントの有効化と無効化(MSDN)
管理者は見た!~AD と ILM 一家の秘密~
  : スクリプトセンターに挑戦!(ADSI でも論理演算って重要なんです!)

--
有効/無効化する方法については
あちこち書かれているんですが、

無効であるか?

という判定について、
C#でズバリ書かれたコードを
見つけることが出来なかったので、
復習も兼ねての自分用メモ。

C#, ActiveDirectory, ADSI

|

« 想春 | トップページ | さくら、さくら »

コメント

& | ~ =>c++
01&11  =>01
01|11  =>11 
~01 =>10
~11 =>00
~00 =>11

投稿: Guset | 2018.08.08 10:46

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [C#]無効ユーザの判定・ビット演算[ActiveDirectory]:

« 想春 | トップページ | さくら、さくら »