Grupa robocza na podstawie IP

0

W jaki sposób odczytać grupe roboczą na podstawie IP
(192.168.0.10 => OSIEDLE).

Po przeszukaniu tego forum znalazłem procedurke o którą mi chodziło, przynajmniej tak mi się wydawało na początku.
Niestety odczytuje ona grupe roboczą dla systemów NT a nie dla 9x (przynajmniej dla 98 pokazuje "???").

Mam nadzieję że ktoś będzie w stanie mi pomóc w jej przerobieniu tak aby odczytywała grupe roboczą dla wszystkich systemów,
lub ktoś zaproponuje inne rozwązanie.

 THostInfo = record
    username: PWideChar;
    logon_domain: PWideChar;
    oth_domains: PWideChar;
    logon_server: PWideChar; 


function
NetWkstaUserEnum(servername: PWideChar;
                               level : DWord;
                         var bufptr: Pointer;
                         prefmaxlen: DWord;
                  var entriesread: PDWord;
                var totalentries: PDWord;
                var resumehandle: PDWord ): LongInt ;
                         stdcall; external 'netapi32.dll' name 'NetWkstaUserEnum';


function GetNetUser(HostName: WideString): THostInfo;
var
Info: Pointer;
ElTotal: PDWord;
ElCount: PDWord;
Resume: PDWord;
Error: LongInt;
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:= 'ERROR - ACCESS DENIED';
      ERROR_MORE_DATA: Result.UserName:= 'ERROR - MORE DATA';
      ERROR_INVALID_LEVEL: Result.UserName:= 'ERROR - INVALID LEVEL';
      else if Info <> nil
             then Result:=THostInfo(info^)
             else begin
                     Result.username:= '???';
                     Result.logon_domain:= '???';
                     Result.oth_domains:= '???';
                     Result.logon_server:= '???';
                     end;{if}
      end;{case}
end; {function}

procedure TForm1.Button1Click(Sender: TObject);
begin
HostInfo := GetNetUser('192.168.0.10'); //nie dziala z gdy sie wpisze host musi byc ip!
 with HostInfo do
   begin

label1.caption:=HostInfo.logon_domain;

      end;
end;

</delphi>
0

'NETAPI32.DLL' jest dla systemów NT
'RADMIN32.DLL' jest dla win95,98,ME

Na torry.net jest cacko Autor nieznany super przykładzik jak i co:

function GetDomainName: AnsiString; 
type 
 WKSTA_INFO_100 = record 
   wki100_platform_id: Integer; 
   wki100_computername: PWideChar; 
   wki100_langroup: PWideChar; 
   wki100_ver_major: Integer; 
   wki100_ver_minor: Integer; 
 end; 

 WKSTA_USER_INFO_1 = record 
   wkui1_username: PChar; 
   wkui1_logon_domain: PChar; 
   wkui1_logon_server: PChar; 
   wkui1_oth_domains: PChar; 
 end; 
type 
 //Win9X ANSI prototypes from RADMIN32.DLL and RLOCAL32.DLL 

 TWin95_NetUserGetInfo = function(ServerName, UserName: PChar; Level: DWORD; var 
   BfrPtr: Pointer): Integer; 
 stdcall; 
 TWin95_NetApiBufferFree = function(BufPtr: Pointer): Integer; 
 stdcall; 
 TWin95_NetWkstaUserGetInfo = function(Reserved: PChar; Level: Integer; var 
   BufPtr: Pointer): Integer; 
 stdcall; 

 //WinNT UNICODE equivalents from NETAPI32.DLL 

 TWinNT_NetWkstaGetInfo = function(ServerName: PWideChar; level: Integer; var 
   BufPtr: Pointer): Integer; 
 stdcall; 
 TWinNT_NetApiBufferFree = function(BufPtr: Pointer): Integer; 
 stdcall; 

 function IsWinNT: Boolean; 
 var 
   VersionInfo: TOSVersionInfo; 
 begin 
   VersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); 
   Result := GetVersionEx(VersionInfo); 
   if Result then 
     Result := VersionInfo.dwPlatformID = VER_PLATFORM_WIN32_NT; 
 end; 
var 

 Win95_NetUserGetInfo: TWin95_NetUserGetInfo; 
 Win95_NetWkstaUserGetInfo: TWin95_NetWkstaUserGetInfo; 
 Win95_NetApiBufferFree: TWin95_NetApiBufferFree; 

 WinNT_NetWkstaGetInfo: TWinNT_NetWkstaGetInfo; 
 WinNT_NetApiBufferFree: TWinNT_NetApiBufferFree; 

 WSNT: ^WKSTA_INFO_100; 
 WS95: ^WKSTA_USER_INFO_1; 

 EC: DWORD; 
 hNETAPI: THandle; 
begin 
 try 

   Result := ''; 

   if IsWinNT then 
   begin 
     hNETAPI := LoadLibrary('NETAPI32.DLL'); 
     if hNETAPI <> 0 then 
     begin @WinNT_NetWkstaGetInfo := GetProcAddress(hNETAPI, 'NetWkstaGetInfo'); 
         @WinNT_NetApiBufferFree  := GetProcAddress(hNETAPI, 'NetApiBufferFree'); 

       EC := WinNT_NetWkstaGetInfo(nil, 100, Pointer(WSNT)); 
       if EC = 0 then 
       begin 
         Result := WideCharToString(WSNT^.wki100_langroup); 
         WinNT_NetApiBufferFree(Pointer(WSNT)); 
       end; 
     end; 
   end 
   else 
   begin 
     hNETAPI := LoadLibrary('RADMIN32.DLL'); 
     if hNETAPI <> 0 then 
     begin @Win95_NetApiBufferFree := GetProcAddress(hNETAPI, 'NetApiBufferFree'); 
         @Win95_NetUserGetInfo := GetProcAddress(hNETAPI, 'NetUserGetInfoA'); 

       EC := Win95_NetWkstaUserGetInfo(nil, 1, Pointer(WS95)); 
       if EC = 0 then 
       begin 
         Result := WS95^.wkui1_logon_domain; 
         Win95_NetApiBufferFree(Pointer(WS95)); 
       end; 
     end; 
   end; 

 finally 
   if hNETAPI <> 0 then 
     FreeLibrary(hNETAPI); 
 end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
 ShowMessage(GetDomainName); 
end; 


1 użytkowników online, w tym zalogowanych: 0, gości: 1