![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение OS УДАЛЕННОГО компьютера [D6, WinXP]
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 описаны методы.