服务器无法访问后,Invoke-WebRequest正在工作

时间:2013-09-01 08:05:05

标签: powershell monitoring scom

我在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仍然成功并获取网页。那么我在这里做错了什么?

3 个答案:

答案 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