10

我们知道如何使用 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 或任何其他语言来做?

4

4 回答 4

15

你需要一些东西来触发启动。触发此操作的最佳方法是网络唤醒。

如果您想在 Java 中执行此操作,可能是一个很好的资源。

于 2013-03-26T09:26:57.797 回答
4

除了网络唤醒之外,还有一些在连接到主板的服务器级硬件上运行的 IPMI 设备,可以控制电源以及通过网络连接提供串行控制台输出。这台计算机一直在运行,但我不熟悉任何可以加载自己的代码的计算机。

您可以远程控制此设备以对已关闭任何语言(包括 java)的服务器进行电源控制。

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

于 2013-05-04T06:19:33.147 回答
3

如果您的 BIOS 支持高级电源管理 (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。

于 2013-05-05T04:08:08.290 回答
1

我确实设法在互联网上找到了一个类似的问题,所以我会在这里发布链接,看看你是否觉得它有帮助。(这是我找到的线程: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/允许您通过 COM 语言(AF

据我所知,因为 Java 需要在虚拟机中才能运行,所以没有办法让它执行诸如打开 PC 之类的操作——我们甚至不要讨论这样的操作是否会需要管理员或以上权限。

希望有帮助。

于 2013-05-05T04:32:05.093 回答