Текущий архив: 2004.07.04;
Скачать: CL | DM;
Вниз
Послать сообщение дугому ПК Найти похожие ветки
← →
RAIN © (2004-04-23 09:24) [0]Наверное, многие знают функцию выключения компьютера по сети, не используя программу сервер InitiateSystemShutdown("192.168.0.1", "Shutdown",1,True,False). Теперь я пытаюсь найти функцию привязки к определенному компьютеру по IP, как это было сделано в функции InitiateSystemShutdown, для того чтобы послать на данный ПК сообщение. Например меня сейчаз интересует, думаю что это возможно, выдвинуть дверцу CD-ROM у ПК, находящего в сети и не используя программу сервер. Буду очень благодарен, если кто-нибудь что-нибудь посоветует. Спасибо.
← →
Ozone © (2004-04-23 10:32) [1]TO RAIN ©
Можно вопрос - а как работает эта самая функция InitiateSystemShutdown. Как я понимаю нужны какие-то привелегии.
Если так, то как их заиметь?
← →
RAIN © (2004-04-23 10:51) [2]to Ozone
Я знаю только одно, что данная функция работает, если есть доступ к этому ПК, в смысле, что к нему можно просто зайти, вообщем произвести как бы авторизацию. И еще я знаю, что данная функция не может выключить ПК, где установлена ОС WinXP. Там, наверное закрыли порт или что-то такое.
← →
Ozone © (2004-04-23 11:12) [3]Попробовал так:
procedure Shutdown (Name:String; Message:String; Delay:Integer;
Restart,CloseAll:Boolean);
var
ph:THandle;
tp,prevst:TTokenPrivileges;
rl:DWORD;
begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
LookupPrivilegeValue(Nil,"SeShutdownPrivilege",tp.Privileges[0].Luid);
tp.PrivilegeCount:=1;
tp.Privileges[0].Attributes:=2;
AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);
InitiateSystemShutdown(PChar(name),PChar(Message),Delay,Restart,CloseAll);
ShowMessage(SysErrorMessage(GetLastError)); // ?????????
end;
Shutdown("192.168.40.217", "ShutDown", 5, true, true);
Пишет, что не найден сетевой путь (хотя я явно вижу этот комп в сети). В чем проблема?
ЗЫ: у меня WinXP, на удаленно ймашине Win98
← →
RAIN © (2004-04-23 11:28) [4]Вообщем вот прога, которая выключает удаленный ПК:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MMSystem, ComCtrls, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Co: TComboBox;
Edit1: TEdit;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
t: _Token_Privileges;
ht: cardinal;
rl: cardinal;
Computer : Array[1..500] of String[25];
ComputerCount : Integer;
EnumHandle : THandle;
WorkgroupRS : TNetResource;
Buf : Array[1..500] of TNetResource;
BufSize : Cardinal;{Integer;}
Entriess : Cardinal;{Integer;}
Result : Integer;
Workgroup,g : String;
iii : integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ht) then
begin
LookupPrivilegeValue(nil, "SeDoorOpenPrivilege", t.Privileges[0].Luid);
t.PrivilegeCount:=1;
t.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(ht, false, t, 0, nil, rl);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
InitiateSystemShutdown("192.168.0.77"{PChar(co.Items.Strings[co.ItemIndex])}, "Shutdown",1,True,False)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//поиск комьютеров в сети
co.Items.Clear;
ComputerCount := 0;
Workgroup := Edit1.Text + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
With WorkgroupRS do
begin
dwScope := 2;
dwType := 3;
dwDisplayType := 1;
dwUsage := 2;
lpRemoteName := @Workgroup[1];
end;
WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @WorkgroupRS, EnumHandle);
Repeat
Entriess := 1;
BufSize := SizeOf(Buf);
Result := WNetEnumResource( EnumHandle,Entriess,@Buf,BufSize );
If (Result = NO_ERROR) and (Entriess = 1) then
begin
Inc( ComputerCount );
Computer[ ComputerCount ] := StrPas(Buf[1].lpRemoteName);g:="";
if Computer[ ComputerCount ]<>"" then
for iii:=3 to length(Computer[ ComputerCount ]) do g:=g+Computer[ ComputerCount ][iii];
co.Items.Add(g);
end;
Until (Entriess <> 1) or (Result <> NO_ERROR);
WNetCloseEnum( EnumHandle );
//конец поиска
end;
end.
← →
RAIN © (2004-04-23 15:04) [5]В этой проге надо ввести название ГРУППЫ и нажать поиск, далее выбрать любой ПК и нажать вторую кнопку, которая и выключает ПК. А вот как все таки связать ХЭНДЛ к сетевому ПК ну или что-то вроде этого?
← →
RAIN © (2004-04-26 06:11) [6].
← →
RAIN © (2004-04-26 07:58) [7]Можете ответить, это хоть возможно, но только если точно знаете :)?
← →
имя (2004-04-27 10:44) [8]Удалено модератором
← →
coolIP (2004-05-07 07:43) [9]Классная прога! Больше ничего не нашел? Попробуй поковырять:
GetService,
OpenSCManager,
RegConnectRegistry,
SERVICE_INFO.
Страницы: 1 вся ветка
Текущий архив: 2004.07.04;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.022 c