Microsoft の ADSI (Active Directory サービス インターフェイス) を使用して、Delphi で Windows ユーザー アカウントを作成できます。おそらく ADSI という名前のせいで、ADSI は Windows 2000 でのみ使用できると考えている人が多いでしょう。実際、すべての Win32 プラットフォームは ADSI をサポートしています。異なる Windows バージョン用の ADSI をダウンロードする必要がある場合があります。 (詳細については http://www.microsoft.com/china/windows2000/library/howitworks/activedirectory/adsilinks.htm)。 Windows 2000 には ADSI が含まれています。
ADSI は大きなトピックです。この記事では簡単に紹介するだけです。 ADSI は、さまざまなコンピューター サービス (主にディレクトリ ベース) の共通インターフェイスです。標準の ADSI プロバイダー (プロバイダーはプログラムで使用できる COM インターフェイスのようなもの) には、WinNT、IIS、LDAP、NDS などがあります。 WinNT プロバイダーを使用して、ユーザー アカウントを作成および変更し、グループを設定または変更します。
次の小さなプログラムは、NT/2000 で ADSI を使用してユーザー アカウントを作成するために必要な手順を示しています。
まず、ADSI クラス ライブラリをインポートする必要があります ([プロジェクト]/[タイプ ライブラリのインポート] メニュー)。このクラス ライブラリは、system32 サブディレクトリ (C:/WINNT/system32/activeds.tlb など) にあります。ファイル名は「activeds.tlb」である必要があります。ファイルが見つからない場合は、ADSI を正しくインストールする必要があります。クラス ライブラリが正常にインポートされると、Delphi の Imports ディレクトリ (../Delphi6/Imports/activeds_tlb.pas など) に activeds_tlb.pas などのファイルが見つかります。 ADSI を Delphi プログラムで使用できるように、このファイルを Uses ステートメントに含める必要もあります。
以下は、ADSI がユーザーを作成する例です。 [コンピュータ名] を、ユーザーを作成する実際のコンピュータ名に置き換える必要があります。同様に、[アカウント名] は作成するユーザー アカウントです。 WindowNT 4.0 および Windows 2000 でテスト済み。
...
ActiveX を使用します。 // COM モニカー インスタンスを使用します
ActiveDs_TLB, // クラスライブラリを作成しました
ComObj; //OleCheck およびその他の COM 関数を使用します。
実装
プロシージャ TForm1.BtnCreateUserClick(送信者: TObject);
変数
ユーザー: IADsUser;
コンプ: IADsContainer;
始める
試す
Comp := GetObject('WinNT://[コンピュータ名],コンピュータ') as
IADコンテナ;
Usr := Comp.Create('user', '[アカウント名]') as IADsUser;
Usr.SetInfo;
を除外する
E: EOleException が始まります
ShowMessage(E.Message);
終わり;
終わり;
終わり;
プロシージャ TForm1.BtnSetPassWordClick(送信者: TObject);
変数
ユーザー: IADsUser;
始める
試す
ユーザー := GetObject('WinNT://[コンピューター名]/[アカウント名],ユーザー')
IADsUserとして;
Usr.SetPassword('新しいパスワード');
を除外する
E: EOleException が始まります
ShowMessage(E.Message);
終わり;
終わり;
終わり;
// GetObject は、Usenet にある VB コード (GetObject) です。
//
// GetObject は「ADSipath」(WinNT://.... または IIS://localhost など)を使用できます
// 既存の ADSI プロバイダーとバンドルする
関数 TForm1.GetObject(const Name: string): IDispatch;
変数
モニカー: IMoniker;
食べた: 整数;
バインドコンテキスト: IBindCtx;
ディスパッチ: IDispatch;
始める
OleCheck(CreateBindCtx(0, BindContext));
OleCheck(MkParseDisplayName(BindContext,
PwideChar(ワイド文字列(名前))、
食べた、
モニカー));
OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch,
急送));
結果 := ディスパッチ;
終わり;
終わり。
ADSI を使用してユーザー アカウント設定を変更することもできます。次のコードは、すべてのアカウントの「パスワードを無期限にする」オプションを変更します。
プロシージャ TFormMain.ButtonNeverExpiresClick(送信者: TObject);
変数
ユーザー: IADsUser;
始める
試す
Usr := GetObject('WinNT://[コンピューター名]/[アカウント名],ユーザー') asIADsUser;
// チェックボックスの状態を確認する
CheckBoxPasswordNeverExpires.Checked の場合、その後
Usr.Put('UserFlags', Usr.Get('UserFlags') OR 65536)
// 65536 は Microsoft ADSI SDK の iads.h で UF_DONT_EXPIRE_PASSWORD として定義されています
それ以外
Usr.Put('UserFlags', Usr.Get('UserFlags') XOR 65536);
Usr.SetInfo;
を除外する
E: EOleException が始まります
ShowMessage(E.Message);
終わり;
終わり;
終わり;