FILE: C:\Windows\diagnostics\system\Networking\NetworkDiagnosticsVerify.ps1
--
# Copyright © 2008, Microsoft Corporation. All rights reserved.
PARAM($RootCauseID, $instanceID)
#include utility functions
. .\UtilityFunctions.ps1
Import-LocalizedData -BindingVariable localizationString -FileName LocalizationData
#execute validation only once, and don't execute if repair skipped
$validationCalled = $false
if($Global:ValidateResult -eq $null -and ($Global:RepairSkipped -eq $false))
{
$waitHandle = $Global:ndf.Validate($ValidateWaitTime);
if($waitHandle -eq $null)
{
throw "Validate call failed"
}
WaitWithProgress $localizationString.progress_Vaildating_NoDetails $waitHandle $Global:ndf
$Global:ValidateResult = $Global:ndf.ValidateResult
#add the trace log to the session
AddTraceFileToSession $Global:ndf $localizationString.TraceFileReportName "Verify"
$validationCalled = $true
}
else
{
if(!$Global:ValidateResult -eq $null)
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id ValidateSkipped -name "Validation Skipped" -description "Validation was already executed, NDF only has one validation per session." -verbosity Debug
}
elseif($Global:RepairSkipped)
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id ValidateSkipped -name "Validation Skipped" -description "Validation skipped because repair was skipped." -verbosity Debug
}
elseif($Global:ndf.SessionStatus -eq $NDF_STOP_STATUS_SUCCESSDIAG)
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id ValidateSkipped -name "Validation Skipped" -description "Validation skipped because a repair has not yet been executed. Marking root cause as not fixed." -verbosity Debug
Update-DiagRootCause -InstanceId $instanceID -ID $RootCauseID -Detected $true
return;
}
else
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id ValidateSkipped -name "Validation Skipped" -description "Validation skipped because an error ocurred during repair." -verbosity Debug
}
}
#get session status to make sure this isn't a repair failure scenario
$sessionStatus = $Global:ndf.SessionStatus;
#explicit validation failure
if(!($Global:ValidateResult -eq $null) -and !($Global:ValidateResult -eq $S_OK) -and ($sessionStatus -eq $NDF_STOP_STATUS_FAILEDVALIDATE))
{
$diagResult = $S_OK;
if(!$Global:ndfRerun)
{
"Rediagnosing within Verify stage because Validation failed" | convertto-xml | Update-DiagReport -id RediagnoseAfterValidate -name "Rediagnosing after Validate" -verbosity Debug
#if validation failed, we need to rediagnose at this point to fit within the model of the scripted troubleshooting platform
$Global:ndfRerun = new-object -comObject ndfapi.NetworkDiagnostics.1 -strict
$Global:ndfRerun.CreateIncident($Global:incidentData["HelperClassName"], $Global:incidentData["HelperAttributes"])
#execute diagnosis
$waitHandle = $Global:ndfRerun.Diagnose($DiagnoseWaitTime, 0)
if($waitHandle -eq $null)
{
throw "Diagnose call failed"
}
WaitWithProgress $localizationString.progress_Diagnosing_NoDetails $waitHandle $Global:ndf
$diagResult = $Global:ndfRerun.DiagnoseResult
if($diagResult -eq $S_OK)
{
#set the previous session so that we can pick it up if we re-diagnose
$Global:ndf.SetFollowUpSession($Global:ndfRerun);
#collect catch-all information for use when recovering the instance ID
$Global:rerunCatchAlls = @{}; #will contain the RC's with catch all repairs, indexed by HC it applies to
$Global:rerunCatchAllsAltRC = @{}; #will contain the alternate RC ID for the catch all, if available, indexed by root cause
GetCatchAllInformation ($Global:ndfRerun.RootCauses) ([ref]$Global:rerunCatchAlls) ($null) ([ref]$Global:rerunCatchAllsAltRC);
}
#add tracelog to report
AddTraceFileToSession $Global:ndfRerun $localizationString.TraceFileReportName "Diagnose"
}
else
{
$diagResult = $Global:ndfRerun.DiagnoseResult
}
if($diagResult -eq $S_OK)
{
#check whether the current verify RC is part of the new diagnosis session
#if so, we report the issue as not fixed, and we continue to attempt to fix the problem
#if not, we leave the RC as 'detected' by not calling back to the scripted platform, which will cause it to skip this root cause from this point on
$rootCause = $null
$newRootCauseEnum = $Global:ndfRerun.RootCauses
$rootCauseCount = $newRootCauseEnum.Count
$newRootCauseEnum.Reset()
for($i=0; $i -lt $rootCauseCount; $i++)
{
$curRootCause = $newRootCauseEnum.Next;
$newInstanceID = GetInstanceIDRC ($curRootCause) ($Global:rerunCatchAlls) ($Global:rerunCatchAllsAltRC)
#if the instance ID's match, we've found a match
if($newInstanceID -eq $instanceID)
{
$rootCause = $curRootCause
break;
}
}
if($rootCause)
{
#root cause is present in new diagnosis, if it isn't part of the list to skip then we should report it as not fixed
$skipReason = $Global:ndf.ShouldSkipRootCause($rootCause);
if($skipReason -eq $NDF_SKIPREASON_NONE)
{
#if RC was previously marked as "detected", make sure we don't reset it to "not fixed"
if($Global:RCInDetectedState -and $Global:RCInDetectedState[$instanceID])
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseDetected -name "Root Cause Detected" -description "Reporting that the Root Cause was detected. (Root Cause was found on re-diagnosis, and previously marked as detected)" -verbosity Debug
}
else
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseNotFixed -name "Root Cause Not Fixed" -description "Reporting that the Root Cause was not fixed. (validation failed and it was found on re-diagnosis)" -verbosity Debug
Update-DiagRootCause -InstanceId $instanceID -ID $RootCauseID -Detected $true
}
}
else
{
$skipText = GetSkipReasonText($skipReason)
$RootCauseID + " reported as Detected because it is skipped due to reason: " + $skipText | convertto-xml | Update-DiagReport -id VerificationRootCauseSkipped -name "Verification Root Cause Skipped" -verbosity Debug
$Global:RCInDetectedState += @{$instanceID=$true};
}
}
else
{
"ID:" + $RootCauseID + " reported as Detected because it was not found on re-diagnosis" | convertto-xml | Update-DiagReport -id VerificationRootCauseSkipped -name "Verification Root Cause Skipped" -verbosity Debug
}
}
}
#validation succeeded
elseif($Global:ValidateResult -eq $S_OK)
{
#only report fixed root cause as fixed, others are 'detected'
if($Global:LastRepairRCInstanceID -eq $instanceID)
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseFixed -name "Root Cause Fixed" -description "Reporting that the Root Cause was fixed. (validation succeeded)" -verbosity Debug
#for the root cause validated, if validation succeeded we say it's fixed. All others will be "detected"
Update-DiagRootCause -InstanceId $instanceID -ID $RootCauseID -Detected $false
}
else
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseDetected -name "Root Cause Detected" -description "Other Root Cause fixed, reporting that this Root Cause was detected." -verbosity Debug
}
}
#validation skipped
elseif($Global:RepairSkipped)
{
#the repair was either skipped, or was info only
if($Global:LastRepairRCInstanceID -eq $instanceID)
{
#for the repair shown, if skipped it should be failed, if HT/IO it should be detected
if($Global:HTorIO)
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseDetected -name "Root Cause Detected" -description "Reporting that the Root Cause was detected. (repair was info only/help topic)" -verbosity Debug
#remember that this RC was set to detected state to avoid resetting it to "not fixed" later
$Global:RCInDetectedState += @{$instanceID=$true};
}
else
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseNotFixed -name "Root Cause Not Fixed" -description "Reporting that the Root Cause was not fixed. (repair skipped)" -verbosity Debug
#validation failed, add the root cause, troubleshooting will rerun
Update-DiagRootCause -InstanceId $instanceID -ID $RootCauseID -Detected $true
}
}
else
{
#if RC was previously marked as "detected", make sure we don't reset it to "not fixed"
if($Global:RCInDetectedState -and $Global:RCInDetectedState[$instanceID])
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseDetected -name "Root Cause Detected" -description "Reporting that the Root Cause was detected. (Root Cause was previously marked as detected)" -verbosity Debug
}
else
{
#a repair was skipped, but not for this root cause, so we need to report it as not fixed to be sure it's addressed
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseNotFixed -name "Root Cause Not Fixed" -description "Reporting that the Root Cause was not fixed. (another repair was skipped or was info only/help topic)" -verbosity Debug
#validation failed, add the root cause, troubleshooting will rerun
Update-DiagRootCause -InstanceId $instanceID -ID $RootCauseID -Detected $true
}
}
}
elseif($sessionStatus -eq $NDF_STOP_STATUS_FAILEDREPAIR)
{
"ID:" + $RootCauseID + " InstanceId:" + $instanceID | convertto-xml | Update-DiagReport -id RootCauseNotFixed -name "Root Cause Not Fixed" -description "Reporting that the Root Cause was not fixed because last repair was a failure." -verbosity Debug
#An error occurred, report all as detected to continue resolving
Update-DiagRootCause -InstanceId $instanceID -ID $RootCauseID -Detected $true
}
--