mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-03 22:03:43 +02:00
87 lines
2.6 KiB
ObjectPascal
87 lines
2.6 KiB
ObjectPascal
{
|
|
This example program shows how to remotely connect to another machine.
|
|
The machine name is given as UNC name as first argument (e.g.
|
|
"\\SomeComputer") and the username as second argument. The password will be
|
|
queried on the command line by Windows. If the connection is successful the
|
|
keys of HKEY_USERS of the remote machine will be enumerated.
|
|
|
|
Tested on a Windows 7 machine connecting to another Windows 7 machine.
|
|
|
|
Note: The remote registry service must run on the destination machine.
|
|
}
|
|
|
|
program remotereg;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$apptype console}
|
|
|
|
uses
|
|
Classes, sysutils, registry, JwaWinNetWk, JwaWinType, JwaWinError;
|
|
|
|
var
|
|
reg: TRegistry;
|
|
machine, username, s:AnsiString;
|
|
res: NETRESOURCEA;
|
|
err: DWORD;
|
|
sl: TStringList;
|
|
begin
|
|
if ParamCount > 0 then
|
|
machine := ParamStr(1)
|
|
else
|
|
machine := '';
|
|
if ParamCount > 1 then
|
|
username := ParamStr(2)
|
|
else
|
|
username := '';
|
|
|
|
{ if we have a username given then we need to establish a connection first;
|
|
if no username is given then either the current user is the correct one
|
|
or a connection to e.g. share was established already }
|
|
if (machine <> '') and (username <> '') then begin
|
|
Writeln('Connecting to ', machine, ' as ', username);
|
|
FillChar(res, SizeOf(res), 0);
|
|
res.dwType := RESOURCETYPE_ANY;
|
|
S:=Format('%s\IPC$', [machine]);
|
|
res.lpRemoteName := PAnsiChar(S);
|
|
err := WNetAddConnection2A(res, Nil, PAnsiChar(username),
|
|
CONNECT_TEMPORARY or CONNECT_INTERACTIVE or CONNECT_COMMANDLINE);
|
|
{ ERROR_SESSION_CREDENTIAL_CONFLICT means that we already connected to the
|
|
host and the connection is still available }
|
|
if (err <> NO_ERROR) and (err <> ERROR_SESSION_CREDENTIAL_CONFLICT) then begin
|
|
Writeln('Error connecting to remote machine ''', machine, ''': ',
|
|
SysErrorMessage(err), ' (', err, ')');
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
{ for this test we want only the right to enumerate subkeys }
|
|
reg := TRegistry.Create(KEY_ENUMERATE_SUB_KEYS);
|
|
try
|
|
{ use HKEY_USERS, because the rights of Administrator users on Windows Vista
|
|
and newer are sufficient for enumerating this }
|
|
reg.RootKey := HKEY_USERS;
|
|
if not reg.RegistryConnect(machine) then begin
|
|
Writeln('Error connecting to remote registry');
|
|
Exit;
|
|
end;
|
|
{ we need to open the key nevertheless }
|
|
reg.OpenKeyReadOnly('\');
|
|
{ now enumerate the subkeys }
|
|
sl := TStringList.Create;
|
|
try
|
|
reg.GetKeyNames(sl);
|
|
Writeln(sl.Count, ' keys found');
|
|
for s in sl do
|
|
Writeln(#9, s);
|
|
finally
|
|
sl.Free;
|
|
end;
|
|
reg.CloseKey;
|
|
finally
|
|
reg.Free;
|
|
end;
|
|
Writeln('Done');
|
|
Readln;
|
|
end.
|
|
|