Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 登录到远程Windows服务器&;执行一个.bat文件_Java_Batch File_Remote Desktop - Fatal编程技术网

Java 登录到远程Windows服务器&;执行一个.bat文件

Java 登录到远程Windows服务器&;执行一个.bat文件,java,batch-file,remote-desktop,Java,Batch File,Remote Desktop,我们可以使用Java在远程Windows桌面上执行.bat文件吗?批处理文件检查系统服务,如果它已关闭,则应与本地计算机中的Java程序通信,然后应再次执行和运行服务,并再次与Java程序联系: 我的批处理文件当前只是检查服务是否启动,然后它会启动服务: 因此,有两个问题: 我们是否可以通过我的Java代码远程执行批处理文件:如果我可以: 该代码是否可以根据特定条件与批处理文件通信(此处我的条件是服务是否正在运行)?: 请查看下面的批处理文件: @ECHO OFF for /f "tokens

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

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

因此,有两个问题:

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

    @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
    

    关于如何在远程windows计算机上执行.bat文件,您有自己的想法吗?您是否考虑过将批处理文件传递到远程windows计算机?是否考虑获得运行这样的脚本所需的管理权限?在来回通信过程中考虑了防火墙问题

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

    像这样的


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

    关于如何在远程windows计算机上执行.bat文件,您有自己的想法吗?您是否考虑过将批处理文件传递到远程windows计算机?是否考虑获得运行这样的脚本所需的管理权限?在来回通信过程中考虑了防火墙问题

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

    像这样的

    注:Java不是首字母缩略词

  • 您是否考虑过将BAT文件复制到服务器,并将其设置为每小时运行一次Windows计划任务(这不是最好的主意,但这似乎是您的目标)

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

  • 只要您在Windows机器上运行此程序,就可以使用来进行本机API调用。请参见下面的示例

  • 例如:


    编辑

    关于您的第一条评论:由于涉及API,提供登录到远程服务器的凭据要复杂得多。通常,我建议您确保您的进程以您希望远程登录的用户的身份运行。或者,代码可以在NTLM身份验证的上下文中使用JNA模拟用户。这可以扩展到你的情况。Windows API中的关键函数是和,它们都已映射到提供的JNA包装器中。要点如下:

    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
    
    您可能需要调用才能成功完成服务调用。有关模拟的详细信息,请参阅链接的Microsoft文档。这在Javadocs for Advapi32(也在上面链接)中是重复的,但是该文档并没有将您链接到各种函数之间

  • 您是否考虑过将BAT文件复制到服务器,并将其设置为每小时运行一次Windows计划任务(这不是最好的主意,但这似乎是您的目标)

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

  • 只要您在Windows机器上运行此程序,就可以使用来进行本机API调用。请参见下面的示例

  • 例如:


    编辑

    关于您的第一条评论:由于涉及API,提供登录到远程服务器的凭据要复杂得多。通常,我建议您确保您的进程以您希望远程登录的用户的身份运行。或者,代码可以在NTLM身份验证的上下文中使用JNA模拟用户。这可以扩展到你的情况。Windows API中的关键函数是和,它们都已映射到提供的JNA包装器中。要点如下:

    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
    

    您可能需要调用才能成功完成服务调用。有关模拟的详细信息,请参阅链接的Microsoft文档。这在Javadocs for Advapi32(也在上面链接)中有很多重复,但该文档并没有将您链接到各种功能之间。

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