程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 在Delphi中ADSI創建Windows用戶帳號

在Delphi中ADSI創建Windows用戶帳號

編輯:Delphi
     在Delphi中可以使用微軟的ADSI(活動目錄服務接口)創建Windows用戶帳號。可能是由於ADSI的名字,許多人以為ADSI只能在Windows 2000下使用,實際上所有Win32平台都支持ADSI。可能需要下載ADSI為不同的Windows版本。(更多詳細資料http://www.microsoft.com/china/windows2000/library/howitworks/activedirectory/adsilinks.htm)。Windows 2000 包含ADSI。

          ADSI是一個很大的話題。在這篇文章中我只粗略的介紹一下。ADSI是一類為許多不同計算機服務(大部分基於目錄)的通用接口。一些標准的ADSI提供者(Provider就像可以在你的程序中使用的COM接口)有WinNT,IIS,LDAP和NDS。使用WinNT提供者(Provider)能創建、修改用戶帳號,設置或修改組。

          下面的小程序展示了在NT/2000下使用ADSI創建用戶帳號必要的步驟:

          首先你需要導入ADSI類庫(Project/Import Type Library菜單)。該類庫可以在system32子目錄中找到(如 C:WINNTsystem32activeds.tlb)。文件名必須是“ activeds.tlb”。如果找不到該文件,你需要正確的安裝ADSI。在成功導入類庫以後,可以在Delphi的Imports目錄下找到activeds_tlb.pas這樣一個文件(如 ..Delphi6Importsactiveds_tlb.pas)。還需要這個文件包含在你的Uses語句,讓ADSI可以在Delphi程序中使用。

      下面是ADSI創建用戶的例子。需要用你將要創建用戶的真正的計算機名稱替換[computername]。同樣[accountname]是要創建的用戶帳號。在WindowNT 4.0和Windows 2000中測試通過。

  ...

  uses ActiveX,        // 使用了COM Moniker實例
       ActiveDs_TLB,   // 已創建的類庫
       ComObj;         // 使用了OleCheck和其他COM函數

  implementation

  procedure TForm1.BtnCreateUserClick(Sender: TObject);
  var
    Usr:  IADsUser;
    Comp: IADsContainer;
  begin
    try
      Comp := GetObject('WinNT://[computername],computer') as
        IADsContainer;
      Usr := Comp.Create('user', '[accountname]') as IADsUser;
      Usr.SetInfo;
    except
      on E: EOleException do begin
        ShowMessage(E.Message);
      end;
    end;
  end;

  
  procedure TForm1.BtnSetPassWordClick(Sender: TObject);
  var
    Usr: IADsUser;
  begin
    try
      Usr := GetObject('WinNT://[computername]/[accountname],user')
        as IADsUser;
      Usr.SetPassword('thenewpassWord');
    except
      on E: EOleException do begin
        ShowMessage(E.Message);
      end;
    end;
  end;

  
  // GetObject是在Usenet上找到的VB代碼(GetObject)。
  //
  // GetObject能使用“ADSIPath”(如WinNT://....或IIS://localhost)
  // 和現有的ADSI提供者捆綁在一起
  

  function TForm1.GetObject(const Name: string): IDispatch;
  var
    Moniker: IMoniker;
    Eaten: integer;
    BindContext: IBindCtx;
    Dispatch: IDispatch;
  begin
    OleCheck(CreateBindCtx(0, BindContext));
    OleCheck(MkParseDisplayName(BindContext,
                                PWideChar(WideString(Name)),
                                Eaten,
                                Moniker));
    OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch,
              Dispatch));

    Result := Dispatch;
  end;

  end.

          也可以使用ADSI修改用戶帳號的設置。下列代碼能改變任何帳號的“密碼永不過期”選項。

  procedure TFormMain.ButtonNeverExpiresClick(Sender: TObject);
  var
    Usr: IADsUser;
  begin
    try
      Usr := GetObject('WinNT://[computername]/[acccoutname],user') as IADsUser; 
                                    // 檢查Checkbox的狀態
    if CheckBoxPassWordNeverExpires.Checked then
      Usr.Put('UserFlags', Usr.Get('UserFlags') OR 65536) 
    // 65536在微軟ADSI SDK的iads.h中被定義為UF_DONT_EXPIRE_PASSWord
    else
      Usr.Put('UserFlags', Usr.Get('UserFlags') XOR 65536);  
      Usr.SetInfo;

    except
      on E: EOleException do begin
        ShowMessage(E.Message);
      end;
    end;
  end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved