Как получить имя пула приложений для конкретного веб-сайта IIS6 программно? C # - PullRequest
4 голосов
/ 04 февраля 2009

как получить имя пула приложений для определенного веб-сайта IIS 6 программно с использованием C #

EDIT: Я уже использовал методы пространства имен DirectoryServices, но имя пула приложений не получается правильно, если оно не было явно установлено с использованием того же кода. Это означает, что если вы добавите веб-сайт вручную с помощью диспетчера iis и установите пул приложений, эти коды больше не будут работать (он всегда будет возвращать DefaultAppPool), когда я создаю приложение с помощью sharepoint и устанавливаю другой appPool, эти методы не работают.

Ответы [ 3 ]

7 голосов
/ 19 ноября 2009

Я не согласен с вами. Я запрограммировал тестовое приложение и получил правильное имя AppPool, даже если я установил AppPool вручную с помощью IIS Manager.

Чтобы убедиться, что я проверил один раз, имя имя было в порядке; затем я запускаю диспетчер IIS, меняю AppPool, выполняю iisreset и снова запускаю тестовое приложение - полученное имя AppPool снова было правильным. Я не понимаю, как выглядел твой код, но мой выглядит так:

using System;
using System.IO;
using System.DirectoryServices;

class Class
{
    static void Main(string[] args)
    {
        DirectoryEntry entry = FindVirtualDirectory("<Server>", "Default Web Site", "<WantedVirtualDir>");
        if (entry != null)
        {
            Console.WriteLine(entry.Properties["AppPoolId"].Value);
        }
    }

    static DirectoryEntry FindVirtualDirectory(string server, string website, string virtualdir)
    {
        DirectoryEntry siteEntry = null;
        DirectoryEntry rootEntry = null;
        try
        {
            siteEntry = FindWebSite(server, website);
            if (siteEntry == null)
            {
                return null;
            }

            rootEntry = siteEntry.Children.Find("ROOT", "IIsWebVirtualDir");
            if (rootEntry == null)
            {
                return null;

            }

            return rootEntry.Children.Find(virtualdir, "IIsWebVirtualDir");
        }
        catch (DirectoryNotFoundException ex)
        {
            return null;
        }
        finally
        {
            if (siteEntry != null) siteEntry.Dispose();
            if (rootEntry != null) rootEntry.Dispose();
        }
    }

    static DirectoryEntry FindWebSite(string server, string friendlyName)
    {
        string path = String.Format("IIS://{0}/W3SVC", server);

        using (DirectoryEntry w3svc = new DirectoryEntry(path))
        {
            foreach (DirectoryEntry entry in w3svc.Children)
            {
                if (entry.SchemaClassName == "IIsWebServer" &&
                    entry.Properties["ServerComment"].Value.Equals(friendlyName))
                {
                    return entry;
                }
            }
        }
        return null;
    }
}

Извините за мой паршивый английский.
Надеюсь, я помог.

1 голос
/ 04 февраля 2009

Короче говоря, есть два способа сделать это, что приходит на ум.

Менее изощренный способ - знать, что настройки IIS6 хранятся в MetaBase, который представляет собой просто XML-файл:

C:\WINDOWS\system32\inetsrv\MetaBase.xml

Вы можете просто использовать Linq2Xml и анализировать Xml в поисках имени или идентификатора сайта. Атрибут AppPoolId содержит имя AppPool

Правильный способ - использовать System.DirectoryServices

1 голос
/ 04 февраля 2009

Классы в пространстве имен System.DirectoryServices помогут вам получить эту информацию.

Проверьте эту статью Рика Штраля для примера:

/// <summary>
/// Returns a list of all the Application Pools configured
/// </summary>
/// <returns></returns>
public ApplicationPool[] GetApplicationPools()
{           
    if (ServerType != WebServerTypes.IIS6 && ServerType != WebServerTypes.IIS7)
        return null;

    DirectoryEntry root = this.GetDirectoryEntry("IIS://" + this.DomainName + "/W3SVC/AppPools");
      if (root == null)
            return null;

    List<ApplicationPool> Pools = new List<ApplicationPool>();

    foreach (DirectoryEntry Entry in root.Children)
    {
        PropertyCollection Properties = Entry.Properties;

        ApplicationPool Pool = new ApplicationPool();
        Pool.Name = Entry.Name;

        Pools.Add(Pool);
    }

    return Pools.ToArray();
}

/// <summary>
/// Create a new Application Pool and return an instance of the entry
/// </summary>
/// <param name="AppPoolName"></param>
/// <returns></returns>
public DirectoryEntry CreateApplicationPool(string AppPoolName)
{
    if (this.ServerType != WebServerTypes.IIS6 && this.ServerType != WebServerTypes.IIS7)
        return null;

    DirectoryEntry root = this.GetDirectoryEntry("IIS://" + this.DomainName + "/W3SVC/AppPools");
    if (root == null)
        return null;

    DirectoryEntry AppPool = root.Invoke("Create", "IIsApplicationPool", AppPoolName) as DirectoryEntry;           
    AppPool.CommitChanges();

    return AppPool;
}

/// <summary>
/// Returns an instance of an Application Pool
/// </summary>
/// <param name="AppPoolName"></param>
/// <returns></returns>
public DirectoryEntry GetApplicationPool(string AppPoolName)
{
    DirectoryEntry root = this.GetDirectoryEntry("IIS://" + this.DomainName + "/W3SVC/AppPools/" + AppPoolName);
    return root;
}

/// <summary>
/// Retrieves an Adsi Node by its path. Abstracted for error handling
/// </summary>
/// <param name="Path">the ADSI path to retrieve: IIS://localhost/w3svc/root</param>
/// <returns>node or null</returns>
private DirectoryEntry GetDirectoryEntry(string Path)
{

    DirectoryEntry root = null;
    try
    {
        root = new DirectoryEntry(Path);
    }
    catch
    {
        this.SetError("Couldn't access node");
        return null;
    }
    if (root == null)
    {
        this.SetError("Couldn't access node");
        return null;
    }
    return root;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...