您是否考虑过将 BAT 文件复制到服务器并使用 Windows 计划任务将其设置为每小时运行一次(这不是最好的主意,但这似乎是您的目标)?
您正在使用的sc
命令实际上可以单独支持与远程机器的连接,例如sc \\REMOTE.COMPUTER start aspnet_state)
. 这可以在任何机器上设置和运行,前提是执行命令的用户有权在远程计算机上启动服务(无论如何你都需要这样做)。
只要您在 Windows 机器上运行它,您就可以使用JNA进行本机 API 调用。请参阅下面的示例
例子:
W32ServiceManager manager = new W32ServiceManager("REMOTE.COMPUTER", null);
manager.open(SC_MANAGER_CONNECT);
W32Service aspNetService = manager.openService(
"aspnet_state",
SERVICE_QUERY_STATUS | SERVICE_START
);
if (aspNetService.queryStats().dwCurrentState != SERVICE_RUNNING) {
aspNetServices.startService();
}
aspNetService.close();
编辑
关于您的第一条评论:由于涉及的 API,提供登录远程服务器的凭据要复杂得多。一般来说,我只是建议确保您的进程以您要远程登录的用户身份运行。或者,waffle 项目具有在 NTLM 身份验证上下文中使用 JNA 模拟用户的代码。这可以扩展到您的情况。Windows API 的关键函数是LogonUser
和`ImpersonateLoggedOnUser,它们都已经映射到提供的 JNA Advapi32包装器中。要点是这样的:
Advapi32.INSTANCE.LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, handle);
Advapi32.INSTANCE.ImpersonateLoggedOnUser(handle);
// do something as user here...
Advapi32.INSTANCE.RevertToSelf(); // drop the impersonated token
您可能需要调用DuplicateTokenEx才能成功调用服务。有关模拟的详细信息,请参阅链接的 Microsoft 文档。其中大部分内容在 Advapi32 的 Javadocs 中是重复的(上面也有链接),但是该文档并没有将您链接到各种函数之间。