Verarbeiten von Modelleinstellungen für einen Anwendungspool <processModel>
Übersicht
Mithilfe des Elements <processModel>
können Sie viele der Sicherheits-, Leistungs-, Integritäts- und Zuverlässigkeitsfeatures von Anwendungspools in IIS 7 und höher konfigurieren. Es bietet folgende Features:
- Anwendungspoolidentität, die der Name des Diensts oder Benutzerkontos ist, unter dem der Arbeitsprozess des Anwendungspools ausgeführt wird. Dies wird durch das Attribut identityType definiert. Standardmäßig wird ab IIS 7.5 ein Anwendungspool unter dem integrierten Konto ApplicationPoolIdentity ausgeführt, das dynamisch vom Windows-Prozessaktivierungsdienst (WAS) erstellt wird. (In IIS 7.0 war die Standardidentität das Konto NetworkService.) Sie können den Attributwert identityType in das integrierte Konto NetworkService, das Konto LocalService, das integrierte Konto LocalSystem oder ein benutzerdefiniertes Konto ändern, das Sie erstellen. Wenn Sie ein benutzerdefiniertes Konto auswählen, definieren Sie die Kontoanmeldeinformationen mithilfe der Attribute userName und password. Beachten Sie jedoch, dass die Konten NetworkService,LocalService und LocalSystem mehr Benutzerrechte haben als das Konto ApplicationPoolIdentity. (Warnung: Es ist ein schwerwiegendes Sicherheitsrisiko, einen Anwendungspool mit allgemeinen Benutzerrechten auszuführen.) Darüber hinaus können Sie das Attribut logonType verwenden, um anzugeben, ob sich die Prozessidentität als Batchbenutzer oder -dienst anmelden soll. (Weitere Informationen zu Anmeldetypen finden Sie im Artikel zur Funktion LogonUser.)
- Web-Gardening and Verwendung von Hardware mit nicht einheitlichem Speicherzugriff (Non-Uniform Memory Access, NUMA), können Sie über das Festlegen des Attributs maxProcesses konfigurieren. Informationen zum Web-Gardening finden Sie unter maxProcesses mit einem Wert größer als eins. Legen Sie für die Verwendung von NUMA-Hardware maxProcesses auf einen Wert von "0" fest, um anzugeben, dass IIS dieselbe Anzahl von Arbeitsprozessen ausführt wie NUMA-Knoten vorhanden sind.
- Timeout-Einstellungen im Leerlauf, mit denen Sie festlegen können, wie lange ein Arbeitsprozess im Leerlauf bleibt, bevor er heruntergefahren wird. Bearbeiten Sie das Attribut idleTimeout, um diese Einstellung zu konfigurieren.
- Systemüberwachung durch Aktivieren von Pings gegen den Arbeitsprozess, die maximale Zeit, die es einem Arbeitsprozess ermöglicht, auf einen Ping zu reagieren, und die Häufigkeit von Pings, die an einen Arbeitsprozess gesendet werden, um seine Integrität zu überwachen. Bearbeiten Sie die Attribute pingingEnabled, pingInterval und pingResponseTime, um diese Einstellungen zu konfigurieren.
- Herunterfahren des Arbeitsprozesses und Startzeitlimits. Der erste Grenzwert wird durch das Attribut shutdownTimeLimit festgelegt und bestimmt das Intervall, das IIS 7 und höher einem Arbeitsprozess zum Abschließen aller Anforderungen erteilt, bevor der WWW-Dienst den Arbeitsprozess beendet. Der zweite Grenzwert wird durch das Attribut startupTimeLimit festgelegt und gibt die Zeitspanne an, in IIS 7 und höher ein Anwendungspool gestartet werden kann.
Kompatibilität
Version | Hinweise |
---|---|
IIS 10.0 | Das <processModel> Element wurde in IIS 10.0 nicht geändert. |
IIS 8.5 | Das Attribut idleTimeoutAction wurde hinzugefügt, um einen Arbeitsprozess zu aktivieren, der für die Dauer des Attributs idleTimeout leer ist, das entweder beendet oder angehalten wird, nicht nur beendet. |
IIS 8.0 | Das Attribut setProfileEnvironment wurde hinzugefügt, sodass die Umgebung basierend auf dem Benutzerprofil für einen neuen Prozess festgelegt werden kann. Werte wurden für das Attribut maxProcesses hinzugefügt, einschließlich der Unterstützung für den nicht einheitlichen Speicherzugriff (NUMA). Das Attribut logEventOnProcessModel wurde hinzugefügt, um die im Prozess ausgeführte Aktion anzugeben. |
IIS 7.5 | Das Element <processModel> des Elements <add> wurde in IIS 7.5 aktualisiert, um Einstellungen einzuschließen, mit denen Sie Anwendungen mit der neuen ApplicationPoolIdentity ausführen und den Anmeldetyp für die Prozessidentität angeben können. |
IIS 7.0 | Das <processModel> Element wurde in IIS 7.0 eingeführt. |
IIS 6.0 | Das Element <processModel> ersetzt einige der Einstellungen im IIS 6.0-Metabasisobjekt IIsApplicationPools. |
Setup
Die Auflistung <applicationPools>
ist in der Standardinstallation von IIS 7 und höher enthalten.
Gewusst wie
So bearbeiten Sie Prozessmodellkonfigurationseinstellungen
Öffnen Sie den Internet Information Services (IIS) Manager:
Wenn Sie Windows Server 2012 oder Windows Server 2012 R2 verwenden:
- Klicken Sie in der Taskleiste auf Server-Manager dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
Wenn Sie Windows 8 oder Windows 8.1 verwenden:
- Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf "Systemsteuerung".
- Klicken Sie auf Verwaltungund doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
Wenn Sie Windows Server 2008 oder Windows Server 2008 R2 verwenden:
- Klicken Sie auf der Taskleiste auf Start, zeigen Sie auf Verwaltungund dann auf den Internet Information Services (IIS) Manager.
Wenn Sie Windows Vista oder Windows 7 verwenden:
- Klicken Sie auf der Taskleiste auf "Start" und dann auf "Systemsteuerung".
- Doppelklicken Sie auf Verwaltungund doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
Erweitern Sie im Bereich Verbindungen den Servernamen, klicken Sie auf Anwendungspools, und klicken Sie auf den Anwendungspool, den Sie bearbeiten möchten.
Klicken Sie im Bereich Aktionen auf Erweiterte Einstellungen...
Klicken Sie im Dialogfeld Erweiterte Einstellungen auf die Prozessmodelleigenschaft, die Sie bearbeiten möchten, und bearbeiten Sie sie dann im Eigenschaftenwertabschnitt des Dialogfelds, und klicken Sie dann auf OK. Ändern Sie z. B. das Zeitlimit für das Herunterfahren (Sekunden) und die Startzeitlimits (Sekunden) auf 30.
Konfigurieren von IIS für die Verwendung mit nicht einheitlicher Speicherzugriff (NUMA)-Hardware
Öffnen Sie den Internet Information Services (IIS) Manager:
Vorgehensweise unter Windows Server 2012 oder höher:
- Klicken Sie in der Taskleiste auf Server-Manager dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
Vorgehensweise unter Windows 8 oder höher:
- Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf "Systemsteuerung".
- Klicken Sie auf Verwaltungund doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
Erweitern Sie im Bereich Verbindungen den Servernamen, und klicken Sie anschließend auf Anwendungspools.
Wählen Sie im Bereich Anwendungspools den Pool aus, den Sie für NUMA konfigurieren möchten.
Wählen Sie im Bereich Aktion die Option Erweiterte Einstellungen aus.
Legen Sie unter dem Bereich ProzessmodellMaximale Arbeitsprozesse auf
0
fest.
So konfigurieren Sie die Aktion zum Leerlauf-Timeout
Öffnen Sie den Internet Information Services (IIS) Manager:
Wenn Sie Windows Server 2012 R2 verwenden:
- Klicken Sie in der Taskleiste auf Server-Manager dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
Vorgehensweise unter Windows 8.1:
- Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf "Systemsteuerung".
- Klicken Sie auf Verwaltungund doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
Doppelklicken Sie im Bereich Verbindungen auf den Servernamen, doppelklicken Sie auf Anwendungspools, und wählen Sie dann den zu konfigurierenden Anwendungspool aus.
Klicken Sie im Bereich Aktionen auf Erweiterte Einstellungen.
Wählen Sie im Abschnitt Prozessmodell des Dialogfelds Erweiterte Einstellungen für idleTimeoutAction die Option Beenden oder Anhalten aus.
Klicken Sie auf OK.
Konfiguration
Sie konfigurieren das <processModel>
-Element auf Serverebene in der Datei ApplicationHost.config.
Attribute
Attribut | Beschreibung | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
identityType |
Optionales Enumerationsattribut. Gibt die Kontoidentität an, unter der der Anwendungspool ausgeführt wird. Hinweis: Ab IIS 7.5 ist der Standardwert ApplicationPoolIdentity. (In IIS 7.0 war der Standardwert NetworkService .)Das Attribut identityType kann einer der folgenden möglichen Werte sein. Der Standardwert ist NetworkService .
|
||||||||||||
idleTimeout |
Optionales timeSpan-Attribut. Gibt an, wie lange (in Minuten) ein Arbeitsprozess im Leerlauf ausgeführt werden soll, wenn keine neuen Anforderungen empfangen werden und der Arbeitsprozess keine Anforderungen verarbeitet. Nach Ablauf der zugewiesenen Zeit sollte der Arbeitsprozess anfordern, dass er vom WWW-Dienst heruntergefahren wird. Der Standardwert ist 00:20:00 . Um das Feature zur Leerlaufzeitüberschreitung zu deaktivieren, setzen Sie diesen Wert auf 00:00:00 . |
||||||||||||
idleTimeoutAction |
Optionales Enumerationsattribut. Gibt die auszuführende Aktion an, wenn die Leerlaufzeitüberschreitung erreicht wurde. Vor IIS 8.5 würde ein Arbeitsprozess, der für die Dauer des Attributs idleTimeout im Leerlauf war, beendet. Nach IIS 8.5 haben Sie die Wahl, einen Arbeitsprozess zu beenden, der den Grenzwert idleTimeout erreicht, oder anzuhalten, indem Sie ihn vom Arbeitsspeicher auf den Datenträger verschieben. Das Anhalten eines Prozesses dauert wahrscheinlich kürzer und verbraucht weniger Arbeitsspeicher als das Beenden.Sie können eine Aktion zur Leerlaufzeitüberschreitung des Anhaltens mit der gefälschten Anforderung der Anwendungsinitialisierung konfigurieren (siehe applicationInitialization .Das Attribut idleTimeoutAction kann die folgenden möglichen Werte aufweisen. Der Standardwert ist Terminate .
|
||||||||||||
loadUserProfile |
Optionales boolesches Attribut. Gibt an, ob IIS das Benutzerprofil für die Anwendungspoolidentität lädt. Das Festlegen dieses Werts auf false bewirkt, dass IIS auf das IIS 6.0-Verhalten zurückgesetzt wird. IIS 6.0 lädt das Benutzerprofil nicht für eine Anwendungspoolidentität. Der Standardwert ist false . |
||||||||||||
logEventOnProcessModel |
Optionales flags-Attribut. Gibt an, welche Aktion im Prozess bei der Ereignisanzeige protokolliert wird. In IIS 8.0 ist die einzige Aktion, die angewendet wird, die Aktion zur Leerlaufzeitüberwachung, in der der Prozess beendet wird, da er für den Zeitraum des idleTimeout-Zeitraums leer war. Der Flagname ist gleich IdleTimeout . Der Wert lautet 1 .Der Standardwert ist IdleTimeout . |
||||||||||||
logonType |
Optionales Enumerationsattribut. Gibt den Anmeldetyp für die Prozessidentität an. (Weitere Informationen zu Anmeldetypen finden Sie im Artikel zur Funktion LogonUser.) Hinweis: Dieses Attribut wurde in IIS 7.5 eingeführt. Das Attribut logonType kann einer der folgenden möglichen Werte sein; der Standardwert ist LogonBatch .
|
||||||||||||
manualGroupMembership |
Optionales boolesches Attribut. Gibt an, ob die IIS_IUSRS Gruppensicherheits-ID (SID) dem Arbeitsprozesstoken hinzugefügt wird. Wenn false, verwendet IIS automatisch eine Anwendungspoolidentität, als wäre sie Mitglied der integrierten IIS_IUSRS Gruppe, die Zugriff auf erforderliche Datei- und Systemressourcen hat. Wenn true, muss eine Anwendungspoolidentität explizit allen Ressourcen hinzugefügt werden, die ein Arbeitsprozess zur Laufzeit benötigt. Der Standardwert ist false . |
||||||||||||
maxProcesses |
Optionales Uint-Attribut. Gibt die maximale Anzahl von Arbeitsprozessen an, die für den Anwendungspool verwendet würden.
1 . |
||||||||||||
password |
Optionales Zeichenfolgeattribut. Gibt das Kennwort an, das dem Attribut userName zugeordnet ist. Dieses Attribut ist nur erforderlich, wenn der Wert von identityTypeSpecificUser ist. Hinweis: Um nicht verschlüsselte Kennwortzeichenfolgen in Konfigurationsdateien zu speichern, verwenden Sie immer AppCmd.exe oder den IIS-Manager, um Kennwörter einzugeben. Wenn Sie diese Verwaltungstools verwenden, werden die Kennwortzeichenfolgen automatisch verschlüsselt, bevor sie in die XML-Konfigurationsdateien geschrieben werden. Dies bietet eine bessere Kennwortsicherheit als das Speichern unverschlüsselter Kennwörter. |
||||||||||||
pingingEnabled |
Optionales boolesches Attribut. Gibt an, ob Ping für den Arbeitsprozess aktiviert ist. Der Standardwert ist true . |
||||||||||||
pingInterval |
Optionales timeSpan-Attribut. Gibt die Zeit zwischen Pings zur Integritätsüberwachung an, die der WWW-Dienst an einen Arbeitsprozess sendet. Der Standardwert ist 00:00:30 (30 Sekunden). |
||||||||||||
pingResponseTime |
Optionales timeSpan-Attribut. Gibt die Zeit an, zu der ein Arbeitsprozess erhält, um auf einen Ping für die Integritätsüberwachung zu reagieren. Nachdem das Zeitlimit überschritten wurde, beendet der WWW-Dienst den Arbeitsprozess. Der Standardwert ist 00:01:30 (1 Minute 30 Sekunden). |
||||||||||||
requestQueueDelegatorIdentity |
Optionales String -Attribut. Gibt die Kontoidentität an, die über die Berechtigung zum Delegieren von HTTP-Anforderungen an den Anwendungspool verfügt. Hinweis: Dieses Attribut ist in der IIS-Manager-Benutzeroberfläche (Internet Information Services) nicht verfügbar. |
||||||||||||
setProfileEnvironment |
Optionales boolesches Attribut. Wenn setProfileEnvironment auf True festgelegt ist, erstellt WAS beim Erstellen eines Arbeitsprozesses einen Umgebungsblock, der an CreateProcessAsUser übergeben werden soll. Dadurch wird sichergestellt, dass die Umgebung basierend auf dem Benutzerprofil für den neuen Prozess festgelegt wird.Der Standardwert ist True . |
||||||||||||
shutdownTimeLimit |
Optionales timeSpan-Attribut. Gibt die Zeit an, die der W3SVC-Dienst wartet, nachdem er eine Wiederverwendung initiiert hat. Wenn der Arbeitsprozess nicht innerhalb des shutdownTimeLimit heruntergefahren wird, wird er vom W3SVC-Dienst beendet. Der Standardwert ist 00:01:30 (1 Minute 30 Sekunden). |
||||||||||||
startupTimeLimit |
Optionales timeSpan-Attribut. Gibt die Zeit an, zu der IIS auf den Start eines Anwendungspools wartet. Wenn der Anwendungspool nicht innerhalb von startupTimeLimit gestartet wird, wird der Arbeitsprozess beendet, und die Anzahl des schnellen Fail-Schutzes wird erhöht. Der Standardwert ist 00:01:30 (1 Minute 30 Sekunden). |
||||||||||||
userName |
Optionales Zeichenfolgeattribut. Gibt die Identität an, unter der der Anwendungspool ausgeführt wird, wenn der identityTypeSpecificUser ist. |
Untergeordnete Elemente
Keine.
Konfigurationsbeispiel
Im folgenden Konfigurationsbeispiel wird das Anwendungspoolelement <add>
verwendet, um einen neuen Anwendungspool namens Contoso zu erstellen. Das Element <recycling>
konfiguriert die Protokollierung für den Neustart des Anwendungspools, das Element <periodicRestart>
konfiguriert, wann der Anwendungspool neu gestartet wird, und das Element <processModel>
konfiguriert die Attribute shutdownTimeLimit und startupTimeLimit für das Herunterfahren und Starten der Arbeitsprozesse im Anwendungspool für jeweils 30 Sekunden. Wenn diese Zeitlimits überschritten werden, beendet IIS den Arbeitsprozess.
<add name="Contoso">
<recycling logEventOnRecycle="Schedule">
<periodicRestart>
<schedule>
<clear />
<add value="03:00:00" />
</schedule>
</periodicRestart>
</recycling>
<processModel identityType="NetworkService" shutdownTimeLimit="00:00:30" startupTimeLimit="00:00:30" />
</add>
Beispielcode
In den folgenden Beispielen werden die Werte der Eigenschaftswerte processModel.shutdownTimeLimit und processModule.startupTimeLimit jeweils auf 30 Sekunden für einen Anwendungspool namens Contoso geändert.
AppCmd.exe
appcmd.exe set apppool "Contoso" /processModel.shutdownTimeLimit:00:00:30
appcmd.exe set apppool "Contoso" /processModel.startupTimeLimit:00:00:30
Sie können auch die folgende Syntax verwenden:
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='Contoso'].processModel.shutdownTimeLimit:"00:00:30" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='Contoso'].processModel.startupTimeLimit:"00:00:30" /commit:apphost
Hinweis
Sie müssen unbedingt den Commitparameterapphost
festlegen, wenn Sie AppCmd.exe verwenden, um diese Einstellungen zu konfigurieren. Dadurch werden die Konfigurationseinstellungen auf den entsprechenden Speicherortabschnitt in der Datei ApplicationHost.config festgelegt.
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection applicationPoolsSection = config.GetSection("system.applicationHost/applicationPools");
ConfigurationElementCollection applicationPoolsCollection = applicationPoolsSection.GetCollection();
ConfigurationElement addElement = FindElement(applicationPoolsCollection, "add", "name", @"Contoso");
if (addElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement processModelElement = addElement.GetChildElement("processModel");
processModelElement["shutdownTimeLimit"] = TimeSpan.Parse("00:00:30");
processModelElement["startupTimeLimit"] = TimeSpan.Parse("00:00:30");
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim applicationPoolsSection As ConfigurationSection = config.GetSection("system.applicationHost/applicationPools")
Dim applicationPoolsCollection As ConfigurationElementCollection = applicationPoolsSection.GetCollection
Dim addElement As ConfigurationElement = FindElement(applicationPoolsCollection, "add", "name", "Contoso")
If (addElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim processModelElement As ConfigurationElement = addElement.GetChildElement("processModel")
processModelElement("shutdownTimeLimit") = TimeSpan.Parse("00:00:30")
processModelElement("startupTimeLimit") = TimeSpan.Parse("00:00:30")
serverManager.CommitChanges()
End Sub
Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
For Each element As ConfigurationElement In collection
If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
Dim matches As Boolean = True
Dim i As Integer
For i = 0 To keyValues.Length - 1 Step 2
Dim o As Object = element.GetAttributeValue(keyValues(i))
Dim value As String = Nothing
If (Not (o) Is Nothing) Then
value = o.ToString
End If
If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
matches = False
Exit For
End If
Next
If matches Then
Return element
End If
End If
Next
Return Nothing
End Function
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST");
var applicationPoolsCollection = applicationPoolsSection.Collection;
var addElementPos = FindElement(applicationPoolsCollection, "add", ["name", "Contoso"]);
if (addElementPos == -1) throw "Element not found!";
var addElement = applicationPoolsCollection.Item(addElementPos);
var processModelElement = addElement.ChildElements.Item("processModel");
processModelElement.Properties.Item("shutdownTimeLimit").Value = "00:00:30";
processModelElement.Properties.Item("startupTimeLimit").Value = "00:00:30";
adminManager.CommitChanges();
function FindElement(collection, elementTagName, valuesToMatch) {
for (var i = 0; i < collection.Count; i++) {
var element = collection.Item(i);
if (element.Name == elementTagName) {
var matches = true;
for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
var property = element.GetPropertyByName(valuesToMatch[iVal]);
var value = property.Value;
if (value != null) {
value = value.toString();
}
if (value != valuesToMatch[iVal + 1]) {
matches = false;
break;
}
}
if (matches) {
return i;
}
}
}
return -1;
}
VBScript
Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST")
Set applicationPoolsCollection = applicationPoolsSection.Collection
addElementPos = FindElement(applicationPoolsCollection, "add", Array("name", "Contoso"))
If siteElementPos = -1 Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set addElement = applicationPoolsCollection.Item(addElementPos)
Set processModelElement = addElement.ChildElements.Item("processModel")
processModelElement.Properties.Item("shutdownTimeLimit").Value = "00:00:30"
processModelElement.Properties.Item("startupTimeLimit").Value = "00:00:30"
adminManager.CommitChanges()
Function FindElement(collection, elementTagName, valuesToMatch)
For i = 0 To CInt(collection.Count) - 1
Set element = collection.Item(i)
If element.Name = elementTagName Then
matches = True
For iVal = 0 To UBound(valuesToMatch) Step 2
Set property = element.GetPropertyByName(valuesToMatch(iVal))
value = property.Value
If Not IsNull(value) Then
value = CStr(value)
End If
If Not value = CStr(valuesToMatch(iVal + 1)) Then
matches = False
Exit For
End If
Next
If matches Then
Exit For
End If
End If
Next
If matches Then
FindElement = i
Else
FindElement = -1
End If
End Function