Grazie a System.DirectoryServices è possibile curiosare anche nel metabase di IIS. Il provider da usare è “IIS“.
Per esempio, volendo enumerare i siti web di un certo Server (localhost nell'esempio) si procede in questo modo.
// Ottengo l'oggetto IIS Web Service
DirectoryEntry deWebSites = new DirectoryEntry("IIS://localhost/w3svc");
// enumero gli oggetti child
foreach(DirectoryEntry deSite in deWebSites.Children)
{
// sotto Web Service ci sono i web ma anche gli Application Pools, etc.
if(deSite.SchemaClassName != "IIsWebServer")
continue;
// prendo la collection ServerBindings che corrisponde al contenuto della
// dialog “Web site identification“ - Advanced
object[] oServerBindings = (object[])deSite.Invoke("Get", "ServerBindings");
// enumero gli oggetti
foreach(object oBinding in oServerBindings)
{
// ciascuno di questi oggetti è una stringa con tutti i valori separati da ':'
// usando String.Split si separano le varie stringhe
string strBinding = oBinding as string;
Console.WriteLine(strBinding);
}
}
Per chi fosse affezionato alle vecchie ADSI, è sempre possibile usare l'oggetto COM ActiveDs.
L'accortezza è quella di usare Marshal.BindToMoniker per accedere all'oggetto Adsi di cui evidentemente non avrebbe senso farne una “new“.
ActiveDs.IADs deWebSites = (ActiveDs.IADs)Marshal.BindToMoniker("IIS://localhost/w3svc");
Il resto poi è del tutto analogo.
Info Aggiuntive:
Le info riportate da questo codice sono quelle presenti nella dialog di IIS. Nel default web site IIS non compila i vari campi della dialog e quindi queste informazioni non sono disponibili. Sta a noi 'dedurle' ma nel metabase di IIS non sono scritte.
Nelle web farm io suggerisco sempre:
1. lasciare inutilizzato il sito di default in modo che chi tenta di attaccare un sito web partendo dall'indirizzo IP finisca su questo finto sito.
2. di compilarle queste informazioni ad ogni creazione di sito in modo da amministrare più facilmente i siti.