Текущий архив: 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 MSDNTo 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.45 MB
Время: 0.009 c