Запустить автоматический запуск компьютера?

Мы знаем, как принудительно отключить компьютер с помощью Java. Например, следующий код работает отлично для принудительного отключения:

public static void main(String arg[]) throws IOException{
    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec("shutdown -s -t 0");
    System.exit(0);
}

Теперь предположим, что если я хочу заставить запуск компьютера (который находится в выключенном состоянии), в определенное время, можно ли это сделать на Java или на любом другом языке?

Ответ 1

Вам нужно что-то инициировать запуск. Лучший способ вызвать это - Wake On Lan.

Если вы хотите сделать это на Java, этот может быть хорошим ресурсом.

Ответ 2

В дополнение к wake on lan существуют устройства IPMI, которые запускаются на некоторых аппаратных средствах на уровне сервера, которые подключены к материнской плате и могут контролировать питание, а также обеспечивать последовательный вывод консоли по сетевому соединению. Этот компьютер работает все время, но я не знаком ни с кем, на который вы можете загрузить свой собственный код.

Вы можете управлять этим устройством удаленно, чтобы управлять сервером, который отключен от любого языка, включая java.

http://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface

Ответ 3

Если ваш BIOS поддерживает Advanced Power Management (APM) версии 1.2 или новее, он должен быть способен разбудить его из режима ожидания/ожидания или спящего режима на основе таймера. В Windows конечный пользователь может сделать это с помощью планировщика заданий, и если вы хотите сделать это программно, вы можете использовать "Диспетчер планировщика заданий" .

Я не знаю, как вы это сделаете с помощью Java, но вот пример кода C, который создаст задачу для пробуждения компьютера в течение 2 минут в будущем:

#include <mstask.h>
#include <time.h>

int main() {
  HRESULT hr = CoInitialize(NULL);
  if (SUCCEEDED(hr)) {
    ITaskScheduler *scheduler;
    hr = CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void**)&scheduler);
    if (SUCCEEDED(hr)) {
      ITask *task;
      hr = scheduler->NewWorkItem(L"Wake Timer", CLSID_CTask, IID_ITask, (LPUNKNOWN*)&task);
      if (SUCCEEDED(hr)) {
        WORD index;
        ITaskTrigger *trigger;
        hr = task->CreateTrigger(&index, &trigger);
        if (SUCCEEDED(hr)) {
          time_t t = time(NULL) + 120;
          struct tm *ltime = localtime(&t);

          TASK_TRIGGER triggertime;
          memset(&triggertime, 0, sizeof(triggertime));
          triggertime.cbTriggerSize = sizeof(TASK_TRIGGER);
          triggertime.wBeginYear = ltime->tm_year+1900;
          triggertime.wBeginMonth = ltime->tm_mon+1;
          triggertime.wBeginDay = ltime->tm_mday;
          triggertime.wStartHour = ltime->tm_hour;
          triggertime.wStartMinute = ltime->tm_min;
          triggertime.TriggerType = TASK_TIME_TRIGGER_ONCE;
          trigger->SetTrigger(&triggertime);
          trigger->Release();
        }

        task->SetFlags(TASK_FLAG_DELETE_WHEN_DONE|TASK_FLAG_SYSTEM_REQUIRED|TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
        task->SetAccountInformation(L"", NULL);

        IPersistFile *file;
        hr = task->QueryInterface(IID_IPersistFile, (void**)&file);
        if (SUCCEEDED(hr)) {
          file->Save(NULL, TRUE);
          file->Release();
        }
        task->Release();
      }
      scheduler->Release();
    }
    CoUninitialize();
  }
  return 0;
}

Предположительно, если вы можете сделать это в Windows, должны быть эквивалентные API для других операционных систем.

Ответ 4

Мне удалось найти аналогичный вопрос, который можно было бы поплыть в Интернете, поэтому я опубликую ссылки здесь, чтобы узнать, поможет ли вам это сделать. (это был поток, который я нашел: http://www.coderanch.com/t/440680/gc/interact-Windows-Task-Scheduler-Java)

Прежде всего, я могу добавить, что Java - это язык, который должен запускаться в виртуальной машине - нет двух способов обойти его. Я не очень хорошо разбираюсь в "низкоуровневом" программировании, например, программировании ближе к уровню BIOS, и это то, о чем мы и говорим.

Поскольку вопрос был явно о Java, лучшее, что я мог бы извлечь из исследования, - это (если вы действительно хотите использовать Java для чего-то), используя JAVA-COM (JACOB) http://sourceforge.net/projects/jacob-project/, который позволяет подключиться к планировщику задач Windows http://msdn.microsoft.com/en-us/library/aa383581%28VS.85%29.aspx через Язык COM (AF

Насколько мне известно, поскольку Java должна находиться на виртуальной машине для запуска, не было бы способа заставить ее выполнять такие действия, как включение ПК, - пусть даже не попадает в вопрос о том, для действия потребуется администратор или вышеприведенные привилегии.

Надеюсь, что это поможет.