...Informationen über die angemeldeten Benutzer einer Workstation auflisten?
Autor: Thomas Stutz
type
  THostInfo = record
    username: PWideChar;
    logon_domain: PWideChar;
    other_domains: PWideChar;
    logon_server: PWideChar;
  end;
  WKSTA_USER_INFO_0 = packed record
    wkui0_username: PWideChar;
  end;
  PWKSTA_USER_INFO_0 = ^WKSTA_USER_INFO_0;
implementation
{$R *.dfm}
function NetWkstaUserEnum(servername: PWideChar;
  // Pointer to a string that specifies the DNS or NetBIOS name of the
  // remote server on which the function is to execute.
  // If this parameter is nil, the local computer is used.
  level: DWORD;
  // Level = 0 : Return the names of users currently logged on to the workstation.
  var bufptr: Pointer;   // Pointer to the buffer that receives the data
  prefmaxlen: DWORD;
  // Specifies the preferred maximum length of returned data, in bytes.
  var entriesread: PDWord;
  // Pointer to a value that receives the count of elements actually enumerated.
  var totalentries: PDWord;  // total number of entries
  var resumehandle: PDWord)
  // contains a resume handle which is used to continue an existing search
  : Longint;
  stdcall; external 'netapi32.dll' Name 'NetWkstaUserEnum';
function EnumNetUsers(HostName: WideString {; Users: TStrings}): THostInfo;
const
  STR_ERROR_ACCESS_DENIED = 'The user does not have access to the requested information.';
  STR_ERROR_MORE_DATA = 'Specify a large enough buffer to receive all entries.';
  STR_ERROR_INVALID_LEVEL = 'The level parameter is invalid.';
var
  Info: Pointer;
  ElTotal: PDWord;
  ElCount: PDWord;
  Resume: PDWord;
  Error: Longint;
  // UI : PWKSTA_USER_INFO_0;
  // i : Integer;
begin
  Resume := 0;
  NetWkstaUserEnum(PWideChar(HostName),
    1,
    Info,
    0,
    ElCount,
    ElTotal,
    Resume);
  Error := NetWkstaUserEnum(PWideChar(HostName),
    1,
    Info,
    256 * Integer(ElTotal),
    ElCount,
    ElTotal,
    Resume);
  case Error of
    ERROR_ACCESS_DENIED: Result.UserName := STR_ERROR_ACCESS_DENIED;
    ERROR_MORE_DATA: Result.UserName     := STR_ERROR_MORE_DATA;
    ERROR_INVALID_LEVEL: Result.UserName := STR_ERROR_INVALID_LEVEL
      else
        if Info <> nil then
        begin
          Result := THostInfo(info^);
    {
    To retrieve all users:
    UI := PWKSTA_USER_INFO_0(Info);
    for i := 1 to DWord(ElCount) do
    begin
      Users.Add(UI^.wkui0_username);
      inc(UI);
    end;
    }
        end
        else
          begin
            Result.UserName      := 'N/A';
            Result.logon_domain  := 'N/A';
            Result.other_domains := 'N/A';
            Result.logon_server  := 'N/A';
          end;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  HostInfo: THostInfo;
begin
  // Specify target machine as argument (with or without preceding \\)
  HostInfo := EnumNetUsers('WORKSTATION');
  with HostInfo do
  begin
    Memo1.Lines.Add(username + #13#10 +
      logon_domain + #13#10 +
      other_domains + #13#10 +
      logon_server);
  end;
end;
printed from
  www.swissdelphicenter.ch
  developers knowledge base