![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по статье "Мониторинг сетей в Delphi"
MeMO © (2004-08-06 00:46:00)Hi all.
У меня вопрос по выше указанной статье.
Там в примере расписано определение шар для локального компа.
Хочется узнать как это все делается для удаленного.
Я пытался написать, только работает через раз :)
Заранее спасибо.
MeMO (2004-09-06 11:03:00) [1]Да имя я уже получается вытянуть из структуры. Просто в примере [5] в конце делается NetApiBufferFree(Info), а я не досмотрел и пытался обратится к Info. Только вот теперь NetShareAdd возвращает постоянно 123 ошибку.
TmpDir:=TShareInfo1Array(@Info^)[lbxShares.ItemIndex].shi1_netname;
TmpName:=InputBox('Share name','Enter name','');
if TmpName='' then Exit;
if TmpDir='' then Exit;
FLibHandle:=LoadLibrary('NETAPI32.DLL');
if FLibHandle=0 then Exit;
@NetShareAdd:=GetProcAddress(FLibHandle,'NetShareAdd');
if not Assigned(NetShareAdd) then begin
MessageDlg('Error in call to Loadlibrary()'+#10+#13+'Error '+IntToStr(Error),mtError,[mbok],0);
FreeLibrary(FLibHandle);
Exit;
end;
ShareNTItem.shi2_netname:=StringToOleStr(TmpName);
ShareNTItem.shi2_type := STYPE_DISKTREE;
ShareNTItem.shi2_remark := '';
ShareNTItem.shi2_permissions := ACCESS_ALL; ShareNTItem.shi2_max_uses := DWORD(-1); ShareNTItem.shi2_current_uses := 0;
ShareNTItem.shi2_path:=StringToOleStr(TmpDir);
ShareNTItem.shi2_passwd :=nil;
Error:=NetShareAdd(Host,2,@ShareNTItem,nil);
if Error<>0 then
MessageDlg('Error in call to NetShareAdd()'+#10+#13+'Error '+Inttostr(Error),mtError,[mbOK],0);
FreeLibrary(FLibHandle);
CompList.OnDblClick(self);
Последний параметр NetShareAdd указывает на ошибку в 8 поле стуктуры. Подскажите может я опять гдето протупил. Спасибо.
Rouse_ (2004-09-06 08:58:00) [2]А при чем тут статья? В ней не будет этот вопрос рассмотрен...
ЗЫ: Если чесно то я просто не понял какое именно имя ты не можешь найти? Которое в shi1_netname подставляется? Если да, то его туда пожно любое писать, хоть рандомом последовательсость букв сгенерировать...
MeMO (2004-09-05 22:22:00) [3]Помоему это форум по прогаммированию?! Ладно буду ждать обещанной Rouse_ © статью.
Rouse_ (2004-09-05 18:36:00) [4]> [25] Дмитрий Ботвин (05.09.04 15:10)
Класс, даже не знал что такая утилита есть :)))
Дмитрий Ботвин (2004-09-05 15:10:00) [5]Если тебе ваще всё лень самому писать тогда запускай комманду:
shrpubw.exe /s <имя компа>, например shrpubw.exe /s server
И за тебя виндус всё сделает :-))))
Rouse_ (2004-09-05 13:37:00) [6]Ну тогда имя ресурса (под которым он будет виден в сети) бери от имени папки к которой будет открыт доступ
MeMO (2004-09-05 12:12:00) [7]to Rouse_ ©
я еще из статьи понял как это делается (за неё отдельное спасибо), только в предложенном примере ([18]) данные полученные NetShareEnum не используются, а вписываются в ручную.
Rouse_ (2004-09-05 11:48:00) [8]Ну так а в чем проблема?
NetShareEnum тебе вернула именя ресурсов некоего сетевого компьютера имя которого тебе заранее известно, полное имя строишь так \\имя компьютера\имя ресурса
Или про разные вещи говорим?
MeMO (2004-09-04 16:57:00) [9]Rouse_ © (03.09.04 12:22) [20]
не спорю пример правильный, но там ведь нахождение шар. А вот "выколупывать" мне имя надо для NetShareAdd. Так вот в Дмитрий Ботвин (01.09.04 10:25) [18] это все пальцами делать надо т.е. вводить сетевое имя и т.д.
Rouse_ (2004-09-03 12:22:00) [10]> [19] MeMO (03.09.04 11:42)
ну так пример же даден как правильно "выколупывать" ;)
см. > [5] Rouse_ © (30.08.04 09:23)
MeMO (2004-09-03 11:42:00) [11]Спасибо конечно но это не совсем то что мне надо. Я пытаюсь выкалупать имя шары из той структуры которую заполнила NetShareEnum.
Дмитрий Ботвин (2004-09-01 10:25:00) [12]Вот тебе работающий код:
procedure TForm8.btnAddSharesClick(Sender: TObject);
type
TShareInfo2 = record
shi2_netname : PWChar;
shi2_type: DWORD;
shi2_remark :PWChar;
shi2_permissions: DWORD;
shi2_max_uses : DWORD;
shi2_current_uses : DWORD;
shi2_path : PWChar;
shi2_passwd : PWChar;
end;
const
STYPE_DISKTREE = 0;
ACCESS_ALL = 258;
SHI50F_FULL = 258;
var
ShareNT : TShareInfo2;
TmpDir, TmpName, Path: String;
HostName, TmpDirNT, TmpNameNT: PWChar;
begin
TmpDir := InputBox('Локальный путь к ресурсу','Введите путь в формате: <Диск>:\<Путь>',''); //Определяем путь к будующему ресурсу
if TmpDir = '' then Exit;
TmpName := InputBox('Сетевое имя','Введите имя',''); //Определяем имя под которым он будет виден в сети
if TmpName = '' then Exit;
//преобразуем локальный путь к сетевому
Path:=TmpDir;
Path[2]:='$';
Path:='\\'+Trim(Form1.CompName.Text)+'\'+Path;
//Проверяем есть ли такая папка если нет, то создаём её
if not(DirectoryExists(Path)) then
begin
MkDir(Path);
if IOResult<>0 then
begin
Application.MessageBox('Не могу создать указанный ресурс!','Создание ресурса',
MB_OK+MB_ICONSTOP);
exit;
end;
end;
HostName := StringToOleStr('\\'+Trim(Form1.CompName.Text));
TmpNameNT := StringToOleStr(TmpName);
TmpDirNT := StringToOleStr(TmpDir);
//Заполняем структуру
ShareNT.shi2_netname := TmpNameNT; //Имя
ShareNT.shi2_type := STYPE_DISKTREE; //Тип ресурса
ShareNT.shi2_remark := ''; //Комментарий
ShareNT.shi2_permissions := ACCESS_ALL; //Доступ
ShareNT.shi2_max_uses := DWORD(-1); //Кол-во максим. подключ.
ShareNT.shi2_current_uses := 0; //Кол-во тек подкл.
ShareNT.shi2_path := TmpDirNT; //Путь к ресурсу
ShareNT.shi2_passwd := ''; //Пароль
try
if NetShareAdd(PWideChar(HostName), 2, @ShareNT, nil)=0 then btnGetSharesClick(Sender);
finally
NetApiBufferFree(@ShareNT);
end;
end;
MeMO (2004-08-31 11:55:00) [13]С нахождением шар все получидось, спасибо. Только вот теперь появилась проблема с их подключением. Куда писать путь к шаре?
Постоянно фу-я выдает ошибку 123. Вот фрагмент где я пытаюсь подключить шару что не так. Помогите. Заранее спасибо.
procedure TMainForm.lbxSharesDblClick(Sender: TObject);
const
STYPE_DISKTREE = 0;
ACCESS_ALL = 258;
var ShareNTItem : TShareInfo1;
TmpDir:lmstr;
TmpName: String;
TmpDirNT, TmpNameNT: PWideChar;
TmpLength: Integer;
begin
TmpDir:=TShareInfo1Array(@Info^)[lbxShares.ItemIndex].shi1_netname;
TmpName:=InputBox('Share name','Enter name',''); //Îïðåäåëÿåì èìÿ ïîä êîòîðûì îí áóäåò âèäåí â ñåòè
if TmpName='' then Exit;
if TmpDir='' then Exit;
FLibHandle:=LoadLibrary('NETAPI32.DLL');
if FLibHandle=0 then Exit;
@NetShareAdd:=GetProcAddress(FLibHandle,'NetShareAdd');
if not Assigned(NetShareAdd) then begin
FreeLibrary(FLibHandle);
Exit;
end;
TmpLength:=SizeOF(WideChar)*256; //Îïðåäåëÿåì íåîáõîäèìûé ðàçìåð
GetMem(TmpNameNT,sizeof(WideChar)*256); //Êîíâåðòèðóåì â PWChar
StringToWideChar(TmpName, TmpNameNT,sizeof(WideChar)*256);
ShareNTItem.shi1_netname := TmpNameNT; //Èìÿ
ShareNTItem.shi1_type := STYPE_DISKTREE; //Òèï ðåñóðñà
ShareNTItem.shi1_remark := ''; //Êîììåíòàðèé
//ShareNTItem.shi1_permissions := ACCESS_ALL; //Äîñòóï
//ShareNTItem.shi1_max_uses := DWORD(-1); //Êîë-âî ìàêñèì. ïîäêëþ÷.
//ShareNTItem.shi1_current_uses := 0; //Êîë-âî òåê ïîäêë.}
//GetMem(TmpDirNT, TmpLength);
//StringToWideChar(TmpDir, TmpDirNT, TmpLength);
//ShareNTItem.shi1_path := TmpDirNT; //Ïóòü ê ðåñóðñó
//ShareNTItem.shi1_passwd := nil; //Ïàðîëü
Error:=NetShareAdd(Host,2,@ShareNTItem,nil); //Äîáàâëÿåì ðåñóðñ
if Error0 then
MessageDlg('Share add error'+Inttostr(Error),mtError,[mbOK],0);
FreeMem (TmpNameNT); //îñâîáîæäàåì ïàìÿòü
//FreeMem (TmpDirNT);
FreeLibrary(FLibHandle);
CompList.OnDblClick(self);
end;
Дмитрий Ботвин (2004-08-30 16:58:00) [14]Ну ты даёшь, ты меня последней надежды лишил :-((((
Нельзя же так сразу :-))))
Я, в принципе, так и предполагал, ну думал может чё не знаю.
Ну ладно, всё равно спасибо :-))))
Rouse_ (2004-08-30 16:47:00) [15]> Piter © (30.08.04 15:39)
Я же сказал что одновременно и в статье поправлю :)
> [14] Дмитрий Ботвин (30.08.04 15:57)
не уверен что такое вообще возможно :)
Дмитрий Ботвин (2004-08-30 15:57:00) [16]Rouse_ я тоже когда то написал полнофункцианальный сетевой администратор. Единственное чего не смог определить для сетевого
компа - объём оперативки на нём. Ты часом не в курсе это
вообще реально сделать???
Piter (2004-08-30 15:39:00) [17]Rouse_ © (30.08.04 10:27) [8]
Думаю не составит труда переписать остальные функции по образу и подобию данного мной примера
а чего, поправить статью совсем никак? Это же пять минут, чем в конференции каждый раз объяснятся... да и вообще некорретный ответ в форуме это ладно. А вот некорректный пример в статье гораздо хуже...
Rouse_ (2004-08-30 15:18:00) [18]> [11] Дмитрий Ботвин (30.08.04 14:40)
Сканер сети, оспределенние параметров удаленной машины таких как ОС, время, ресурсы, пользователи, группы, текущие процессы... и т.д. и т.п.
Как закончу, если все нормально то недельки через 2 - 3...
Дмитрий Ботвин (2004-08-30 14:40:00) [19]Rouse_ а когда ты хош 2-ю часть опубликовать? И о чём там
будет идти речь???
Дмитрий Ботвин (2004-08-30 11:42:00) [20]А у меня лишь на некоторых компах с WinNT 4.0 тока ошибку
выдовал, но я её устранил убрав флажок Range Checking в настройках компилятора. После чего всё заработало на любых
компах. Я подумал, что это глюк тех компов :-))))
P.S. Щас попробую на тех компах исправленный вариант....