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

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

Помогите разобраться с InitiateSystemShutdown [D6, D7, WinXP]


Страницы:   1 2

Pohil ©   (2004-03-24 00:19:00) 

Уважаемые товарищи ! Помогите мне разобраться с этой наглой функцией. Вообщем мне нужно перезагрузить удаленный компьютер. В хэлпе по АПИ написано что - то вроде: "To shut down a remote computer, the calling process must have the SE_REMOTE_SHUTDOWN_NAME privilege on the remote computer." Только я не пойму как эти привилегии получить. И собственно функции AdjustTokenPrivileges передать SE_REMOTE_SHUTDOWN_NAME не получится. Надо вроде в winnt.h чего - то поглядеть. Короче помогите. Если есть то киньте на мыло winnt.h. Заранее благодарен.
 Надеюсь не зря :)


Pohil   (2004-04-08 02:02:00) [21]

>2Игорь Шевченко

Сделал как ты сказал. SysErrorMessage(GetLastError) возвратила: "Отказано в доступе", видимо программисты окон не утруждали себя подробным описанием ошибок. Ксати аналогичная ошибка возникала у меня при опросе сервисов, работающих на компе в LAN.


Pohil   (2004-04-07 13:33:00) [22]

> 2Игорь Шевченко

Спасибо. Вот это действительно дельное. Попробую.


Игорь Шевченко   (2004-04-07 00:11:00) [23]

Pohil ©   (06.04.04 23:28)


> помоги, пожалуйста, уже чем нибудь дельным


То ли в системе, то ли в "потрепаться" был vb-script, делающий то, что тебе надо через WMI. Включи поиск.


> Для любого другого InitiateSystemShutdown возвращает FALSE


Читай справку. Для того, чтобы узнать, почему InitiateSystemShutdown вернула FALSE нужно вызвать GetLastError. То, что она вернет, проанализировать. Сказать ShowMessage(SysErrorMessage(GetLastError)). Текст запомнить и привести здесь.


Pohil   (2004-04-06 23:28:00) [24]

>Можно вопрос: нафига ?

Включи воображение. Представь огромный офис. 100 компов. Представь как админ в 19:00 начинает бегать и выключать все эти компы. Заканчивает в 20:00.

Слушай, помоги, пожалуйста, уже чем нибудь дельным, а то "TFM" - страшно даже становится. Очень надо. Если тебя ответ писать обламывает, может хоть ссылку кинь. Желательно на русский материал по вопросу. Но буду еще больше благодарен, если подскажешь чего в моем коде не правильно.


S@shka   (2004-04-06 13:46:00) [25]

Будет ли перезагрузка безоговорочной.
В частности ели какое то приложение ВИСИТ - приведет ли данный код к перезагрузке ПК?


Игорь Шевченко   (2004-04-06 12:22:00) [26]

Pohil ©   (06.04.04 11:47)


> реально ли с помощью InitiateSystemShutdown перезагрузить
> комп в локалке?


Можно вопрос: нафига ?


Pohil   (2004-04-06 11:47:00) [27]

Может для начала скажешь реально ли с помощью InitiateSystemShutdown перезагрузить комп в локалке?
Если да, то обязательно прочту TFM, особенно если расшифруешь.

А насколько я знаю GetLastError комп точно не перезагрузит.


Игорь Шевченко   (2004-04-05 12:23:00) [28]


> Для любого другого InitiateSystemShutdown возвращает FALSE


А GetLastError - это военная тайна, которую знать никому не положено.

TFM читай. Долго.


Pohil   (2004-04-05 11:54:00) [29]

Как раз таки в локальной сети. Использую примерно такой код:

procedure TForm1.Button1Click(Sender: TObject);
var
 hToken: THandle;
 tkp: TTokenPrivileges;
 ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(),
 TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
 begin
   LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength);
   LookupPrivilegeValue(nil, 'SeRemoteShutdownPrivilege', tkp.Privileges[0].Luid);
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength);
   InitiateSystemShutdown(PChar(edHost.Text), 'He-he-he', 10, true, false);
 end;
 Gauge1.Progress := 0;
 Timer1.Enabled := true;
end;


Код работает только для локального компьютера. Для любого другого InitiateSystemShutdown возвращает FALSE, ну и комп соответственно не перезагружается.


Игорь Шевченко   (2004-03-30 10:48:00) [30]

Pohil ©   (30.03.04 02:05)

Ты хочешь перезагрузить компьютер не в локальной сети с помощью этой функции ?


Pohil   (2004-03-30 02:05:00) [31]

Удалено модератором
Примечание: Дубль


Pohil   (2004-03-30 02:05:00) [32]

Спасибо, конечно, за совет, особенно за код, но у меня было также и работало только с локальным IP. На другие IP ей было пофиг и ничего она с ними не делала. Вот так вот.  :(


ALS   (2004-03-25 11:14:00) [33]

Этот код всегда работал под NT4+SP6 и под W2000:


function Shutdown(Computer: PChar; Txt: PChar; Delay: integer; Reboot: boolean): boolean;
var hToken: THandle;
   tkp: TTokenPrivileges;
   ReturnLength: DWORD;
begin
 Result := False;
 // Get a token for this process.
 if not OpenProcessToken(GetCurrentProcess,
    TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
    hToken) then exit;
 // Get the LUID for the shutdown privilege.
 if not LookupPrivilegeValue(Computer, 'SeShutdownPrivilege',
        tkp.Privileges[0].Luid) then exit;
 tkp.PrivilegeCount := 1;  // one privilege to set
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 // Get the shutdown privilege for this process.
 if AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, ReturnLength) then
Result := InitiateSystemShutdown(Computer, Txt, Delay, True, Bool(Reboot))
            else
Application.MessageBox('Not enough privileges', 'Error', MB_ICONSTOP)
end;

procedure TForm1.Button1Click(Sender: TObject);
var OldTime: cardinal;
begin
 if ShutDown('Server', 'Don''t worry, be happy!', 40, True) then
 begin
   OldTime := GetTickCount;
   while GetTickCount - OldTime < 20000 do Application.ProcessMessages;
   AbortSystemShutdown('Server')
 end
end;


Страницы:   1 2

Наверх

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