Форум: "WinAPI";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
Вниз
Опять о выключении компьютера... Найти похожие ветки
← →
Александр Богданов (2002-12-05 07:29) [0]Мне нужно выключить компьютер в нужное время. ОС 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.
← →
Song (2002-12-05 07:33) [1]У Вас компьютер локальный или в сети?
← →
slpro (2002-12-05 08:19) [2]Вот здесь есть прога www.slpro.nm.ru если получится напишу!
← →
Александр Богданов (2002-12-05 15:10) [3]>Song
компьютер локальный и все работает пока я залогининый
под админом, т.е. я создал задачу в шедуллере,
задача запускается, компьютер выключается - все как надо.
но если я завершил сеанс админа, то задача запускается,
но компьютер не выключается...
← →
Song (2002-12-05 15:51) [4]Дело в шедулере. Для него задаётся пароль на задачу. И если этот пароль не совпадает с паролем текущего полтзователя, то задача не выполнится.
← →
Александр Богданов (2002-12-06 06:49) [5]>Song
и как тогда быть если надо выключить компьютер
в назначеное время ?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c