BAT ファイルをサーバーにコピーし、Windows のスケジュールされたタスクを使用して 1 時間ごとに実行するように設定することを検討しましたか (最高のアイデアではありませんが、それはあなたが目指していることのようです)。
使用sc
しているコマンドは、実際にはそれ自体でリモート マシンへの接続をサポートできますsc \\REMOTE.COMPUTER start aspnet_state)
。これは、コマンドを実行するユーザーがリモート コンピューターでサービスを開始する権限を持っている場合に、任意のコンピューターからセットアップおよび実行できます (いずれにせよ、これを行う必要があります)。
これを 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 (上記にもリンクされています) で重複していますが、そのドキュメントはさまざまな機能間をリンクしていません。