首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用system.management关闭时拒绝访问

当使用system.management关闭时拒绝访问
EN

Stack Overflow用户
提问于 2011-05-05 19:00:27
回答 2查看 4.9K关注 0票数 2

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

首先,我没有域或SharePoint,只是Windows上的一个简单工作组。现在,我设法使shutdown.exe工作起来,但我想肯定有一个C#解决方案,所以经过一些搜索,我找到了一些使用system.management命名空间的代码,它们非常有效。

这两种解决方案的唯一问题是,我需要登录一个相同的管理员帐户,而且我只想说,并不是所有与我一起工作的人都是最精通技术的,所以考虑让他们使用管理帐户让我感到紧张。

我不能让他们访问该特性,但我发现了以下代码:

代码语言:javascript
复制
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}

我试着取消注释,只是密码和用户名(通过和用户名的管理帐户,我知道是正确的)也取消评论的权威。我用:

代码语言:javascript
复制
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 (老实说,没有完全理解这句话)

也许这是只允许在领域,但我还没有找到任何确认这一点。我想避免增加另一个帐户,所以有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2012-10-05 16:06:20

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2011-05-05 20:55:44

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

( .bat脚本)没有管理员权限

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5902791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档