1

我们可以使用 Java 在远程 Windows 桌面上执行 .bat 文件吗?批处理文件检查系统服务,如果它关闭,它假设与我本地机器中的 Java 程序通信,然后它应该再次执行并运行服务,并再次联系 Java 程序:

我的批处理文件目前只是检查服务是否启动,然后它会启动服务:

所以两个问题:

  1. 我们可以通过我的 Java 代码远程执行批处理文件吗:
    如果可以的话:
  2. 该代码是否可以根据特定条件与批处理文件通信(这里我的条件是服务/服务是否正在运行)?:

请看下面的批处理文件:

@ECHO OFF

for /f "tokens=3" %%a in ('sc query "aspnet_state"^|find "STATE"') do (
if %%a==4 (goto running)
    (sc start aspnet_state goto stopped)
   )
  :stopped
  msg * stopped but now it is running
  goto :eof
:running
msg * running
4

3 回答 3

1

您对如何在远程 Windows 机器上执行 .bat 文件有任何想法吗?您是否考虑过将批处理文件传送到远程 Windows 机器?考虑获得运行这样的脚本所需的管理权限?在来回通信期间考虑防火墙问题?

您似乎正在设计的东西看起来类似于木马恶意软件。它们的工作方式——它们感染目标机器(交付阶段),然后代理将不时与服务器机器通信(通信阶段),以查看服务器机器是否需要代理来完成任何工作。这是最可靠的,因为通常允许出站连接,而入站(连接到代理的服务器)几乎总是被禁止。收到命令日志后,代理将执行命令(执行阶段),然后将结果发布回服务器(通信返回阶段)。

像这样的东西。

PS:Java 不是首字母缩写词。

于 2012-04-30T13:55:01.887 回答
0
  1. 您是否考虑过将 BAT 文件复制到服务器并使用 Windows 计划任务将其设置为每小时运行一次(这不是最好的主意,但这似乎是您的目标)?

  2. 您正在使用的sc命令实际上可以单独支持与远程机器的连接,例如sc \\REMOTE.COMPUTER start aspnet_state). 这可以在任何机器上设置和运行,前提是执行命令的用户有权在远程计算机上启动服务(无论如何你都需要这样做)。

  3. 只要您在 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 中是重复的(上面也有链接),但是该文档并没有将您链接到各种函数之间。

于 2012-04-30T15:18:41.957 回答
0

感谢 Headstart 但是我建议对代码进行一些更改:

   W32ServiceManager serviceManager = new W32ServiceManager("TPADDCM13", null);   
    serviceManager.open(Winsvc.SC_MANAGER_ALL_ACCESS); //here is the change 
    W32Service service = serviceManager.openService("DmServerSppdev02",  
    Winsvc.SC_MANAGER_ALL_ACCESS);  
   if( service.queryStatus().dwCurrentState != Winsvc.SERVICE_RUNNING)//here
   {
       service.startService(); 
       service.close();
       System.out.println("Done");       }

谢谢你的帮助我做到了:)

于 2012-05-04T07:21:53.517 回答