当我尝试使用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;
}
答案 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/