...list information about all users currently logged on to a workstation?
|
Autor:
Thomas Stutz |
[ Print tip
] | | |
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;
|