Главная страница
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.027 c
15-1150295327
AlexanderMS
2006-06-14 18:28
2006.07.16
Пожалуйста, проверьте перевод...


2-1151649956
Посоветуйте
2006-06-30 10:45
2006.07.16
Посоветуйте форум по Oracle


6-1141833264
anton773
2006-03-08 18:54
2006.07.16
подключиться к интернету


5-1135259011
sco
2005-12-22 16:43
2006.07.16
Package unit IconButton cannot appear in contains or uses claus


2-1151467285
Freze_Kati
2006-06-28 08:01
2006.07.16
Как вставить часть французского текста?