2

私が担当している 15 台のコンピューターをリモートでオン/オフできるようにする小さなプログラムを C# -MVC# 2008 Express- で作成しようとしています。それらをオンにするのは簡単でしたが、オフにするのはもう少し問題があるようです.

まず、ドメインも SharePoint も持っていません。Windows XP の単純なワークグループだけです。今、私はshutdown.exeを動作させることができましたが、C#ソリューションが必要であると考えたので、少し検索した後、system.management名前空間を使用してうまく機能するコードを見つけました.

両方のソリューションの唯一の問題は、同じ管理者アカウントにログインする必要があることです。私が一緒に仕事をしているすべての人が最も技術に精通しているわけではないので、管理者アカウントを使用できるようにすることを考えると緊張します.

その機能にアクセスさせることはできませんでしたが、次のコードを見つけました。

void Shutdown() {
  try
  {
      const string computerName = "PC05"; // computer name or IP address
      ConnectionOptions options = new ConnectionOptions();
      options.EnablePrivileges = true;
      // To connect to the remote computer using a different account, specify these values:
      //options.Username = "";
      //options.Password = "";
      //options.Authority = "ntlmdomain:DOMAIN";

      //ManagementScope scope = new ManagementScope("\\\\" + computerName +  "\\root\\cimv2", options);
      ManagementScope scope = new ManagementScope();
      scope.Connect();
      SelectQuery query = new SelectQuery("Win32_OperatingSystem");
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
      foreach (ManagementObject os in searcher.Get())
      {
          // Obtain in-parameters for the method
          ManagementBaseObject inParams = os.GetMethodParameters("Win32Shutdown");
          // Add the input parameters.
          inParams["Flags"] =  2;
          // Execute the method and obtain the return values.
          ManagementBaseObject outParams = os.InvokeMethod("Win32Shutdown", inParams, null);
      }
  }
  catch(ManagementException err)
  {
     MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message);
  }
  catch(System.UnauthorizedAccessException unauthorizedErr)
  {
     MessageBox.Show("Connection error (user name or password might be incorrect): " + unauthorizedErr.Message);
  }
} 

しかし、それを使用しようとすると、アクセス拒否エラーが発生し続けます。

「アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))」} System.Exception {System.UnauthorizedAccessException}

パスワードとユーザー名だけをコメント解除しようとしました(私が知っている管理者アカウントのパスとユーザー名を使用して)権限もコメント解除しました。私が使用した:

options.Impersonation = ImpersonationLevel.Impersonate;
options.Authentication = System.Management.AuthenticationLevel.PacketPrivacy;

しかし、何も機能していないようです。これに特別な設定が必要かどうかはわかりませんが、前述のように、他のマシンで使用されている管理者アカウントにログインすると、接続してシャットダウンできます。現在、代替管理者アカウントでテストしています。

読みました:

http://msdn.microsoft.com/en-us/library/aa393613(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/aa393266(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/aa389286(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/aa389290(VS.85).aspx (正直なところ、これはよくわかりませんでした)

ドメインでのみ許可されている可能性がありますが、これに関する確認は見つかりませんでした。別のアカウントを追加する必要がないようにしたいので、何か提案はありますか?

4

2 に答える 2

2
ManagementBaseObject outParams = null;
ManagementClass os = new ManagementClass("Win32_OperatingSystem");
os.Get();
os.Scope.Options.EnablePrivileges = true; // enables required security privilege.
ManagementBaseObject inParams = os.GetMethodParameters("Win32Shutdown");
inParams["Flags"] = "2"; // System reboot
inParams["Reserved"] = "0";
foreach (ManagementObject mo in os.GetInstances())
    outParams = mo.InvokeMethod("Win32Shutdown",
    inParams, null);
于 2012-10-05T16:06:20.593 に答える
0

あなたの状況に役立つかもしれないより簡単な回避策は次のとおりです(それがあなたが使用する解決策であるかどうか教えてください):

管理者権限なしのリモート シャットダウン (*.bat スクリプト)

于 2011-05-05T20:55:44.893 に答える