![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять о выключении компьютера... [D5, WinXP]
Александр Богданов © (2002-12-05 07:29:00)Мне нужно выключить компьютер в нужное время. ОС WinXP корпус ATX. Стандартная команда Shutdown почему-то не выключает питание. В Internete я нашел пример как выключить питание, но
что-то не так с этим примером (пример ниже):
1) компьютер выключается так, будто бы я поставил флаг FORCE, т.е. принудительно завершает работу системы
2) если программа запускается шедулером, то компьютер не выключается
Help читал, но я не силен в WinAPI и тонкостях системы, посмотрите, пожалуйста, что я делаю не так.
program powerdown;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils;
function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var
tpPrev,
tp : TTokenPrivileges;
token : THandle;
dwRetLen : DWord;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
tp.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
begin
if enable then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
end;
CloseHandle(token);
end;
function WinExit(flags: integer): integer;
begin
SetPrivilege("SeShutdownPrivilege", true);
ExitWindowsEx(flags,0);
Result:=GetLastError();
SetPrivilege("SeShutdownPrivilege",False);
end;
procedure ShowHelp;
begin
writeln("powerdown [/l | /r | /s | /p] [/f]");
writeln;
writeln("/l logoff");
writeln("/r reboot");
writeln("/s shutdown");
writeln("/p powerdown");
writeln("/f force execution");
end;
var
Flags: integer;
begin
if (ParamCount = 0) or (ParamCount > 2)then begin
ShowHelp;
Exit;
end;
Flags:=-1;
if LowerCase(ParamStr(1)) = "/l" then Flags:=EWX_LOGOFF;
if LowerCase(ParamStr(1)) = "/r" then Flags:=EWX_REBOOT;
if LowerCase(ParamStr(1)) = "/s" then Flags:=EWX_SHUTDOWN;
if LowerCase(ParamStr(1)) = "/p" then Flags:=EWX_POWEROFF;
if Flags < 0 then begin
ShowHelp;
Exit;
end;
if ParamCount = 2 then
if LowerCase(ParamStr(2)) = "/f" then
Flags:=Flags + EWX_FORCE
else begin
ShowHelp;
Exit;
end;
writeln("Result of ExitWindowsEx:",WinExit(Flags));
end.
Александр Богданов (2002-12-06 06:49:00) [1]>Song
и как тогда быть если надо выключить компьютер
в назначеное время ?
Song (2002-12-05 15:51:00) [2]Дело в шедулере. Для него задаётся пароль на задачу. И если этот пароль не совпадает с паролем текущего полтзователя, то задача не выполнится.
Александр Богданов (2002-12-05 15:10:00) [3]>Song
компьютер локальный и все работает пока я залогининый
под админом, т.е. я создал задачу в шедуллере,
задача запускается, компьютер выключается - все как надо.
но если я завершил сеанс админа, то задача запускается,
но компьютер не выключается...
slpro (2002-12-05 08:19:00) [4]Вот здесь есть прога www.slpro.nm.ru если получится напишу!
Song (2002-12-05 07:33:00) [5]У Вас компьютер локальный или в сети?