Я использую нижеприведенный 51-строчный скрипт PowerShell, который отлично работает, когда веб-сайты используют анонимную аутентификацию, но дает ложный результат, когда им требуется аутентификация, даже на сайтах с единым входом, позволяющих вам войти, потому что скрипт сначала регистрирует HTTP 401 вместо повторной попытки и регистрации результата HTTP 200, потому что он просто переходит к следующему сайту в списке. Так как каждый веб-сайт с проверкой подлинности всегда сначала отправляет HTTP 401, мне нужно, чтобы скрипт приостанавливал одну секунду, давая клиенту время для автоматического получения учетных данных с сервера каталогов и передачи их обратно на веб-сайт, который выдаст HTTP 200 и выдаст отчет только результат HTTP 200, а не результат HTTP 401 с первой попытки. Поскольку в приведенном ниже сценарии уже есть логика цикла, циклически повторяющая список URL-адресов с помощью команды «foreach», я не знаю, как выполнить вложенный цикл, повторяя попытки сайтов, отвечающих на HTTP 401, во второй раз, чтобы попытаться получить HTTP правильный результат 200 для точного представления результатов того, что действительно происходит, когда внутренние пользователи получают доступ к сайтам с единой регистрацией.
## The URI list to test
$URLListFile = "C:\URLList.txt"
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue
$Result = @()
Foreach($Uri in $URLList) {
$time = try{
$request = $null
## Request the URI, and measure how long the response took.
$result1 = Measure-Command { $request = Invoke-WebRequest -Uri $uri }
$result1.TotalMilliseconds
}
catch
{
<# If the request generated an exception (i.e.: 500 server
error or 404 not found), we can pull the status code from the
Exception.Response property #>
$request = $_.Exception.Response
$time = -1
}
$result += [PSCustomObject] @{
Time = Get-Date;
Uri = $uri;
StatusCode = [int] $request.StatusCode;
StatusDescription = $request.StatusDescription;
ResponseLength = $request.RawContentLength;
TimeTaken = $time;
}
}
#Prepare email body in HTML format
if($result -ne $null)
{
$Outputreport = "<HTML><TITLE>Website Availability Report</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Availability Report </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B></TD><TD><B>StatusCode</B></TD><TD><B>StatusDescription</B></TD><TD><B>ResponseLength</B></TD><TD><B>TimeTaken</B></TD</TR>"
Foreach($Entry in $Result)
{
if($Entry.StatusCode -ne "200")
{
$Outputreport += "<TR bgcolor=red>"
}
else
{
$Outputreport += "<TR>"
}
$Outputreport += "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD><TD align=center>$($Entry.StatusDescription)</TD><TD align=center>$($Entry.ResponseLength)</TD><TD align=center>$($Entry.timetaken)</TD></TR>"
}
$Outputreport += "</Table></BODY></HTML>"
}
$Outputreport | out-file C:\Scripts\Test.htm
Invoke-Expression C:\Scripts\Test.htm