• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

узнать, включен ли определенный компьютер в сеть

  • Автор темы Автор темы ronik
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
R

ronik

pls... подскажите пожалуйста..
как узнать, подключен ли определенный компьютер к сети... :(
найти все имена и сравнить с тем что имеется не подходит,
это слишком громоздко и долго, нужны другие способы...
 
Проверить IP

если нет сети то комп имеет адрес 127,0,0,1
 
Проверить IP
если нет сети то комп имеет адрес 127,0,0,1

это вариант конечно, но мне надо проверить доступен ли другой компьютер в сети...
хотя, я уже написал по глупому... получил весь список компов в сети и сравнил...
не знаю, вроде быстро работает пока... как на других машинах будет? посмотрим..
спасибо за совет...
это тоже можно использовать для проверки... так и сделаем... спасибо...
 
Попробовать подключится к удаленной машине с помощью функции WNetAddConnection2.
 
ping, а то вдруг удаленный компьютер не под виндой))))
 
Попробовать подключится к удаленной машине с помощью функции WNetAddConnection2
попробывать то можно, но дело в том, что если сеть резко оборветься, то программа подвиснет на некоторое время, а этот вопрос то и надо решить.... :D

ping, а то вдруг удаленный компьютер не под виндой))))
компьютер под виндой.... ну а можно сделать быстрый ping из под Delphi?
если да, то как?
 
и еще: почему не работает вот этот код? :
Код:
if GetSystemMetrics(SM_NETWORK) and $01 = $01 then
ShowMessage(′Сеть есть!′)
else
ShowMessage(′Сети нет!′);
даже если сети нет то выдаётся что "Сеть есть"... :D
не понятно...
можно как-нибудь так же быстро но правильно определить есть ли сеть?
 
:P

Пинг быстрым быть не может по определению, в любом случае нужно ждать ответа на пинг, но в случае с локальной сетью таймаут можно брвть маленьким. Но пинг это правильное стандартное платформонезависимое решение :D
 
Но пинг это правильное стандартное платформонезависимое решение
с этим я асболютно согласен :P ... но программа не может пинговать каждые 3 секунды например...
она просто будет висеть... суть в том сделать так, чтобы после пропадания коннекта с сервером,
по любой причине, после вызова процедур проверки папки по сети типа DirectoryExists(), программа не подвисала на некоторое время, а то на некоторых машинах и вообще навсегда :D ...
 
вот... такая идея пришла... как проверить время выполнения функции, например DirectoryExists() в deplhi?
и если она выпоняется более, допустим, 1 секунды, просто дать заключение о невозможности соединения и прервать выпонение функции... чтоб программа дальше работала... есть такая возможность в delphi?
 
В твоей постановке никак

Как вариант, запускаешь функцию в отдельной потоке и ждешь его(потока) завершения с таймаутом
 
Как вариант, запускаешь функцию в отдельной потоке и ждешь его(потока) завершения с таймаутом
хм... надо попробывать...спасибо...
он то у меня и есть потоком только... как ждать завершения?
еще один таймер? не сильно ли громоздко?
 
дамс... теперь новый вопрос: как остановить выполнение потока, если он выполняется более чем 1 секунда? :(
 
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
 
спасибо...
я всё правильно понимаю:
создаю процесс... потом жду, если нет, то убиваю...
Код:
 goP:=TThread.Create(true);
goP.Priority:=tpLowest;
goP.FreeOnTerminate:=TRUE;
goP.Resume;
if WaitForSingleObject(goP.Handle,1000)=WAIT_TIMEOUT then
begin
gop.Terminate;
end;
или вот так:
Код:
 goP:=TThread.Create(true);
goP.Priority:=tpLowest;
goP.FreeOnTerminate:=TRUE;
goP.Resume;
if WaitForSingleObject(goP.Handle,1000)=Wait_Object_0 then
else
gop.Terminate;
в двух приведенных случаях не работает... может быть проблема в том, что
поток создаётся на основе класса TThread а не функцие CreateThread()?
и если ждат в основной программе, то она подвисает по моему на время таймаута....
может WaitForSingleObject() должен быть в теле потока? если да, то где именно? и
в каким образом?
 
Код:
 goP:=TThread.Create(true);
goP.Priority:=tpLowest;
goP.FreeOnTerminate:=TRUE;
goP.Resume;
if WaitForSingleObject(goP.Handle,1000)=WAIT_TIMEOUT then
begin
gop.Terminate;
end;
или вот так:
Код:
 goP:=TThread.Create(true);
goP.Priority:=tpLowest;
goP.FreeOnTerminate:=TRUE;
goP.Resume;
if WaitForSingleObject(goP.Handle,1000)=Wait_Object_0 then
else
gop.Terminate;
в двух приведенных случаях не работает... может быть проблема в том, что
поток создаётся на основе класса TThread а не функцие CreateThread()?
и если ждат в основной программе, то она подвисает по моему на время таймаута....
может WaitForSingleObject() должен быть в теле потока? если да, то где именно? и
в каким образом?
Оба случая некорректны: если у потока TThread выставлен флаг FreeOnTerminated := True, то после Resume нельзя обращаться к объекту потока, т.к. его теоретически уже может и не быть.

Т.к. внутри потока реализовано примерно так:
Код:
procedure TGop.Execute;
begin
while not Terminated do begin
// здесь длительная обработка
end;
end;
то вызов gop.Terminate не остановит работу потока, пока тот не закончит обработку.
Пробуй использовать TerminateThread, только внимательно изучи документацию - там описаны ряд нюансов.
 
в двух приведенных случаях не работает...
Как именно не работает? :)

может быть проблема в том, что
поток создаётся на основе класса TThread а не функцие CreateThread()?
вряд ли, TThread всего лишь wrapper, хотя в делфи я не специалист

и если ждат в основной программе, то она подвисает по моему на время таймаута....
Ну можно и так сказать. Давай ты лучше раскажешь чтто именно тебе надо реализовать
 
мне нужно проверить, доступна ли папка на каком-либо удаленном компьютере, но так, чтобы приложение не подвисало в момент проверки... просто проверка идет, а вот если резко выключить сеть из компьютера, то приложение подвисает на некоторое время (обычно не менее 5 секунд)... так то всё работает, но когда уходит сеть, то всё... надо ждать :) ... подвисают функции проверки...
 
Оба случая некорректны: если у потока TThread выставлен флаг FreeOnTerminated := True, то после Resume нельзя обращаться к объекту потока, т.к. его теоретически уже может и не быть.
спасибо... понятно...
Пробуй использовать TerminateThread
уже пробывал... эффект тот же... только памяти приложение больше ест... )
 
Код:
unit Unit1;

interface

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

type

TMyThread = class(TThread)
protected
procedure Execute; override;
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MyThreadTerminate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FMyThread: TMyThread;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FMyThread) then begin
FMyThread := TMyThread.Create(True);
FMyThread.OnTerminate := MyThreadTerminate;
FMyThread.Resume;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(FMyThread) then begin
TerminateThread(FMyThread.Handle, 0);
FreeAndNil(FMyThread);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FMyThread);
end;

procedure TForm1.MyThreadTerminate(Sender: TObject);
begin
MessageDlg('MyThread finished', mtInformation, [mbYes], 0);
Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
FreeAndNil(FMyThread);
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
Sleep(10000); // долгая операция
end;

end.
Вот этот код работает примерно как тебе надо. Замени Sleep на проверку компьютера в сети и протестируй.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD