Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Script-basierte IIS Administration

Geschrieben von: Christoph Wille
Kategorie: Server

This printed page brought to you by AlphaSierraPapa

Daß man den IIS mit dem Internet Services Manager administrieren kann, dürfte jedem bekannt sein. Daß man allerdings die Administration auch mit Hilfe von ASP oder WSH Scripts bewerkstelligen kann - ohne funktionale Abstriche machen zu müssen - das wissen nur wenige.

Wie funktioniert der Skriptzugriff auf die IIS Administration? Nun, dazu hole ich etwas aus. Heute sollte jedem das Active Directory (AD) von Windows 2000 bereits ein Begriff sein - es dient der Verwaltung von Objekten (Benutzer, Drucker, etc) in einem Netzwerk. Um es einfach programmierbar zu machen, existiert das sogenannte Active Directory Services Interface, kurz ADSI. Im Falle des C++ Programmierers sieht das (für den VB Programmierer) grausam aus, allerdings gibt es "high-level" Schnittstellen, die für VB/VBScript Programmierer gedacht sind. Damit erhält man Zutritt zur vollständigen Administration des AD's und der dort gespeicherten Objekte.

Was hat dieser Ausflug in das Active Directory mit der Administration von IIS zu tun? Nun, die Besitzer des NT 4 Option Packs waren die "Beta Tester" für so ziemlich alles, was dann in Windows 2000 zur Reife gelangt ist: Transaction Server, Message Queue Server, Certificate Server und eben auch die ADSI Programmierschnittstelle - denn diese erlaubt nicht nur den Zugriff auf den AD Provider, sondern auch andere Provider die die ADSI Schnittstelle implementieren. Und man darf raten - IIS implementiert diese seit der Version 4.

Alle Objekte für die Administration des IIS werden unter dem Begriff IISAO - IIS Administration Objects - zusammengefasst. Diese bilden eine Hierarchie, und das folgende Flowchart zeigt die Hierarchie für eine Web Site plus eine FTP Site:

Der Text in den Boxen entspricht dem Namen der Objektinstanz, der Objekttyp steht jeweils rechts daneben. Angesprochen werden die jeweiligen Elemente mit einer dem HTTP Protokoll ähnlichen Syntax:

IIS://computername/W3SVC/1/Root

Diese "URL" liefert mir ein Objekt des Typs IisWebVirtualDir, und zwar das Rootverzeichnis meiner ersten Website (wie man zum Namen kommt, dazu später). Ein einfaches und wirkungsvolles Tool, um sich diese Hierarchie ohne tolles User Interface anzusehen ist der Metabase Editor aus dem Windows 2000 Resource Kit:

Wo werden diese Informationen ausgelesen, beziehungsweise gespeichert? Erraten, dafür ist die Metabase zuständig - diese hält sämtliche IIS-relevanten Konfigurationsinformationen. Für den IIS 5 ist das Speicherformat binär, das kann sich aber in zukünftigen Versionen durchwegs ändern.

Hervorragend - wir hätten geklärt wo die Konfiguration gespeichert wird (Metabase), mit welcher Programmierschnittstelle man diese angreift (ADSI), und wie man die Informationen adressiert (IIS:// Syntax).

Nun kommen wir aber zum ersten Hands-on Beispiel des heutigen Artikels: listsites.asp. Wie der Name schon impliziert, liefert mir der Code eine Liste aller Web Sites, die auf meinem Server laufen:

<%
Set theService = GetObject("IIS://localhost/W3SVC")

For Each theServer in theService
  If (theServer.Class = "IIsWebServer") Then
     Response.Write "<i>Server</i>: <a href=""dumpsite.asp?AdsPath="
     Response.Write Server.UrlEncode(theServer.ADsPath) & """>"
     Response.Write theServer.ServerComment & "</a>"
     Response.Write "  <i>ADS Pfad</i>: " & theServer.ADsPath & "<BR>"
  End If
Next
%>

Wer jetzt zu gierig war, und das sofort ausprobiert hat, ist wahrscheinlich in folgenden Fehler hineingelaufen:

Microsoft VBScript runtime error '800a0046' 
Permission denied: 'GetObject' 
/aspheute/adsi/sonicht.asp, line 2 

Der Grund hierfür ist, daß NT klarerweise die Sicherheitseinstellungen honoriert, und nur Siteadministratoren (üblicherweise das lokale Administratorenkonto) an diese Daten heranlassen möchte. Daher müssen wir das Skript absichern, sodaß nur noch die entsprechenden User darauf Zugriff haben:

Und jetzt funktioniert es auch so wie gewünscht, und wir bekommen eine Liste aller konfigurierten Websites:

Ich habe mir erlaubt, einen kleinen Hyperlink zu legen - und zwar auf dumpsite.asp, welches mir alle Verzeichnisse der Website auflistet. Auch dieses verwendet wieder GetObject um an das ADS zu binden, und liest dann die Informationen aus den benötigten Serviceobjekten aus:

<%
strAdsPath = Request.QueryString("AdsPath")
Set theServer = GetObject(strAdsPath)
strSiteDescription = theServer.ServerComment
%>
<HTML>
<HEAD>
<TITLE>IISAO hierarchy for <%=strSiteDescription%></TITLE>
</HEAD>
<BODY>

<PRE>
<%
Level = 0      ' start level is zero

PrintChildren(theServer)

Sub PrintChildren(ParentObj)
  For Each Child in ParentObj
    Level = Level + 1
    Response.Write Space(2*Level) & Child.Name & "<BR>"
    PrintChildren(Child)
  Next
  Level = Level - 1
End Sub
%>
</PRE>

</BODY>
</HTML>

Die Kindobjekte des Rootverzeichnisses werden rekursiv aufgelistet. Und da ich es mir (wie immer) einfach gemacht habe, mache ich die Einrückungen der Hierarchieebenen mit Hilfe von Leerzeichen. Das sieht dann so aus:

Wenn man sich den Internet Services Manager ansieht, dann fehlen uns hier eigentlich nur noch die bunten Icons:

Wer sich später die Zeit nimmt, die IISAO Dokumentation genauer zu lesen wird feststellen daß alle Einstellungen aus der ISM in IISAO zu finden sind - und das mit gutem Grund: die ISM verwendet ebenso ADS (die C++ Variante), um die Konfiguration durchzuführen. Die ISM bietet als "Zusatz" eine nette Oberfläche.

Da ISM auch auf IISAO aufbaut ist es klar, daß man zB per Skript auch Verzeichnisse anlegen kann. Der Beweis ist das folgende createvdir.asp.

<%
Set root = GetObject("IIS://localhost/W3SVC/2/Root")
Set newVDir = root.Create("IIsWebVirtualDir","ScriptCreatedDir")
newVDir.Path = "f:\inetpub\adsi"
newVDir.EnableDirBrowsing = True
newVDir.AccessScript = True
newVDir.AccessRead = False
newVDir.SetInfo
%>

Obwohl alle Eigenschaften selbstbeschreibend sind, möchte ich auf die Methode SetInfo eingehen. Wenn man diese nicht aufruft, werden sämtliche Änderungen nicht durchgeführt! Der Grund hierfür ist eine Geschwindigkeitsoptimierung, um viele kleine Eigenschaftsänderungen "auf einen Rutsch" in die Metabase zu committen - und genau das macht SetInfo.

Zum Beweis, daß mein Script auch funktioniert hat, hier ein abschließender Screenshot der ISM.

Schlußbemerkung

Wir haben heute nur einen kleinen Ausschnitt aus den IISAO und seinen Eigenschaften und Methoden betrachtet. Gerade für ISPs mit sich wiederholenden Konfigurationsaufgaben ist die Scriptingfähigkeit der Administration ein Geschenk aus Redmond.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010504.zip

Verwandte Artikel

Den Webserver umsiedeln (IIS 4 oder 5)
http:/www.aspheute.com/artikel/20020729.htm
IIS, was machst du gerade?
http:/www.aspheute.com/artikel/20011204.htm
Virtuelle Verzeichnisse umbenennen
http:/www.aspheute.com/artikel/20030911.htm

Links zu anderen Sites

IISAO Dokumentation
http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/iisref/aore94th.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.