RPC サーバーが使用できません。ManagementScope.Connect を呼び出すとき
-
27-09-2019 - |
質問
サービスをリモートで作成する必要があり、コマンドを実行して「sc emotemachine create ......」を実行するのではなく、C# コード内で実行したいと考えています。
ただし、sc コマンドが非常に問題なく動作し、リモート システムを管理しているにもかかわらず、コードを実行すると、ManagementScope.Connect 呼び出しによって「RPC サーバーが利用できません」という例外がスローされます。
これを行うコードの一部は次のとおりです。
string machineName = "othermachine";
string path = string.Format(@"\\{0}\root\cimv2", machineName);
ManagementScope scope = new ManagementScope(path);
scope.Connect();
これは旅の第一歩なので、次にどこに行くか少し迷っています。sc コマンドは機能しますが、何が違うのでしょうか (.net ライブラリを使用しないこと以外に、おそらく winapi をもっと強く叩く必要があるのでしょうか?)
ありがとう
解決
このタスクに割り当てられた時間が侵食されていくのを見て、しばらくこれについて考えた後、古い WIN32 API ドキュメントを入手し、これを行うために必要な呼び出しを「昔ながらの方法」で [DllImport] しました。私は年老いた C 犬なので、これらの呼び出しを回避する方法を知っていました。マネージ ライブラリを何年も使用した後でさえ、どれほど多くの結果が返されるかは驚くべきことです。
私がしなければならないのは、サービスを作成し、起動し、役立つ作業を実行し、停止し、削除できるようにすることでした。作成、開始、停止、削除はメカニズムであり、アクティビティの「役立つ作業を行う」部分に集中したいと考えました。
まず、サービスの exe を ADMIN$ 共有にコピーし、そのローカル パスを確認しました (サーバー管理者にはわかりません!)。これを行うために私は電話します
["netapi32.dll"]NetShareGetInfo
そして、advapi32.dllから次のものを使用しました
- OpenSCManager
- サービスの作成
- StartService
- OpenService (停止して削除したい場合に使用します。これには時間がかかる可能性があるため、ハンドルを開いたままにしないでください。これにより、処理を自己完結型に保つことができます)
- コントロールサービス
- クエリサービスステータス
- サービスハンドルを閉じる
これはすべて、VPN 接続を介しても機能します。
マネージド API は、私が実際に必要とする以上のことを行おうとしていると推測することしかできません。マネージド API と Windows API の使用にかかる時間の差は非常に大きく、マネージド API がそれを完了するという保証はありません。今後の適切な方法ではありません。
他のヒント
もちろんMSDNから証券コードは、全体の絵を描くしません。私はあなたと同じ結果を得ることができます。
EDITます:
私は信じて、あなたは右、ワークグループではなくドメイン上でそれをしようとしていますか?これは、ワークグループは、を介して取得するために少しより多くの仕事を要求し、トリックです。リンクは、上記の回避策を持っているようです。私は自宅から再び今夜しようとします。