Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Почему из сервиса(службы) с админскими правами не могу выключить   Найти похожие ветки 

 
novill ©   (2006-06-28 18:04) [0]

Windows XP?

Функция ExitWindowsEx возвращает "Клиент не обладает требуемыми правами".

Сервис запущен с учетной записи с админскими правами.

unit ServU;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,shellapi;

type
 TMyShutdown = class(TService)
   procedure ServiceExecute(Sender: TService);
 private
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 MyShutdown: TMyShutdown;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 MyShutdown.Controller(CtrlCode);
end;

function TMyShutdown.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TMyShutdown.ServiceExecute(Sender: TService);
var p1:Cardinal;p2:Word; i:integer;
   st:text;
begin
 AssignFile(st,"c:\stop");
 Rewrite(st);
 while not Self.Terminated do
 begin
  if Time<StrToTime("17:05:00")
   then
    if not ExitWindowsEx(EWX_POWEROFF ,p2)
     then Writeln(st,SysErrorMessage(GetLastError))
     else Writeln(st,"off")
   else Writeln(st,"time");
  flush(st);
  Sleep(200);
  ServiceThread.ProcessRequests(false);
 end;
 CloseFile(st);
end;

end.


 
novill ©   (2006-06-28 18:15) [1]

Да, если же вызывать функцию ExitWindows, то возвращается код "Неверная функция".


 
Eraser ©   (2006-06-28 18:27) [2]

> [0] novill ©   (28.06.06 18:04)

наверное все таки не правами, а привилегиями? ) код ошибки какой?
RTFM MSDN
To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information, see Running with Special Privileges.

вот рабочий код:
 if not OpenProcessToken(GetCurrentProcess,
         TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
         Exit;
       if not LookupPrivilegeValue(nil,
         "SeShutdownPrivilege", tkp.Privileges[0].Luid) then
         Exit;
       tkp.PrivilegeCount := 1;
       tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges(hToken, False, tkp, SizeOf(PrevState), PrevState, dwBytes);
       if GetLastError <> ERROR_SUCCESS then
         exit;
       dwFlags := EWX_FORCE or EWX_FORCEIFHUNG;
       case AFlag of
         0: dwFlags := dwFlags or EWX_REBOOT;
         1: dwFlags := dwFlags or EWX_POWEROFF;
         2: dwFlags := dwFlags or EWX_LOGOFF;
       end;
       ExitWindowsEx(dwFlags, 0);


 
Fay ©   (2006-06-28 18:27) [3]

InitiateSystemShutdown


 
Fay ©   (2006-06-28 18:51) [4]

Да, привилегию всё равно нужно дать...



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
4-1144095343
Turbid
2006-04-04 00:15
2006.07.16
Проблемма с глобальными переменными в процедуре хука


1-1149229801
Layner
2006-06-02 10:30
2006.07.16
Balloon Hint не хочет показываться :( В чем может быть дело..


4-1144308799
Temniy
2006-04-06 11:33
2006.07.16
Многооконные приложения


15-1150318653
Strate
2006-06-15 00:57
2006.07.16
Если бы программисты строили дома :)


3-1147751981
D@Nger
2006-05-16 07:59
2006.07.16
Резервирование БД