同盟伺服器 Proxy 上遺失了同盟被動網站應用程式

Microsoft.ActiveDirectoryFederationServices20.FederationServerProxyWebsitesIISVDirMonitor (UnitMonitor)

Knowledge Base article:

摘要

同盟伺服器 Proxy 上的 IIS 遺失了 AD FS 2.0 同盟被動網站應用程式。

原因

AD FS 2.0 同盟被動網站應用程式已遭刪除。

解決方式

新增 AD FS 2.0 同盟被動網站的 IIS 應用程式:

1. 在 %system root%\inetpub\ 下面,建立名為 adfs 的新資料夾。

2. 在 %system root%\inetpub\adfs\ 下面,建立名為 ls 的新資料夾。

3. 將 %system root%\Program Files\Active Directory Federation Services 2.0\WSFederationPassive.Web\ 下面的全部檔案複製到 %system root%\inetpub\adfs\ls\。

4. 在 IIS 管理員嵌入式管理單元中的 [應用程式集區] 下面,建立名為 ADFSAppPool 的新應用程式集區。確定這個應用程式集區在建立之後確實有啟動。

5. 在 IIS 上的 [預設網站] 下面,新增別名為 adfs 而實際路徑指向 %system root%\inetpub\adfs 的全新應用程式,以及選取做為 ADFSAppPool 的應用程式集區。

6. 在 adfs 應用程式下面,新增別名為 ls 而實際路徑指向 %system root%\inetpub\adfs\ls 的全新應用程式,以及選取做為 ADFSAppPool 的應用程式集區。

Element properties:

TargetMicrosoft.ActiveDirectoryFederationServices20.FederationServerProxyWebsites
Parent MonitorSystem.Health.AvailabilityState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityError
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.ActiveDirectoryFederationServices20.TwoStateScriptMonitorType
RemotableTrue
AccessibilityPublic
Alert Message
同盟伺服器 Proxy 上遺失了同盟被動網站應用程式
同盟伺服器 Proxy 上的 IIS 遺失了 AD FS 2.0 同盟被動網站應用程式。
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.ActiveDirectoryFederationServices20.FederationServerProxyWebsitesIISVDirMonitor" Accessibility="Public" Enabled="true" Target="Microsoft.ActiveDirectoryFederationServices20.FederationServerProxyWebsites" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Microsoft.ActiveDirectoryFederationServices20.TwoStateScriptMonitorType" ConfirmDelivery="false">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.ActiveDirectoryFederationServices20.FederationServerProxyWebsitesIISVDirMonitor_AlertMessageResourceID">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Success" MonitorTypeStateID="Success" HealthState="Success"/>
<OperationalState ID="Error" MonitorTypeStateID="Error" HealthState="Error"/>
</OperationalStates>
<Configuration>
<PowerShellPath>%windir%\system32\windowspowershell\v1.0\powershell.exe</PowerShellPath>
<ScriptName>FederationServerProxyWebsitesIISVDirCheck.ps1</ScriptName>
<ScriptBody><Script>
function GetNodeFromConfig($vDir, [string] $xpath, $nsmgr)
{
$config = ($vDir.path + "\web.config")
$cpNode = $null

if ([System.IO.File]::Exists($config))
{
[System.Xml.XmlDocument] $xd = new-object System.Xml.XmlDocument
$xd.load( $config )
$cpNode = $xd.SelectSingleNode($xpath,$nsmgr)
}
return $cpNode
}

function GetFedPassiveVDir()
{
$fpVDir = $null
$vDir = $vDirs | where {$_.name.EndsWith( "/adfs/ls" )}
if (-not(($vDir -eq $null)))
{
$fpVDir = $vDir
}
else
{
foreach ($vDir in $vDirs)
{
$temp = GetNodeFromConfig $vDir "configuration/microsoft.identityServer.web" $null
if (-not(($temp -eq $null)))
{
$fpVDir = $vDir
break;
}
}
}
return $fpVDir
}

$scomapi = new-object -comObject "MOM.ScriptAPI"
$scomapi.LogScriptEvent("ActiveDirectoryFederationServices", 900, 4, "IIS VDir check PowerShell monitoring script")

$script:vDirOK = $true
$script:vDirName = ""
#try
&amp;{

$vDirs = Get-WmiObject -namespace root/MicrosoftIISV2 -class IISWebVirtualDirSetting
$vDir = GetFedPassiveVDir

if ( $vDir -eq $null)
{
$script:vDirOK = $false
$script:vDirName = "/adfs/ls"
}
}
trap [System.Exception]
{
$scomapi.LogScriptEvent("ActiveDirectoryFederationServices", 901, 2, "IIS VDir check PowerShell monitoring script failed. " + $_.Exception.Message )
continue
}

$scompb = $scomapi.CreatePropertyBag()
$scompb.AddValue("VDirOK", $script:vDirOK )
$scompb.AddValue("VDir", $script:vDirName )
$scomapi.AddItem($scompb)
$scomapi.ReturnItems()

</Script></ScriptBody>
<IntervalSeconds>300</IntervalSeconds>
<TimeoutSeconds>180</TimeoutSeconds>
<ErrorExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='VDirOK']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">false</Value>
</ValueExpression>
</SimpleExpression>
</ErrorExpression>
<SuccessExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='VDirOK']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">true</Value>
</ValueExpression>
</SimpleExpression>
</SuccessExpression>
</Configuration>
</UnitMonitor>