在知道一个用户名的前提下,如果用DELPHI通过活动目录查询到它的显示名称呢?比如我知道一个用户名'test', 它的显示名称为'工程部.test',如何通过DELPHI写程序来得到这个显示的名称呢?

解决方案 »

  1.   

    '工程部.test' 是不是 计算机名 啊?
      

  2.   

    是不是域账号是'test',这个域账号的名称是'工程部.test' ?这个是不是要通过域控来取域账号的名称(个人意见)?不是很懂,等待高手。
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ComCtrls;type
    USER_INFO_1 = record
        usri1_name: LPWSTR;
        usri1_password: LPWSTR;
        usri1_password_age: DWORD;
        usri1_priv: DWORD;
        usri1_home_dir: LPWSTR;
        usri1_comment: LPWSTR;
        usri1_flags: DWORD;
        usri1_script_path: LPWSTR;
      end;
    lpUSER_INFO_1 = ^USER_INFO_1;
    function NetUserEnum(ServerName: PWideChar;Level, Filter: DWord;
                         var Buffer: Pointer;PrefMaxLen: DWord;
                         var EntriesRead,TotalEntries,ResumeHandle: DWord): LongWord;
                         stdcall; external 'netapi32.dll';
    function NetApiBufferFree(pBuffer: PByte): LongInt;
                         stdcall;  external 'netapi32.dll';type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        RichEdit1: TRichEdit;
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      EntiesRead: DWORD;
      TotalEntries: DWORD;
      UserInfo: lpUSER_INFO_1;
      lpBuffer: Pointer;
      ResumeHandle: DWord;
      Counter: Integer;
      NetApiStatus: LongWord;
      userName,userdest:string;
    begin
        ResumeHandle := 0;
        repeat   //枚举帐户
            NetApiStatus := NetUserEnum(nil, 1, 0, lpBuffer, 0, EntiesRead,TotalEntries, ResumeHandle);
            //如果要指定域名,将NETUSERENUM里的第一个参数NIL 替换成域计算机名即可;
            UserInfo := lpBuffer;
            for Counter := 0 to EntiesRead - 1 do
                begin
                userName:= WideCharToString(UserInfo^.usri1_name);//获取用户名
                userdest:=WideCharToString(UserInfo^.usri1_comment);//获取用户描述
                RichEdit1.Lines.Add(userName + '_' +userdest);
             end;
        until (NetApiStatus <> ERROR_MORE_DATA);//枚举下一下用户
        NetApiBufferFree(lpBuffer);//释放分配的空间
    end;end.
      

  4.   

    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      UserInfo: lpUSER_INFO_1;
      lpBuffer: Pointer;
      userName,userdest:string;
    begin
        NetUserGetInfo(nil,'administrator',1,lpbuffer);
        //如果要指定域名,将NETUSERENUM里的第一个参数NIL 替换成域计算机名即可;
        userinfo := lpbuffer;
        userName:= WideCharToString(UserInfo^.usri1_name);//获取用户名
        userdest:=WideCharToString(UserInfo^.usri1_comment);//获取用户描述
        RichEdit1.Lines.Add(userName + '_' +userdest);    NetApiBufferFree(lpBuffer);//释放分配的空间
    end;这段可能更准确
      

  5.   

    我用第一种方式得到结果:'Administrator 管理计算机(域)的内置帐户
    Guest 供来宾访问计算机或访问域的内置帐户
    SQLDebugger This user account is used by the Visual Studio .NET Debugger'没有域的其他用户啊,要指定域主机名?第二种:加了
        function   NetUserGetInfo(   
          Server:  PWideChar;
          UserName:PWideChar;
          Level:   DWORD;   
          Buf:     Pointer):Longint;stdcall;external 'netapi32.dll'; 
    还报错,EAccessViolation with message 'Access Violation at address 0040403f in module 'xxx.exe'.Read of address 8BD88B53'.Process stopped.
      

  6.   

    function NetUserGetInfo(servername: PWideChar; username: PWideChar;
     level: DWORD; var bufptr: Pointer): DWORD; stdcall;  external 'netapi32.dll' name 'NetUserGetInfo';
    function NetApiBufferFree(buffer : Pointer) :Integer; stdcall; external 'netapi32.dll';这样就可以了。
      

  7.   

    NetUserEnum和NetUserGetInfo是不是只能查 本地 的账号啊?我将上面两个函数的第一个参数换成别人的主机名,NetUserEnum返回空,NetUserGetInfo报错。怎么回事?
      

  8.   

    我发现我的电脑上一个exe能使用这个办法获取到display name
    但是另外一个就不行
    真是OOXX了,都不知道原因我的电脑有域账号