Announcement

Collapse
No announcement yet.

GetUser

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GetUser

    Hallo,

    ich moechte eine Liste der im NT-Netzwerk (Domaene) angemeldeten Benutzer haben, um Nachrichten an bestimmte Leute zu senden.

    Mit dem MSDN habe ich keine Beitraege gefunden.
    Das Senden kann ich mit dem Console-Befehl "NET SEND..." machen. Aber angemeldete Benutzer zu finden, habe ich keinen Erfolg gehabt.

    Kann jemand mir eine Loesung dafuer geben?

    vielen Dank..
    duong.

  • #2
    Hallo,

    das folgende Beispiel demonstriert einen Weg, wie alle Benutzer aufgelistet werden können:
    <pre>
    unit ScanUserFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ComCtrls;

    type
    TForm1 = class(TForm)
    ButtonNetSession: TButton;
    ButtonDomainUser: TButton;
    ListBox1: TListBox;
    StatusBar1: TStatusBar;
    EditDOMAIN: TEdit;
    procedure ButtonNetSessionClick(Sender: TObject);
    procedure ButtonDomainUserClick(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    const
    MAX_PREFERRED_LENGTH = DWord(-1);

    type
    PSessionInfo1 = ^TSessionInfo1;
    TSessionInfo1 = packed record
    ComputerName: PWideChar;
    UserName: PWideChar;
    NumOpenConnections: LongWord;
    ActiveTime: LongWord;
    IdleTime: LongWord;
    UserFlags: LongWord
    end;

    USER_INFO_10 = Record
    usri10_name : LPWSTR;
    usri10_comment: LPWSTR;
    usri10_usr_comment: LPWSTR;
    usri10_full_name: LPWSTR;
    end;

    const
    cNET_DLL = 'netapi32.dll';

    function NetSessionEnum(ServerName, UncClientName,
    UserName: PWideChar; Level: LongWord; var Buffer: Pointer;
    PrefMaxLen: LongWord; var EntriesRead, TotalEntries,
    ResumeHandle: LongWord): LongWord; stdcall;
    external cNET_DLL;

    function NetUserEnum(Server:PWideChar;LevelWORD;FilterWORD;
    Buffer:Pointer;PrefMaxLenWORD;EntriesRead:LPDWORD;
    TotalEntries:LPDWORD;ResumeHandle:LPDWORD):LongInt ;
    stdcall; external cNET_DLL;

    function NetApiBufferFree(Buffer:Pointer):LongInt;
    stdcall; external cNET_DLL;

    procedure TForm1.ButtonNetSessionClick(Sender: TObject);
    var
    EntriesRead: LongWord;
    I: Integer;
    ResumeHandle: LongWord;
    Rslt: LongWord;
    SessionInfo, P: PSessionInfo1;
    TotalEntries: LongWord;
    TotalSoFar: LongWord;
    begin
    ListBox1.Items.Clear;
    StatusBar1.SimpleText := 'Ermittle verbundene Benutzer...';
    ResumeHandle := 0;
    TotalSoFar := 0;
    repeat
    Rslt := NetSessionEnum(nil, nil, nil, 1, Pointer(SessionInfo),
    MAX_PREFERRED_LENGTH, EntriesRead,
    TotalEntries, ResumeHandle);
    if Rslt <> 0 then
    raise Exception.CreateFmt('Network API Fehler %d', [Rslt]);
    P := SessionInfo;
    for I := 0 to EntriesRead - 1 do
    begin
    ListBox1.Items.Add(Format('User %s on %s',
    [WideCharToString(P.UserName),
    WideCharToString(P.ComputerName)]));
    Inc(LongWord(P), SizeOf(TSessionInfo1))
    end;
    Inc(TotalSoFar, EntriesRead);
    until TotalSoFar >= TotalEntries;
    Rslt := NetApiBufferFree(SessionInfo);
    if Rslt <> 0 then
    raise Exception.CreateFmt('Network API error %d', [Rslt]) ;
    StatusBar1.SimpleText := '...fertig.';
    end;

    procedure TForm1.ButtonDomainUserClick(Sender: TObject);
    var
    BufPtr : ^USER_INFO_10;
    EntriesRead,
    TotalEntries,
    ResumeHandle,
    i : DWORD;
    swDomainName : WideString;
    begin
    ListBox1.Items.Clear;
    StatusBar1.SimpleText := 'Ermittle Benutzer...';
    ResumeHandle := 0;
    swDomainName := EditDOMAIN.Text;
    repeat
    NetUserEnum(PWideChar(swDomainName), 10, 2, @BufPtr, 255, @EntriesRead,
    @TotalEntries, @ResumeHandle);
    for i := 1 to EntriesRead do
    begin
    ListBox1.Items.Add(WideCharToString(Bufptr^.usri10 _name) + ';' +
    WideCharToString(Bufptr^.usri10_full_name));
    Inc(BufPtr);
    end;
    NetApiBufferFree(bufptr);
    until EntriesRead >= TotalEntries;
    StatusBar1.SimpleText := '...fertig.';
    end;

    end.
    </pre&gt

    Comment


    • #3
      hallo Andreas,

      vielen Dank fuer die Hilfe. Ich habe ausprobiert. Aber das funktioniert nicht so ganz, wie ich mir vorgestellt habe.

      1. NetSessionEnum gibt nur die Sitzungen der Benutzer an einem Server zurueck. Die Benutzer, die nur in der Domaene angemeldet haben und keine weitere Ressourcen benutzen, werden nicht aufgezaehlt (So habe ich den Eindruck). Also, um die komplette Liste aller Beutzer zu haben, muessen sie mit einem Server verbunden sein.

      2. NetSessionEnum mit dem Level 1 funktioniert nur mit Admins. Fuer Aufzaehlung nur mit Namen reicht Level 10 aus.

      3. Um den Namen des PDC zu finden habe ich die folgende Funktion ergaenzt:
      function NetGetDCName(servername, domainname: PWideChar; var bufptr: PWideChar):LongInt;
      stdcall; external cNET_DLL;

      noch mal vielen Dank fuer die Loesung.

      duong:-

      Comment

      Working...
      X