Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение OS УДАЛЕННОГО компьютера [D6, WinXP]


Страницы:   1 2 3

Maxim ©   (2004-08-15 11:54:00) 

Господа, подскажите пожалуйста каким образом с помощью стандартных средств дельфи возможно определить OS какого либо компьютера в локальной сети. Хотя бы, если на мгновение представить что есть только WinOS, а nix не в счет :)


Rouse_   (2004-08-18 10:03:00) [21]

Аааааа, вот как тут все хитро :)))))

The NetApiBufferFree function frees the memory that NetApiBufferAllocate allocates. Use this function to free the memory that other LAN Manager functions return.

Т.е. тебе нужно прочитать весь хелт по LAN Manager functions чтобы дойти до этого момента, где сказано что освобождать всетаки нужно. Браво составителям данной справки :) (Блин я тупею :)


Rouse_   (2004-08-18 09:58:00) [22]

Кстати действительно в справке по WinSDK дельфевой об этом ничего не сказано, поэтому мой совет, все что касаемо АПИ лучше смотреть в первоисточнике, тобишь MSDN. По крайней мере это избавит тебя от многих несуразностей... :)


Rouse_   (2004-08-18 09:49:00) [23]

Вот тебе исправленный вариант того что ты делал:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

 PWkstaInfo100 = ^TWkstaInfo100;
 _WKSTA_INFO_100 = record
   wki100_platform_id: DWORD;
   wki100_computername: LPWSTR;
   wki100_langroup: LPWSTR;
   wki100_ver_major: DWORD;
   wki100_ver_minor: DWORD;
 end;
 {$EXTERNALSYM _WKSTA_INFO_100}
 TWkstaInfo100 = _WKSTA_INFO_100;

 function NetWkstaGetInfo(servername: LPWSTR; level: DWORD;
   var bufptr: PWkstaInfo100): DWORD; stdcall; external 'NETAPI32.DLL';

 function NetApiBufferFree(Buffer: Pointer): DWORD;
   stdcall; external 'NETAPI32.DLL';

var
 Form1: TForm1;

implementation

{$R *.dfm}

//Ïîëó÷åíèå âåðñèè ÎÑ ïî èìåíè êîìïà
function GetOSVersions(HostName: WideString): TWkstaInfo100;
var Info: PWkstaInfo100;
begin
 NetWkstaGetInfo(PWideChar(HostName), 100, Info);
 try
   if Info nil then
     Result := info^
   else
   begin
     Result.wki100_ver_major :=DWord(0);
     Result.wki100_ver_minor :=DWord(0);
     Result.wki100_platform_id :=DWord(0);
   end;
 finally
   NetApiBufferFree(Info);
 end;
end;

//Äåøèôðîâêà âåðñèè ÎÑ
function DecodeVersions(InfoOS: TWkstaInfo100): String;
begin
  if InfoOS.wki100_ver_major=0 then Result:='';
  case InfoOS.wki100_ver_major of
    3: Result:='Windows NT';
    4: case InfoOS.wki100_ver_minor of
        0: if InfoOS.wki100_platform_id = VER_PLATFORM_WIN32_NT then Result:='Windows NT'
           else Result:='Windows NT';
        10: Result:='Windows 9X';
        90: Result:='Windows ME';
       end;
    5: case InfoOS.wki100_ver_minor of
        0: Result:='Windows 2000';
        1: Result:='Windows XP';
       end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := DecodeVersions(GetOSVersions('\\dimson'));
end;

end.


Rouse_   (2004-08-18 09:22:00) [24]

А валится скорее из-за неправильного объявления функций...


Rouse_   (2004-08-18 09:20:00) [25]

Какойто не правильный у тебя хелп :)
Вот у меня хелп правильный: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netwkstagetinfo.asp

bufptr
[out] Pointer to the buffer that receives the data. The format of this data depends on the value of the level parameter. This buffer is allocated by the system and must be freed using the NetApiBufferFree function. For more information, see Network Management Function Buffers and Network Management Function Buffer Lengths.


Дмитрий Ботвин   (2004-08-18 07:44:00) [26]

Rouse_ если посмотришь в хелп, то увидишь, что для NetWkstaGetInfo вызывать NetApiBufferFree не надо :-)))
В 7-м дельфине если вызвать NetApiBufferFree будет вываливаться
ошибка. Я с этим уже сталкивался, поэтому и не написал её....


Rouse_   (2004-08-17 21:02:00) [27]

Хех, хотя с названием "хороший пример" я явно переборщил, налицо явный Memory Leak
Не вызван NetApiBufferFree для Info

:)


Rouse_   (2004-08-17 20:57:00) [28]

> [21] Дмитрий Ботвин   (17.08.04 15:15)
Тоже хороший пример, их можно написать несколько вариантов, так как MS видимо перестраховалась и выдала на бочку несколько вариантов функций которые могут вернуть в том числе и эту информацию (я уж не говорю о том количестве структур которые они понаплодили :)


Дмитрий Ботвин   (2004-08-17 15:15:00) [29]

Я писал как-то, вот примерно так:

type
 //Для получения версии ОС
 TOSInfo = record
    wki100_platform_id: DWord;
    wki100_computername: PWideChar;
    wki100_langroup: PWideChar;
    wki100_ver_major: DWord;
    wki100_ver_minor: DWord;
 end;

//Получение версии ОС по имени компа
function GetOSVersions(HostName: WideString): TOSInfo;
 var Info: Pointer;
 begin
   Info:=nil;
   NetWkstaGetInfo(PWideChar(HostName),100,Info);
   if Info<>nil then Result:=TOSInfo(info^)
   else
      begin
         Result.wki100_ver_major:=DWord(0);
         Result.wki100_ver_minor:=DWord(0);
         Result.wki100_platform_id:=DWord(0);
      end;
 end;

//Дешифровка версии ОС
function DecodeVersions(InfoOS: TOSInfo): String;
 begin
   if InfoOS.wki100_ver_major=0 then Result:='';
   case InfoOS.wki100_ver_major of
     3: Result:='Windows NT';
     4: case InfoOS.wki100_ver_minor of
         0: if InfoOS.wki100_platform_id = VER_PLATFORM_WIN32_NT then Result:='Windows NT'
            else Result:='Windows NT';
         10: Result:='Windows 9X';
         90: Result:='Windows ME';
        end;
     5: case InfoOS.wki100_ver_minor of
         0: Result:='Windows 2000';
         1: Result:='Windows XP';
        end;
   end;
 end;

Пример вызова: DecodeVersions(GetOSVersions(Computer.Text));


Rouse_   (2004-08-17 14:02:00) [30]

> [19] Мастер ©   (17.08.04 13:24)
А если постановку вопроса прочитать?

> определить OS какого либо компьютера в локальной сети. Хотя
> бы, если на мгновение представить что есть только WinOS,
> а nix не в счет:)


Тем более www.delphimaster.ru это виртуальный сервер...


Мастер   (2004-08-17 13:24:00) [31]

>Rouse_ ©   (17.08.04 09:16) [18]
Проверил LanSpy хост www.delphimaster.ru. ОС не определяется.

Без использования "левых" технологий ни тип, ни версия системы не определяется, если нет спец. сервисов и легальных программ, которые могут вернуть описание.


Rouse_   (2004-08-17 09:16:00) [32]

> [17] Мастер ©   (17.08.04 00:04)
Например
http://www.lantricks.com/lanspy/index.php

Кстати используется вышеприведенная функция...


Мастер   (2004-08-17 00:04:00) [33]

>Maxim   (15.08.04 22:41) [6]

...Не важно же это...
Да нет, важно это.

>PL   (16.08.04 10:43) [12]
куча софта по работе с сетью, причем легального и профессионального позволяет посмотреть, что за ОС установлена на удаленном компе, сколько она работает и т.д.

Например?


Rouse_   (2004-08-16 20:38:00) [34]

Блин ну и поразвели тут флейма :)

NetServerGetInfo +
typedef struct _SERVER_INFO_102 {
   DWORD     sv102_platform_id;
   LPTSTR    sv102_name;
   DWORD     sv102_version_major;
   DWORD     sv102_version_minor;
   DWORD     sv102_type;
   LPTSTR    sv102_comment;
   DWORD     sv102_users;
   LONG      sv102_disc;
   BOOL      sv102_hidden;
   DWORD     sv102_announce;
   DWORD     sv102_anndelta;
   LPTSTR    sv102_userpath;
} SERVER_INFO_102, *PSERVER_INFO_102, *LPSERVER_INFO_102;


Polevi   (2004-08-16 20:09:00) [35]

черт, лишний раз убеждаюсь что все уже написано до меня


VMcL   (2004-08-16 19:02:00) [36]

>> Polevi ©  (16.08.04 18:39) [13]

Есть. Называется TTaxPolice.


Polevi   (2004-08-16 18:39:00) [37]

а где и за какую цену куплена OS на удаленном компьютере как можно узнать ?
подскажите компонент plz


PL   (2004-08-16 10:43:00) [38]

Вы уж извините, но причем тут хакерские технологии...

куча софта по работе с сетью, причем легального и профессионального позволяет посмотреть, что за ОС установлена на удаленном компе, сколько она работает и т.д.

Я вот честно признаюсь, что не знаю, как это сделать, но тоже очень хотел бы узнать


simpson   (2004-08-16 10:14:00) [39]

NetServerGetInfo не подойдет?


False_Delirium   (2004-08-16 00:10:00) [40]

Maxim   на void.ru описаны методы.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо