在Server Application里面如何得到当前的用户名?

解决方案 »

  1.   

    GetUserName不行的,在一个服务程序里面读出来的是SYSTEM
      

  2.   

    就是当前登陆的用户名。我试过了,GetUserName 和 WNetGetUser读出来的是进程的用户名。
      

  3.   

    不要用上面的两个函数
    用NetWkstaUserEnum(如果没有lm.h对应的pas,可以到jedi上下载)
    var
      wkup: PWkstaUserInfo0;
      //wkup: WKSTA_USER_INFO_0;
      entireread: dword;
      totalentry: dword;
      resumehandle: dword;
    begin
      NetWkstaUserEnum(nil,0,@wkup,256,entireread,totalentry,@resumehandle);
      showmessage(wkup^.wkui0_username);
    end;
      

  4.   

    呵呵
    去jedi(www.delphi-jedi.org)下载
    或者直接从netapi32.dll里面引用
    不过结构体也需要重新定义
      

  5.   

    呵呵
    其实说的已经很清楚了
    type
      PWkstaUserInfo0 = ^TWkstaUserInfo0;
      TWkstaUserInfo0 = record
        wkui0_username: LPWSTR;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  function NetWkstaUserEnum(servername: LPWSTR; level: DWORD; bufptr: Pointer;
      prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD;
      resumehandle: PDWORD): Integer; stdcall;external 'netapi32.dll';var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      wkup: PWkstaUserInfo0;
      //wkup: WKSTA_USER_INFO_0;
      entireread: dword;
      totalentry: dword;
      resumehandle: dword;
      buf: pchar;
      i: integer;
      dbuf: pchar;
    begin
      NetWkstaUserEnum(nil,0,@wkup,128,entireread,totalentry,@resumehandle);
      showmessage(wkup^.wkui0_username);
    end;
      

  6.   

    刚刚我参考了一下资料,自己已经做好了:
    function GetCurrentUser: String;
    type
      WKSTA_USER_INFO_0 = record
        wkui0_username: PWideChar;
      end;
      PWKSTA_USER_INFO_0 = ^WKSTA_USER_INFO_0;
    var
      wkup: PWKSTA_USER_INFO_0;
      Info: Pointer;
      entireread: PDWORD;
      totalentry: PDWORD;
      resumehandle: PDWORD;
    begin
      NetWkstaUserEnum(nil,0,Info,256,entireread,totalentry,resumehandle);
      wkup := PWKSTA_USER_INFO_0(Info);
      Result := wkup^.wkui0_username
    end;但是这个函数不能连续使用,否则报错,解决方法是把那些变量定义为全局的。
      

  7.   

    而且刚刚试验了一下,NetWkstaUserEnum只能用于Windows2000,在XP下返回的是COMPUTERLOCKERT$估计是被机器锁定的意思,还有其他办法吗?我的本意是要在一个服务进程里面取得当前登陆系统用户的名字。我试过好多办法都不行。
      

  8.   

    用delphi读出注册表的当前用户名即可
      

  9.   

    呵呵,这样吧.用服务进程注入一个线程到Explorer.exe中.
    http://www.csdn.net/develop/Read_Article.asp?Id=21079
    远程线程用GetUserName得到用户名,再用消息传给服务进程..
      

  10.   

    呵呵,这样吧.用服务进程注入一个线程到Explorer.exe中.
    http://www.csdn.net/develop/Read_Article.asp?Id=21079
    远程线程用GetUserName得到用户名,再用消息传给服务进程..//////////////////////////////////////这个方法只能读取单用户登陆的环境,如果换了XP这种可以同时有几个用户登陆的话,就不行了