1

Invoke-WebRequestSCOM PowerShell スクリプトで使用して、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()

このスクリプトをテストするためにhosts、監視対象の SCOM エージェントを実行しているクライアントのファイルを手動で変更しました。興味深いことに、ホストに到達できなくなった後でも、スクリプトは Web エンドポイントの取得に成功しています (そのマシンから ping を実行してテストしました)。

コマンドラインから直接さらにいくつかのテストを行いましたが、何も変わりません。リモート アドレスへの ping はありませんが、Invoke-WebRequestそれでも成功し、Web ページをフェッチします。それで、私はここで何が間違っていますか?

4

3 に答える 3

5

コメントでの議論によると、問題はキャッシュです。問題なのは、キャッシュされている IP だけではありません (少なくとも、唯一の問題ではありません)。コンテンツもキャッシュされています。そのため、Web サーバーにアクセスしてリソースを取得する代わりに、システムがごまかしてローカルで取得します。に追加することでこれを防ぐことができ-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
于 2015-06-11T18:06:04.317 に答える