2012-04-30 86 views
1

我們可以使用Java在遠程Windows桌面中執行.bat文件嗎?批處理文件檢查系統服務,如果它關閉它假設在我的本地機器中與Java程序通信,然後它應該再次執行並運行服務,並再次與Java程序聯繫:登錄到遠程Windows服務器並執行.bat文件

我的批處理文件目前只檢查的服務水平是否漲不跌,然後架起服務:

於是兩個問題:

  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 
+0

用不着喊每一個重要的詞!這些詞是遠程的,Windows,文件/文件和Java。 –

+1

可能重複http://stackoverflow.com/questions/5757920/how-to-connect-remote-windows-machine-by-java –

回答

1

你有你自己的任何想法,如何在遠程Windows機器上執行.bat文件?您是否考慮過將批處理文件交付給遠程Windows計算機?考慮獲得運行這樣的腳本所需的管理權限?在來回通信期間考慮防火牆問題?

你似乎在設計的東西看起來類似於木馬惡意軟件。它們的工作方式 - 它們感染目標機器(交付階段),然後代理將不時與服務器機器(通信階段)進行通信,以查看服務器機器是否需要代理進行任何工作。這是最可靠的,因爲出站連接通常是允許的,而入站(連接到代理的服務器)幾乎總是被禁止的。在收到命令日誌後,代理將執行命令(exec階段),然後將結果發送回服務器(通信回退階段)。

就是這樣。

PS:Java不是首字母縮寫詞。

+0

+1 for *「Java不是一個首字母縮寫詞。」* - 我沒有閱讀其餘的仔細。 –

+1

您是否有想法?我在做什麼要求,我正在實現我的公司,我們有服務問題每過一個小時,所以而不是每次我計劃自動化的東西時,登錄到機器.... .PS我是最近1年的JAVA程序員,我知道它不是一個首字母縮寫詞,我只是想突出語言,因爲我喜歡它以這種方式寫作:) – RAJ

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 project有代碼來模擬用戶使用JNA,在NTLM身份驗證的上下文中。這可以擴展到你的案例。 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中都是重複的(上面也鏈接過),但是這些文檔並沒有將你與各種功能聯繫起來。

+0

上述想法看起來不錯,但我們是否提供Credetials登錄到服務器,也是我想登錄的計算機名 – RAJ

+0

也可以觸發此代碼只在服務關閉時運行如果(aspNetService.queryStats()。dwCurrentState!= SERVICE_RUNNING) – RAJ

+0

@RajeshGhosh:我不明白你的第二個評論。顯示的代碼的最初位是檢查服務是否正在運行所需的東西。 – ig0774

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

Thnks你幫我做到了:)

相關問題