繁体   English   中英

从IIS获取托管网站名称

[英]To get the hosted web sites names from IIS

我创建了一种从IIS服务器获取托管网站的方法,如下面的代码片段所示。

       ServerManager serverManager = new ServerManager();

        try
        {
            foreach (Site site in serverManager.Sites)
            {
                Console.WriteLine(site);
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);

            Console.ReadLine();
        }

当我在我的本地机器上运行它时它运行得很好(Windows 7 /IIS 7 with 32bits)当我在服务器机器(Windows server 2003 R2 with IIS 6)运行它时,它无法工作。它给出了以下错误

由于以下错误,检索具有CLSID {2B> 52-803546CE3344}的组件的COM类工厂失败:80040154> d(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))。

任何帮助都会很棒吗?

我使用System.DirectoryServices而不是使用Microsoft.Web.Administration它解决了我的问题。它也将与IIS6和IIS7一起使用。

    public class IisManager
    {
        public static int IisVersion
        {
            get
            {
                int iisVersion;

                using (RegistryKey iisKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\InetStp"))
                {
                    if (iisKey == null)
                        throw new Exception("IIS is not installed.");
                    iisVersion = (int)iisKey.GetValue("MajorVersion");
                }

                return iisVersion;
            }

        }

        public static IList<IisWebSite> GetIisSites()
        {
            List<IisWebSite> sites = new List<IisWebSite>();

            using (DirectoryEntry iisRoot = new DirectoryEntry("IIS://localhost/W3SVC"))
            {
                iisRoot.RefreshCache();
                sites.AddRange(iisRoot.Children.Cast<DirectoryEntry>().Where(w => w.SchemaClassName.ToLower(CultureInfo.InvariantCulture) == "iiswebserver").Select(w => new IisWebSite(w.Name, w.Properties["ServerComment"].Value.ToString())));
            }

            return sites;
        }

        public static IList<string> GetIisAppPools()
        {
            List<string> pools = new List<string>();
            using (DirectoryEntry poolRoot = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"))
            {
                poolRoot.RefreshCache(); pools.AddRange(poolRoot.Children.Cast<DirectoryEntry>().Select(p => p.Name));
            }
            return pools;
        }

    }

查看此博客文章,最具体地说,是最后一段。 它很可能是32位与64位DLL编译冲突

客户和我都在创建32位.NET应用程序,而FTP运行时状态的COM接口是在64位的DLL中实现的。 一旦我们都改变了我们的项目以编译为64位平台,我们都能够运行代码。 (巧合的是,当我编写原始博客时,我所拥有的只是一个32位系统,所以如果我当时拥有64位系统,我可能会更快地遇到这种情况。; - ])

http://blogs.iis.net/robert_mcmurray/archive/2012/06/29/error-class-not-registered-0x80040154-when-querying-ftp-runtime-state.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM