使用系统管理关闭时拒绝访问

本文关键字:拒绝访问 系统管理 | 更新日期: 2023-09-27 17:55:12

我正在尝试用 C# -MVC# 2008 Express-创建一个小程序,它可以让我远程打开和关闭我负责的 15 台计算机。打开它们很容易,但关闭它们似乎更有问题。

首先,我没有域或SharePoint,只有Windows XP上的简单工作组。现在,我设法关闭.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(老实说不太明白这个)

也许它只允许在域中使用,但我还没有找到任何确认。我想避免添加另一个帐户,所以有什么建议吗?

使用系统管理关闭时拒绝访问

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);

这是一个更简单的解决方法,可能对您的情况有用(如果这是您可能使用的解决方案,请告诉我):

无需管理员权限的远程关机(*.bat 脚本)