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

时间:2016-01-12 12:53:24

标签: c# asp.net iis wmi iis-express

当我尝试使用WMI通过IIS(10.0)连接到远程服务器时,我收到Access is denied异常。通过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 个答案:

答案 0 :(得分:1)

我总是建议避免在IIS上的应用程序内部进行WMI调用,原因可能是安全性不足。

我建议创建一个本地Windows服务作为命令中继。 因此,您可以调用本地服务,此服务将执行远程WMI调用。然后,Windows服务需要权限才能在远程计算机上执行WMI命令,您无需更改Web应用程序环境的权限。

就像信息一样:在Azure等其他平台上,您不能更改WebApp的安全设置。服务/中继方式也可以解决这个问题。

答案 1 :(得分:0)

一个常见的误解是IIS Express是IIS。否。

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

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

只有将该身份更改为其他合适的身份或授予该帐户必要的权限,该代码才可以使用。

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

几个月前我有一篇博文,

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