我在SCOM PowerShell脚本中使用Invoke-WebRequest
来定期监视URI的可用性。我的脚本相当简单(因为我对PS的知识很少:-)):
$scomapi = new-object -comObject "MOM.ScriptAPI"
$scompb = $scomapi.CreatePropertyBag()
$fullHostName = "https://" + <full path to monitored web endpoint>
$result = Invoke-WebRequest $fullHostName
if($result.content) {
$scompb.AddValue("ConfigurationReachable",$true);
} else {
$scompb.AddValue("ConfigurationReachable",$false);
}
$scomapi.AddItem($scompb)
$scomapi.ReturnItems()
为了测试这个脚本,我在运行SCOM代理的客户端上的hosts
文件中进行了手动更改,我想要进行监视。有趣的是,即使在主机无法访问之后,脚本也会成功获取Web端点(通过从该计算机执行ping测试)。
我直接从命令行做了一些进一步的测试,没有任何改变。即使我没有ping远程地址,Invoke-WebRequest
仍然成功并获取网页。那么我在这里做错了什么?
答案 0 :(得分:4)
评论中的讨论问题是缓存;只有这不是被缓存的IP才是问题(至少不是唯一的问题);内容也被缓存;所以不是去网络服务器获取你的资源,而是系统的欺骗并在本地获取它。
您可以通过向-Headers @{"Cache-Control"="no-cache"}
添加invoke-webrequest
来阻止这种情况。
参见下面的示例测试脚本;尝试在主机文件调整之前和之后使用cache-control
标头运行。
cls
$urlHost = 'server.mydomain.com'
$endpointUrl = ("https://{0}/path/to/resource.jpg" -f $urlHost)
#can be set once at the start of the script
[System.Net.ServicePointManager]::DnsRefreshTimeout = 0
#I don't have Clear-DnsClientCache; but the below should do the same thing
#Should be called inside any loop before the invoke-webrequest to ensure
#flush your machine's local dns cache each time
ipconfig /flushdns
#prove that our hosts update worked:
#optional, but will help in debugging
Test-Connection $urlHost -Count 1 | select ipv4address
#ensure we don't have a remembered result if invoke-request is in a loop
$result = $null
#make the actual call
#NB: -headers parameter takes a value telling the system not to get anything
#from the cache, but rather to send the request back to the root source.
$result = Invoke-WebRequest $endpointUrl -Headers @{"Cache-Control"="no-cache"}
#output the result; 200 means all's good (google http status codes for info on other values)
("`nHTTP Status Code: {0}`n" -f $result.StatusCode)
#output actual result; optional, but may be useful to see what's being returned (e.g. is it your page/image, or a 404 page / something unexpected
$result
答案 1 :(得分:2)
我知道这是旧的,但以防万一这有助于某人:
我遇到了类似的问题,添加“-Disable KeepAlive”为我解决了这个问题。
答案 2 :(得分:1)
没有测试,我猜它是dns缓存。
powershell-session可能会在第一个请求中缓存ip并忽略你的hosts文件更新(只使用旧的工作ip)。
尝试在断开网络适配器/电缆连接之前和之后运行脚本,以模拟服务器故障。
更新:我上面要说的是,如果服务器不可用,脚本将完美运行,但使用hosts文件进行模拟会产生“误报”(所以忽略结果)。
如果您确实需要通过编辑hosts文件来测试脚本,请通过在脚本开头添加以下行来禁用会话中的.Net dns缓存:
[System.Net.ServicePointManager]::DnsRefreshTimeout = 0