Ich versuche mittels der
API Funktion
NetServerGetInfo das Betriebssystem des remote Rechners zu ermitteln. Implementiert habe ich es so:
Delphi-Quellcode:
type
TSERVER_INFO_101 = packed record
sv101_platform_ID: DWORD;
sv101_name: PWChar;
sv101_version_major: DWORD;
sv101_version_minor: DWORD;
sv101_type: DWORD; // not yet defined here!
sv101_comment: PWChar;
end;
PSERVER_INFO_101 = ^TSERVER_INFO_101;
(Die Konstanten für sv101_type habe ich noch nicht definiert, da ich sie erstmal nicht brauche.)
Delphi-Quellcode:
function NetServerGetInfo(const servername: PWChar; level: DWORD; bufptr:
Pointer): NET_API_STATUS; stdcall;
// ...
function NetServerGetInfo; external netapi32lib name 'NetServerGetInfo';
Aufruf:
Delphi-Quellcode:
function GetRemoteOS(const Computer: WideString; var Version: string): DWORD;
var
res: DWORD;
s: string;
si: Pointer;
Major: DWORD;
Minor: DWORD;
resourcestring
rsUnknown = 'Betriebsystem unbekannt';
begin
res := 0;
si := nil;
s := '';
res := NetServerGetInfo(PWideChar(Computer), 101, si);
if res = NERR_Success then
begin
Major := PSERVER_INFO_101(si)^.sv101_version_major;
Minor := PSERVER_INFO_101(si)^.sv101_version_minor;
if Major = 4 then
s := 'Windows 95/98/ME'
else if (Major = 4) and (Minor = 0) then
s := 'Windows NT 4.0'
else if (Major = 5) and (Minor = 0) then
s := 'Windows 2000'
else if (Major = 5) and (Minor = 1) then
s := 'Windows XP'
else if (Major = 5) and (Minor = 2) then
s := 'Windows 2003 Server Family'
else
s := rsUnknown;
Version := s;
end;
NetApiBufferFree(si);
result := res;
end;
Das Problem: Ich bekomme eine
Access Violation nach dem Aufruf der Funktion. NetServerGetInfo gibt übrigens 1241672 zurück.