我有一个运行“经典”ASP 代码(而非 ASP.NET)的 IIS 7.5 网站,该网站在正常服务上下文中运行,并且仅启用了“Windows 身份验证”。无论用户是否在 IIS 主机上具有隐式管理员权限(大多数用户没有),用户都可以毫无问题地浏览网站。但是,当我尝试在 ASP 代码中执行常见的 Win32_PingStatus 请求时,除非用户在 IIS 主机上具有管理员权限,否则它会失败。这是我的代码...
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 模拟功能,但我仍然感到困惑,无论用户/浏览器会话上下文如何,是否有可能(支持或不支持)执行此操作。每个用户都是一个域帐户,没有匿名用户能够访问该站点,因此似乎(我可能是错的)与他们在 IIS 主机上的组成员身份和权限有关。
答案1
首先是您的网站在 IIS 中的信任级别。进入 IIS 并确保将其设置为完全,以便您的网站可以访问内部服务器资源。
接下来要仔细检查访问网站的用户是否确实经过了身份验证,而不是匿名运行代码。为了确保匿名身份验证在 iis 中被禁用,并且你的网站强制用户进行身份验证(在浏览器中禁用 ntlm 自动登录或将用户标识部分写入你的应用程序以确保身份验证正在进行)。
接下来将检查访问您网站的用户类型的 wmi 权限。您可以使用 wmimgmt.msc 打开服务器的 wmi 安全设置。您可以通过以普通用户身份登录服务器并尝试执行 wmi 命令来测试您的 wmi 权限(您可以使用 powershell 的 get-wmiobject、wbemtest.exe 或 vbscript)。