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

Access is Denied when connecting to remote computer using WMI from app under IIS

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

在我的示例中,客户端只需 POST 使用负载中的凭据调用 Web 服务。然后该服务尝试建立 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;
    }

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

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

正如信息一样:在 Azure 等其他平台上,您不能更改 WebApp 的安全设置。服务/中继方式也可以解决该需求。

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

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

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

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

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

几个月前我有一个博客post,

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