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