![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему из сервиса(службы) с админскими правами не могу выключить
novill © (2006-06-28 18:04:00)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.
Fay (2006-06-28 18:51:00) [1]Да, привилегию всё равно нужно дать...
Eraser (2006-06-28 18:27:00) [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:00) [3]InitiateSystemShutdown
novill (2006-06-28 18:15:00) [4]Да, если же вызывать функцию ExitWindows, то возвращается код "Неверная функция".