File: WasAdminWrapper.cs
Project: ndp\cdf\src\WCF\Tools\comsvcutil\ComSvcConfig.csproj (ComSvcConfig)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.Tools.ServiceModel.ComSvcConfig
{
    using System;
    using System.ServiceModel.Channels;
    using System.Diagnostics;
    using System.DirectoryServices;
    using System.Configuration;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Collections.Generic;
    using System.IO;
    using System.Reflection;
    using System.Text;
    using System.Threading;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.ServiceModel;
    using System.ServiceModel.Configuration;
    using Microsoft.Tools.ServiceModel;
    using Microsoft.Tools.ServiceModel.SvcUtil;
    using Microsoft.Win32;
 
    internal static class WasAdminWrapper
    {
        const string webService = "IIS://localhost/w3svc";
        const string defaultWebServer = "1";
 
        public static string DefaultWebServer
        {
            get { return webService + "/" + defaultWebServer; }
        }
 
        public static bool IsIISInstalled()
        {
            const string inetStp = "SOFTWARE\\Microsoft\\InetStp";
            const string majorVersion = "MajorVersion";
            const string minorVersion = "MinorVersion";
            const string components = "Components";
            const string W3SVC = "W3SVC";
 
            try
            {
                RegistryKey inetStpKey = Registry.LocalMachine.OpenSubKey(inetStp);
                if (inetStpKey != null)
                {
                    // Check if the IIS is installed, we don't care which version is installed
                    inetStpKey.GetValue(majorVersion);
                    inetStpKey.GetValue(minorVersion);
                    RegistryKey componentsKey = inetStpKey.OpenSubKey(components);
                    // Check if the w3svc component is installed, WCF service over HTTP requires it
                    if (componentsKey != null)
                    {
                        int w3svcValue = (int)componentsKey.GetValue(W3SVC);
                        if (w3svcValue != 0)
                        {
                            return true;
                        }
                    }
                }
 
            }
            catch (IOException)
            {
                return false;
            }
 
            return false;
        }
        public static string[] GetWebServerNames()
        {
            if (!IsIISInstalled())
                return null;
            try
            {
                List<string> webServerNames = new List<string>();
 
                DirectoryEntry webServiceEntry = new DirectoryEntry(webService);
 
                foreach (DirectoryEntry child in webServiceEntry.Children)
                {
                    if (child.SchemaClassName.ToUpperInvariant() == "IISWEBSERVER")
                    {
                        webServerNames.Add(webService + "/" + child.Name);      // Note, child.Name is a number!  the "friendly" name is actually child.Description
                    }
                }
                return webServerNames.ToArray();
            }
            catch (COMException ex)
            {
                // assume a failure here means that no web servers exist
                ToolConsole.WriteWarning(SR.GetString(SR.CannotGetWebServersIgnoringWas,
                        ex.ErrorCode, ex.Message));
                return null;
 
            }
        }
 
        public static string[] GetWebDirectoryNames(string webServer)
        {
            if (!IsIISInstalled())
                return null;
 
            try
            {
                List<string> webDirectoryNames = new List<string>();
 
                DirectoryEntry webServiceEntry = new DirectoryEntry(webServer);
 
                foreach (DirectoryEntry child in webServiceEntry.Children)
                {
                    if (child.SchemaClassName.ToUpperInvariant() == "IISWEBDIRECTORY" || child.SchemaClassName.ToUpperInvariant() == "IISWEBVIRTUALDIR")
                    {
                        webDirectoryNames.Add(child.Name);
 
                        // Must special case the "ROOT" vDir, since most actual vDirs are subchildren of the ROOT vdir of a server.
                        if (child.Name.ToUpperInvariant() == "ROOT")
                        {
                            foreach (DirectoryEntry rootChild in child.Children)
                            {
                                if (rootChild.SchemaClassName.ToUpperInvariant() == "IISWEBDIRECTORY" || rootChild.SchemaClassName.ToUpperInvariant() == "IISWEBVIRTUALDIR")
                                {
                                    webDirectoryNames.Add("ROOT" + "/" + rootChild.Name);
                                }
                            }
                        }
                    }
                }
                return webDirectoryNames.ToArray();
            }
            catch (COMException ex)
            {
                // assume a failure here means that no web directory exist
                ToolConsole.WriteWarning(SR.GetString(SR.CannotGetWebDirectoryForServer,
                        webServer, ex.ErrorCode, ex.Message));
                return null;
 
            }
 
        }
 
        public static bool GetWebDirectoryPath(string webServer, string webDirectory, out string webDirectoryPath)
        {
            webDirectoryPath = null;
 
            if (!IsIISInstalled())
                return false;
 
            if (!webDirectory.ToUpperInvariant().StartsWith("ROOT", StringComparison.Ordinal))
                webDirectory = "root/" + webDirectory;
 
            string[] webDirectories = GetWebDirectoryNames(webServer);
            if (webDirectories == null)
                return false;
            bool found = false;
            foreach (string webDirectoryName in webDirectories)
                if (webDirectoryName.ToUpperInvariant() == webDirectory.ToUpperInvariant())
                {
                    found = true;
                    break;
                }
            if (!found) return false;
            DirectoryEntry webDirectoryEntry = new DirectoryEntry(webServer + "/" + webDirectory);
            try
            {
                if (webDirectoryEntry.Properties.Contains("Path"))
                {
                    webDirectoryPath = (string)webDirectoryEntry.Properties["Path"].Value;
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (COMException ex)
            {
                // assume a failure here means the dir does not exist
                ToolConsole.WriteWarning(SR.GetString(SR.CannotGetWebDirectoryPathOnWebDirOfWebServIgnoring,
                        webServer, webDirectory, ex.ErrorCode, ex.Message));
                return false;
            }
        }
    }
}