power off

From
Gennady Porev (2:463/304)
To
Alexander Mingalev
Date
2001-05-07T21:36Z
Area
SU.WINDOWS.NT.PROG
Hi, Alexander!

07 мая 2001 04:27 Alex Fedotov (2:5020/400) писал(а) к  Alexander Mingalev про power off:

 >> как програмно выключить комп для nt?
 >> точнее, для этого нужна привелегия SE_SHUTDOWN_NAME,
 >> а какие вообще нужны уcловия для её получения?
 AF> SE_SHUTDOWN_NAME по умолчанию есть у Administrators и Power Users,
 AF> но изначально она выключена в токене процесса. Все что нужно сделать,
 AF> это включить ее с помощью AdjustTokenPrivileges:

Если интересует готовая прога, то так :)

{$APPTYPE CONSOLE}
program tryshutd;
uses
  Windows,
  SysUtils;
procedure Reboot(s : PChar);
var hToken : THandle;
    NewState,OldState : TTokenPrivileges;
    OSVersionInfo : TOSVersionInfo;
    OldSize : Cardinal;
begin
 Writeln('Shutdown: ',s);
 SetLastError(0);
 OSVersionInfo.dwOSVersionInfoSize:=SizeOf(OSVERSIONINFO);
 GetVersionEx(OSVersionInfo);
 if OSVersionInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
  begin
   OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or               TOKEN_QUERY,hToken);
   NewState.PrivilegeCount:=1;
   LookUpPrivilegeValue(s,'SeShutdownPrivilege',NewState.Privileges[0].Luid);
   NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken,FALSE,NewState,SizeOf(OldState),OldState,
                         OldSize);
   CloseHandle(hToken);
  end;
 InitiateSystemShutdown(s,'Shutdown message',5,true,false);
end;

begin
 if ParamCount>0 then Reboot('\\COMPUTERNAME');
end.

      Best regards, Gennady.                         [MCP #2124946]
        ICQ UIN: 13031700                            porev@i.com.ua
--- GoldED/W32 3.0.1
 * Origin: EXPAN headquarter (2:463/304)