代码之家  ›  专栏  ›  技术社区  ›  Mark Erickson

从IIS下的应用程序使用WMI连接到远程计算机时,访问被拒绝

  •  1
  • Mark Erickson  · 技术社区  · 10 年前

    我得到了 Access is denied 当我尝试通过IIS(10.0)使用WMI连接到远程服务器时出现异常。此代码在Visual Studio 2015调试(IIS Express)中运行良好。很明显,这是一个权限问题,但是我找不到任何明确的,甚至是建议性的最佳方法。

    在我的示例中,客户端只需使用有效载荷中的凭据对web服务进行POST调用。然后,该服务尝试建立WMI连接,以获取异常。远程服务器不在域中,并且已验证凭据可以访问给定的命名空间。

    我运行的是IIS 10,但我用IIS 7复制了它。

    感谢您的帮助!

    public ManagementScope Connect(Credentials creds, string path)
        {
            _creds = creds;
            _path = path;
    
            var conOpt = new ConnectionOptions
            {
                Impersonation = ImpersonationLevel.Impersonate,
                Authentication = AuthenticationLevel.PacketPrivacy,
                EnablePrivileges = true,
                Username = _creds.Username,
                Password = _creds.Password,
                //Authority = $"ntlmdomain:{_creds.Domain}"
            };
            // virtualization\v2
            _scope = new ManagementScope($@"\\{_creds.Server}\ROOT\{path}", conOpt);
            _scope.Connect();
    
            return _scope;
        }
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   Benjamin Abt    10 年前

    我总是建议避免在IIS上的应用程序内部调用WMI,因为可能缺乏安全性。

    我建议创建本地windows服务作为命令中继。 因此,您将调用本地服务,该服务将执行远程WMI调用。然后,windows服务需要在远程计算机上执行WMI命令的权限,您不必更改web应用程序环境的权限。

    正如信息:在Azure等其他平台上,您不允许更改WebApp的安全设置。此外,服务/中继方式也可以满足这一要求。

        2
  •  0
  •   Lex Li    10 年前

    一个常见的误解是IIS Express就是IIS。不

    IIS Express在您的帐户下执行代码。这意味着如果您的帐户具有必要的权限,那么代码运行正常。

    然而,IIS纯粹是一个托管服务,您的代码在工作进程标识(即应用程序池标识)下运行。查看您的IIS设置以了解我的意思。

    只有当您将该身份更改为另一个合适的身份或授予帐户必要的权限时,代码才能在之后工作。

    请注意,web应用程序不应执行需要大量额外权限的任务,否则它们可能会受到威胁并导致严重的安全问题。这就是为什么另一个答案建议您将WMI调用转移到专用Windows服务。

    几个月前我发了一篇博客,

    https://blog.lextudio.com/2015/04/web-application-differences-in-visual-studio-and-iis/

    推荐文章