|
HOME
|
2009.03.04
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
有効であるか無効であるかを判定し、
有効なら無効に、無効なら有効にする
(処理自体には余り意味のない)処理です。
環境:
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
PR
2008.11.19
以下のテーブル[LIST]で、
Typeが2件以上重複する件数を集計するSQL。
LIST:
SQLは、
SELECT Type, COUNT(*) AS NameCount
FROM LIST
GROUP BY Type
HAVING (COUNT(*) > 1)
ORDER BY Type
結果:
丸1日悩んだ集計SQLだったのでメモ代わりに。
HAVINGなんて滅多に使わないから
普通に忘れてました…。
実行環境:SQL Server 2005
--
昨日は勢い余って
5時の始発で出社して終電で帰るという
ブッ飛んだ麻薬中毒者(?)みたいなことをしてしまったので、
今日は午前半休の上に定時退社、
実働=4時間ということをしてみました。
Typeが2件以上重複する件数を集計するSQL。
LIST:
Name | Type |
TANAKA | A |
SHIKI | C |
MARIA | A |
KURIYAKAWA | B |
TARO | O |
GEM | B |
GONZO | AB |
KARAKI | B |
SQLは、
SELECT Type, COUNT(*) AS NameCount
FROM LIST
GROUP BY Type
HAVING (COUNT(*) > 1)
ORDER BY Type
結果:
Type | NameCount |
A | 2 |
B | 3 |
丸1日悩んだ集計SQLだったのでメモ代わりに。
HAVINGなんて滅多に使わないから
普通に忘れてました…。
実行環境:SQL Server 2005
--
昨日は勢い余って
5時の始発で出社して終電で帰るという
ブッ飛んだ麻薬中毒者(?)みたいなことをしてしまったので、
今日は午前半休の上に定時退社、
実働=4時間ということをしてみました。
2008.09.22
C# + ASP.NET のWebアプリで、
ドロップダウンリストを初期選択させる方法を以下に記載します。
あちこちググッたんですが、
そのものズバリを記載したサイトが見つからなかったので、
或いは単なる自分用メモ。
//リスト(dropdownHoge)にアイテムが追加されているものとする
//セッション変数はHOGE
誤コード①(by 後輩):
if (!dropdownHoge.Items.FindByValue(HOGE).Selected)
{
dropdownHoge.Items.FindByValue(HOGE).Selected = true;
}
//セッション変数HOGE(と一致する値)が選択されていなかった場合、
//HOGEと同じものを選択させようとする意図は判ります。
誤コード②(by猫目):
//Dropdownアイテム分ループ
foreach (ListItem item in dropdownHoge.Items)
{ //セッション変数と一致した場合
if (item.Value == HOGE)
{ //一致するアイテムを選択する
item.Selected = true;
break;
}
}
//VBぽい方法。
//ドロップダウンアイテム数分回して、
//一致していれば選択させることを意図しました。
①②共に
「System.Web.HttpException:
DropDownList で複数項目が選択されるように指定できません。」
が出ます。
正解:
int index=0;
//Dropdownアイテム分ループ
foreach (ListItem item in dropdownHoge.Items)
{//セッション変数と一致した場合
if (item.Value == HOGE)
{ //一致するアイテムを選択する
dropdownHoge.SelectedIndex = index;
break;
}
index++;
}
これだけ。
ドロップダウンのSelectedIndexを選択(初期表示)するItemのindexにするだけ。
わかってみると「なーんだ」な感じ。
C#, ASP.NET, DropdownList
--
外では雷がものすごく光ってます。
まさに風雲急を告げる感じ。
ドロップダウンリストを初期選択させる方法を以下に記載します。
あちこちググッたんですが、
そのものズバリを記載したサイトが見つからなかったので、
或いは単なる自分用メモ。
//リスト(dropdownHoge)にアイテムが追加されているものとする
//セッション変数はHOGE
誤コード①(by 後輩):
if (!dropdownHoge.Items.FindByValue(HOGE).Selected)
{
dropdownHoge.Items.FindByValue(HOGE).Selected = true;
}
//セッション変数HOGE(と一致する値)が選択されていなかった場合、
//HOGEと同じものを選択させようとする意図は判ります。
誤コード②(by猫目):
//Dropdownアイテム分ループ
foreach (ListItem item in dropdownHoge.Items)
{ //セッション変数と一致した場合
if (item.Value == HOGE)
{ //一致するアイテムを選択する
item.Selected = true;
break;
}
}
//VBぽい方法。
//ドロップダウンアイテム数分回して、
//一致していれば選択させることを意図しました。
①②共に
「System.Web.HttpException:
DropDownList で複数項目が選択されるように指定できません。」
が出ます。
正解:
int index=0;
//Dropdownアイテム分ループ
foreach (ListItem item in dropdownHoge.Items)
{//セッション変数と一致した場合
if (item.Value == HOGE)
{ //一致するアイテムを選択する
dropdownHoge.SelectedIndex = index;
break;
}
index++;
}
これだけ。
ドロップダウンのSelectedIndexを選択(初期表示)するItemのindexにするだけ。
わかってみると「なーんだ」な感じ。
C#, ASP.NET, DropdownList
--
外では雷がものすごく光ってます。
まさに風雲急を告げる感じ。
|HOME|
忍者ブログ [PR]