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

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

Опять о выключении компьютера... [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]

У Вас компьютер локальный или в сети?


Наверх

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