![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ExitWindowsEx(... [D5, Win2k]
Коля © (2003-12-30 11:41:00)Мне нужна функция выключения компьютера под Win2000
В Win98 была ф. ExitWindows(EWX_POWEROFF, 0 );
но она лишь перезагружала. Есть также:
ExitWindowsEx(EWX_REBOOT,0);
ExitWindowsEx(EWX_POWEROFF,0);
но там нужны привелегии для Win2000.
А вообще мне это нужно, т.к. на серваке (который под Win2000) монитор сел совсем и я хочу написать прогу, выключающую его с другого (рабочего) компа локальной сети. Может уже есть готовые программы или процедура. Подскажите пожалуйста..
DeadMeat (2004-02-22 19:26:00) [1]
> [8] Костя (21.02.04 09:41)
Нормально... Ты вообще читал что сверху написано...??
Костя (2004-02-21 09:41:00) [2]Люди, вы не знаете что в XP вырубает комп,т.к. ExitWindowsEx что-то не работает...
DarkForest (2004-02-17 00:37:00) [3]Попробуй написать:
AdjustTokenPrivileges(ph,FALSE,tp,0,nil,rl);
В MSDN нарисовано так в примере кода выключения системы под WinXP.
BestDen (2004-02-09 23:28:00) [4]Вставил я от [2] код, мой компилятор показывает следующую ошибку:
[Error] offer.pas(51): Ambiguous overloaded call to 'AdjustTokenPrivileges'
Помогите решить проблемку... :)
YuRock (2003-12-30 13:54:00) [5]А вообще это делается так, как в [2], но вместо ExitWindowsEx() - InitiateSystemShutdown(), в которой первым параметром должно быть сетевое имя компа. Работает только на NT/2K/XP, причем если ты подлогинился к выключаемому компу с правами админа.
YuRock (2003-12-30 13:45:00) [6]> [2]
Да, но при чем здесь сервак? Ты же свой комп выключишь! Хотя, конечно, можно запустить эту прогу на удаленной машине.
Коля (2003-12-30 13:43:00) [7]Я тут покопался ещё в интернете и нашёл модуль:
unit shutdown;
interface
procedure ForceShutdownNT;
procedure ForceRebootNT;
procedure ForcePowerOffNT;
implementation
uses windows;
procedure error(msg : string);
begin
MessageBox(0, @msg[1], 'Error', MB_ICONERROR or MB_OK);
end;
function GetShutdownPriv : boolean;
var
hToken : THandle;
tkp : TTokenPrivileges;
ReturnLength : DWORD;
begin
// Get a token for this process.
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin
error('OpenProcessToken');
Result := false;
exit;
end;
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1; // one privilege to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, ReturnLength);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError <> ERROR_SUCCESS) then begin
error('AdjustTokenPrivileges');
Result := false;
exit;
end;
Result := true;
end;
procedure ForceShutdownNT;
begin
if GetShutdownPriv then
if (ExitWindowsEx(EWX_LOGOFF or EWX_FORCE, 0)) then error('ExitWindowsEx');
end;
procedure ForcePowerOffNT;
begin
if GetShutdownPriv then
if (ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0)) then error('ExitWindowsEx');
end;
procedure ForceRebootNT;
begin
if GetShutdownPriv then
if (ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0)) then error('ExitWindowsEx');
end;
end.
Dimman1 (2003-12-30 13:40:00) [8]procedure TForm1.Shutdown;
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);
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF or EWX_FORCE,0);
end;
Rik (2003-12-30 13:37:00) [9]AdjustTokenPrivileges?