我有一个运行“经典”ASP代码(而不是ASP.NET)的IIS 7.5网站,其中站点在正常的服务上下文中运行,只启用“Windows身份validation”。 用户和浏览网站没有任何问题,无论在IIS主机上是否具有隐式pipe理权限(大多数都不)。 但是,当我尝试在ASP代码中执行常见的Win32_PingStatus请求时,它将失败,除非用户在IIS主机上具有pipe理权限。 这是我的代码…
On Error Resume Next asset = "Computer123" pingtest = False query = "Select StatusCode, Address FROM Win32_PingStatus " & _ "WHERE Address=" & Chr(34) & asset & Chr(34) Set colPingStatus = GetObject("winmgmts:" &_ "{impersonationLevel=impersonate}//./root/cimv2").ExecQuery(query) If err.Number <> 0 Then Response.Write "Access Denied (error: " & err.Number & " / " & err.Description & ")" Response.End End If For Each objItem In colPingStatus If objItem.StatusCode = 0 Then pingtest = True End If Next If pingtest = False Then Response.Write asset & " is OFFLINE" Else Response.Write asset & " is ONLINE" End If
我一直试图让自己的头脑围绕着SWBEM和WMI模拟function,但是我仍然困惑于是否甚至有可能(支持或不支持)来执行此操作,无论用户/浏览器会话上下文如何。 每个用户都是一个域帐户,没有匿名用户能够访问该网站,所以它似乎(我可能是错误的)与他们在IIS主机上的组成员身份和权限有关。
首先是您的网站在IIS中的信任级别。 进入IIS,并确保它被设置为完整,以便您的站点可以访问内部服务器资源。
接下来要仔细检查访问该网站的用户是否真正被authentication,而不是匿名运行代码。 只是要确保在iis中禁用匿名身份validation,并且您的站点正在强制用户进行身份validation(在您的浏览器中禁用ntlm自动login或在您的应用程序中写入用户身份标识以双倍确保身份validation正在发生)。
接下来将检查访问您的网站的用户types的wmi权限。 您可以使用wmimgmt.msc打开您的服务器的wmi安全设置。 你可以通过用普通用户login你的服务器来testing你的wmi权限,并尝试执行wmi命令(你可以使用powershell的get-wmiobject,wbemtest.exe或者vbscript)。