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

C# 从IIS下的应用程序使用WMI连接到远程计算机时,访问被拒绝,c#,asp.net,iis,wmi,iis-express,C#,Asp.net,Iis,Wmi,Iis Express,当我尝试通过IIS(10.0)使用WMI连接到远程服务器时,访问被拒绝异常。同样的代码在VisualStudio2015调试(IIS Express)中也能正常工作。显然,这是一个权限问题,但我找不到任何明确的,甚至是最好的方法来解决这一问题的建议 在我的示例中,客户机只是使用有效负载中的凭据对web服务进行POST调用。然后服务尝试建立WMI连接以获取异常。远程服务器不在域中,并且已验证凭据是否可以访问给定的命名空间 我运行的是IIS10,但已复制到IIS7 感谢您的帮助 public Man

当我尝试通过IIS(10.0)使用WMI连接到远程服务器时,
访问被拒绝
异常。同样的代码在VisualStudio2015调试(IIS Express)中也能正常工作。显然,这是一个权限问题,但我找不到任何明确的,甚至是最好的方法来解决这一问题的建议

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

我运行的是IIS10,但已复制到IIS7

感谢您的帮助

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等其他平台上,您不允许更改Web应用程序的安全设置。服务/中继方式也可以解决这个问题。

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

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

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

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

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

几个月前我写了一篇博文


我想知道权限问题会有多严重。我很高兴你说了一些关于Azure的事情,因为这就是最终的结局。我熟悉windows服务,我理解您关于将该服务作为命令中继的意思,我只是不确定它在实现方面是什么样子。你能给我举个简单的例子或解释一下吗?谢谢Azure Web应用程序正在一个虚拟环境中运行。您不能更改应用程序池标识,也不能对其进行任何更改。对于服务:只需使用WebAPI或其他东西创建一个Windows服务,通过Web应用程序和Windows服务的HTTP(安全)通信,并让Windows服务与远程内容通信。工作流:WebApp>Windows服务>WMI远程>Windows服务>WebApp。还有一个优点:你可以很容易地替换Windows服务。我实现了一个托管在Windows服务中的ServiceStack服务。为服务添加了适当的凭据以便在其下运行,它就像一个符咒一样工作,我喜欢切换托管机制的能力。谢谢你,本!