强制自动启动计算机?

我们知道如何使用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或任何其他语言进行操作?

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

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

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

您可以远程控制此设备以控制从任何语言(包括java)关闭的服务器。

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

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

我不知道你将如何通过Java实现这一目标,但这里有一些示例C代码,它将创建一个任务,以便将来唤醒计算机2分钟:

 #include  #include  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。

我确实在互联网上找到了一个类似的问题,所以我会在这里发布链接,看看你是否觉得它有用。 (这是我找到的主题: 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之类的操作 – 让我们甚至不知道这样的行为是否会出现问题需要管理员或以上权限。

希望有所帮助。