登录远程Windows服务器&执行.bat文件

时间:2012-04-30 13:43:12

标签: java batch-file remote-desktop

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

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

所以有两个问题:

  1. 我们可以通过Java代码远程执行批处理文件:
    如果我可以:
  2. 该代码是否可以根据特定条件与批处理文件进行通信(此处我的条件是服务/服务是否正在运行)?:
  3. 请查看下面的批处理文件:

    @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
    

3 个答案:

答案 0 :(得分:1)

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

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

像这样。

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

答案 1 :(得分:0)

  1. 您是否考虑过将BAT文件复制到服务器并使用Windows计划任务进行设置以便每小时运行一次(这不是最好的想法,但这似乎是您的目标)?

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

  3. 只要您从Windows计算机运行此程序,就可以使用JNA进行本机API调用。请参阅下面的示例

  4. 示例:

    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 project具有在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中重复(也在上面链接),但该文档并未将您链接到各种函数之间。

答案 2 :(得分:0)

感谢Headstart BUt我建议代码中的一些变化:

   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");       }

对你帮助我这样做了:)