Теперь, используя Windows API, функция TRegistry.RegistryConnect
внутренне вызывает функцию RegConnectRegistry
windows, документация гласит:
Если у текущего пользователя нет
правильный доступ к удаленному компьютеру,
вызов RegConnectRegistry не выполняется.
Чтобы подключиться к удаленному реестру, позвоните
LogonUser с
LOGON32_LOGON_NEW_CREDENTIALS и
ImpersonateLoggedOnUser перед вызовом
RegConnectRegistry.
Windows 2000: One possible workaround is to establish a session
на административную долю, такую как
IPC $ с использованием другого набора
полномочия. Чтобы указать учетные данные
кроме тех, что у текущего пользователя,
используйте функцию WNetAddConnection2 для
подключиться к общему ресурсу Когда у тебя есть
закончил доступ к реестру,
отмени соединение
Windows XP Home Edition: You cannot use this function to connect to
удаленный компьютер под управлением Windows XP
Домашняя версия. Эта функция работает
с именем локального компьютера
даже если он работает под управлением Windows XP Home
Издание, потому что это обходит
Уровень аутентификации.
проверить следующие образцы
с использованием функций реестра windows api
uses
Windows,
Registry,
SysUtils;
procedure AccessRemoteRegistry(const lpMachineName, lpszUsername , lpszPassword: PChar);
const
LOGON32_LOGON_NEW_CREDENTIALS = 9;
REG_OPTION_OPEN_LINK = $00000008;
var
netResource : TNetResource;
dwFlags : DWORD;
dwRetVal : DWORD;
phToken : THandle;
phkResult : HKEY;
phkResult2 : HKEY;
lpType : DWORD;
lpData : PByte;
lpcbData : DWORD;
begin
ZeroMemory(@netResource, SizeOf(netResource));
netResource.dwType := RESOURCETYPE_ANY;
netResource.lpLocalName := nil;
netResource.lpRemoteName:= lpMachineName;
netResource.lpProvider := nil;
dwFlags := CONNECT_UPDATE_PROFILE;
dwRetVal := WNetAddConnection2(netResource, lpszPassword, lpszUsername, dwFlags);
if dwRetVal=NO_ERROR then
begin
try
Writeln('Connected');
if LogonUser(lpszUsername, nil, lpszPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50,phToken) then
begin
try
if ImpersonateLoggedOnUser(phToken) then
begin
try
dwRetVal:=RegConnectRegistry(lpMachineName,HKEY_LOCAL_MACHINE,phkResult);
if dwRetVal = ERROR_SUCCESS then
begin
dwRetVal:=RegOpenKeyEx(phkResult,PChar('SOFTWARE\Borland\Delphi\5.0'), REG_OPTION_OPEN_LINK, KEY_QUERY_VALUE, phkResult2);
if dwRetVal = ERROR_SUCCESS then
begin
try
lpType:=REG_SZ;
//get the size of the buffer
dwRetVal:=RegQueryValueEx(phkResult2, PChar('App'), nil, @lpType, nil, @lpcbData);
if dwRetVal = ERROR_SUCCESS then
begin
GetMem(lpData,lpcbData);
try
dwRetVal:=RegQueryValueEx(phkResult2, 'App', nil, @lpType, lpData, @lpcbData);
if dwRetVal = ERROR_SUCCESS then
WriteLn(PChar(lpData))
else
Writeln(Format('RegQueryValueEx error %d',[dwRetVal]));
finally
FreeMem(lpData);
end;
end
else
Writeln(Format('RegQueryValueEx error %d',[dwRetVal]));
finally
RegCloseKey(phkResult2);
end;
end
else
Writeln(Format('RegOpenKeyEx error %d',[dwRetVal]));
end
else
Writeln(Format('RegConnectRegistry error %d',[dwRetVal]));
finally
RevertToSelf;
end;
end
else
RaiseLastOSError;
finally
CloseHandle(phToken);
end;
end
else
RaiseLastOSError;
finally
dwRetVal:=WNetCancelConnection2(netResource.lpRemoteName, CONNECT_UPDATE_PROFILE, false);
if dwRetVal<>NO_ERROR then
Writeln(Format('WNetCancelConnection2 error %d',[dwRetVal]));
end;
end
else
Writeln(Format('WNetAddConnection2 Connection error %d',[dwRetVal]));
end;
используйте таким образом
AccessRemoteRegistry('\\192.168.52.128','NormalUser','password');
с использованием класса TRegistry delphi
procedure AccessRemoteRegistry2(const lpMachineName, lpszUsername , lpszPassword: PChar);
const
LOGON32_LOGON_NEW_CREDENTIALS = 9;
REG_OPTION_OPEN_LINK = $00000008;
var
netResource : TNetResource;
dwFlags : DWORD;
dwRetVal : DWORD;
phToken : THandle;
Reg : TRegistry;
begin
ZeroMemory(@netResource, SizeOf(netResource));
netResource.dwType := RESOURCETYPE_ANY;
netResource.lpLocalName := nil;
netResource.lpRemoteName:= lpMachineName;
netResource.lpProvider := nil;
dwFlags := CONNECT_UPDATE_PROFILE;
dwRetVal := WNetAddConnection2(netResource, lpszPassword, lpszUsername, dwFlags);
if dwRetVal=NO_ERROR then
begin
try
Writeln('Connected');
if LogonUser(lpszUsername, nil, lpszPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50,phToken) then
begin
try
if ImpersonateLoggedOnUser(phToken) then
begin
try
reg:=TRegistry.Create;
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.RegistryConnect(lpMachineName) then
if reg.OpenKey('SOFTWARE\Borland\Delphi\5.0',False) then
WriteLn(reg.ReadString('App'));
finally
reg.CloseKey;
reg.Free;
end;
finally
RevertToSelf;
end;
end
else
RaiseLastOSError;
finally
CloseHandle(phToken);
end;
end
else
RaiseLastOSError;
finally
dwRetVal:=WNetCancelConnection2(netResource.lpRemoteName, CONNECT_UPDATE_PROFILE, false);
if dwRetVal<>NO_ERROR then
Writeln(Format('WNetCancelConnection2 error %d',[dwRetVal]));
end;
end
else
Writeln(Format('WNetAddConnection2 Connection error %d',[dwRetVal]));
end;
используйте таким образом
AccessRemoteRegistry2('\\192.168.52.128','NormalUser','password');