强制自动启动计算机?

时间:2013-03-26 09:25:19

标签: java

我们知道如何使用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 个答案:

答案 0 :(得分:15)

你需要一些东西来触发启动。触发这个的最好方法是Wake On Lan。

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

答案 1 :(得分:4)

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

您可以远程控制此设备,以便从任何语言(包括java。)中断电服务器。

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

答案 2 :(得分:3)

如果您的BIOS支持高级电源管理(APM)1.2或更高版本,则应该可以根据计时器将其从睡眠/待机或休眠模式唤醒。在Windows上,最终用户可以通过任务计划程序执行此操作,如果您希望以编程方式执行此操作,则可以使用Task Scheduler interfaces

我不知道你将如何通过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。

答案 3 :(得分: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

)挂钩到Windows任务计划程序http://msdn.microsoft.com/en-us/library/aa383581%28VS.85%29.aspx

据我所知,由于Java需要在虚拟机中运行,因此无法让它执行诸如打开PC之类的操作 - 让我们甚至不知道是否有这样的问题行动需要管理员或以上特权。

希望有所帮助。