1

Java を使用して、リモートの Windows デスクトップで .bat ファイルを実行できますか? バッチ ファイルはシステム サービスをチェックします。オフの場合は、ローカル マシンの Java プログラムと通信し、サービスを再度実行して実行し、Java プログラムに再度接続します。

私のバッチファイルは現在、サービスが稼働しているかどうかを確認してから、サービスを開始します。

だから2つの問題:

  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マシンへのバッチファイルの配信を検討しましたか?このようなスクリプトを実行するために必要な管理者権限を取得することを検討しましたか?通信中のファイアウォールの問題を考慮しましたか?

あなたが設計しているように見えるものは、トロイの木馬マルウェアに似ています。それらの動作方法-ターゲットマシンに感染し(配信フェーズ)、エージェントはサーバーマシンと時々通信して(通信フェーズ)、サーバーマシンが何らかの作業を行うためにエージェントを必要とするかどうかを確認します。アウトバウンド接続が許可されることが多いのに対し、インバウンド(エージェントに接続するサーバー)はほとんどの場合禁止されているため、これは最も信頼性が高くなります。コマンドログを受信した後、エージェントはコマンドを実行し(execフェーズ)、結果をサーバーにポストバックします(comms backフェーズ)。

このようなもの。

PS:Javaは頭字語ではありません。

于 2012-04-30T13:55:01.887 に答える
0

ヘッドスタートに感謝しますが、コードのいくつかの変更をお勧めします:

   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 に答える
0
  1. BAT ファイルをサーバーにコピーし、Windows のスケジュールされたタスクを使用して 1 時間ごとに実行するように設定することを検討しましたか (最高のアイデアではありませんが、それはあなたが目指していることのようです)。

  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 の主要な機能はImpersonateLoggedOnUserLogonUserであり、どちらも提供されている 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 に答える