RPC サーバーが使用できません。ManagementScope.Connect を呼び出すとき

StackOverflow https://stackoverflow.com/questions/4240945

  •  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 がそれを完了するという保証はありません。今後の適切な方法ではありません。

scroll top