Акжан в сети - На уровень вверх(NT) Как выполнить перезагрузку (reboot) в Windows NT?

Даже если ты работаешь под Администратором, твоя программка должна запросить дополнительные привилегии. Вот как это делается (на языке Си):

void Reboot (void)
{
  HANDLE hToken;
  TOKEN_PRIVILEGES* NewState;
  OSVERSIONINFO OSVersionInfo;

  OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
  GetVersionEx (&OSVersionInfo);
  if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
  {
    OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, 
      &hToken);
    NewState = (TOKEN_PRIVILEGES*) malloc (sizeof 
      (TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES));
    NewState->PrivilegeCount = 1;
    LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, 
      &NewState->Privileges[0].Luid);
    NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
    free (NewState);
    CloseHandle (hToken);
  }
  ExitWindowsEx (EWX_REBOOT, 0);
}

Andy Nikolayev

an@megatel.ru
(2:5020/56)

Здесь иная редакция этой процедуры (на Паскале, без проверки версии ОС) -

Procedure Shutdown(Name:String;   // Имя машины (\\SERVER)
     Message:String;  // Сообщение
     Delay:Integer;  // Задержка перед рестартом
     Restart,CloseAll:Boolean);
var
  ph:THandle;
  tp,prevst:TTokenPrivileges;
  rl:DWORD;
begin
  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
  LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
  tp.PrivilegeCount:=1;
  tp.Privileges[0].Attributes:=2;
  AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);
  InitiateSystemShutdown(PChar(name),PChar(Message),Delay,Restart,CloseAll);
  ShowMessage(SysErrorMessage(GetLastError)); // Результат
end;

Sergey Dubovsky

4438645@pager.mirabilis.com
(2:450/103.15)