使用csharp检查状态应用程序池iis7(访问被拒绝)

时间:2010-04-27 17:19:43

标签: c# iis-7 access-denied

我需要从同一域中的其他计算机上监视IIS 7的应用程序池中的应用程序的状态。我的监控应用程序必须使用C#并作为Windows服务运行。

在我的服务器上,我创建了一个具有管理权限的用户,并执行命令aspnet_regiis -ga machine \ username,并且成功运行。

我的问题是,当我尝试访问应用程序池时,我仍然得到COMExcepttion“访问被拒绝”。 我做错了什么或者我错过了哪一步?

我使用http://patelshailesh.com/index.php/create-a-website-application-pool-programmatically-using-csharp中的代码作为示例。

        int status = 0;
        string ipAddress = "10.20.2.13";
        string username = "username";
        string password = "password";
        try
        {
            DirectoryEntry de = new DirectoryEntry(string.Format("IIS://{0}/W3SVC/AppPools/MyAppPoolName", ipAddress), username, password);

            //the exception is thron here.
            status = (int)de.InvokeGet("AppPoolState");

            switch (status)
            {
                case 2:
                    //Runnig
                    break;
                case 4:
                    //Stopped
                    break;
                default:
                    break;
            }
        }
        catch (Exception ex)
        {

        }

3 个答案:

答案 0 :(得分:1)

您找到的代码似乎适用于IIS6。也许您最好使用新的和受支持的IIS7管理API。您可以先致电ServerManager.OpenRemote来获取ServerManager对象。

答案 1 :(得分:0)

您可能需要使用AuthenticationType,默认从2.0开始是安全的,但您可能需要设置SSL。此外,我已经看到来自帐户的拒绝访问邮件,其中“用户必须在下次登录时更改密码”。

答案 2 :(得分:0)

这在Windows 7和Windows Server 2008上运行良好(遗憾的是不适用于XP和2003 Server)。我必须通过服务器管理器在IIS中添加管理服务角色才能启用远程连接。

以下是如何获取应用程序池状态的简短示例。

public ObjectState State
    {
        get
        {
            ServerManager server = null;
            ObjectState result = ObjectState.Unknown;
            try
            {
                server = ServerManager.OpenRemote(address);
                result = server.ApplicationPools[name].State;
            }
            finally
            {
                if (server != null)
                    server.Dispose();
            }

            return result;
        }
    }

感谢driis。