views:

2104

answers:

3

how to get the application pool name for a specific website IIS 6 programmatic using C#

EDIT : I already used the methods of DirectoryServices namespace but the application pool name isn't retrieved correctly unless it was explicitly set by using the same code. Which means if u add a website manually using the iis manager and set an application pool, those codes won't work (it will always return DefaultAppPool) more over when I create an application using sharepoint and set a different appPool those methods dont work.

+1  A: 

The classes in the System.DirectoryServices namespace will help you get that information.

Check this article by Rick Strahl for an example.

M4N
I already use those methods but the application pool name isn't retrieved correctly unless it was explicitly set by using the same code.Which means if u add a website manually using the iis manager and set an application pool, those codes won't work (it will always return DefaultAppPool)
Amr Elsehemy
more over when I create an application using sharepoint and set a different appPool those methods dont work.
Amr Elsehemy
Thanks, I didn't know that. Maybe you should add that information to your question?
M4N
A: 

In brief, there's 2 ways of doing this that spring to mind.

The less sophisticated way is knowing that, IIS6's settings are stored in the MetaBase which is just an Xml file:

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

You can just use Linq2Xml and parse the Xml looking for the sites name or Id, The AppPoolId attribute contains the name of the AppPool

The proper way is to use System.DirectoryServices

danswain
+3  A: 

I don't agree with you. I coded up a test app and I get the correct AppPool name from it, even if I set the AppPool manually using IIS Manager.

To make sure, I have tested once, name name was ok; then, I popep up the IIS Manager, changed the AppPool, executed iisreset, and ran the test app again - the AppPool name I got was correct again. I don't how your code looked like, but mine is like this:

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;
    }
}

Sorry for my lousy english.
Hope I've helped.

Ricardo Nolde
Nice one, works for IIS7 as well as IIS6. Bear in mind that you won't necessarily need to identify the AppPool for a virtual directory if your service runs under the same identity as the root level throughout. Also, I'm not sure about passing nulls back if the Web site is not found: I'd rather let the system throw.
Jeremy McGee
Good to know that it works for IIS7 also! And about the "catch", I agree - you should do what suits you best!
Ricardo Nolde