Проверить статус пула приложений iis7 с помощью csharp (доступ запрещен)
Мне нужно отслеживать состояние приложения в пуле приложений 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 ответа
Код, который вы нашли, кажется, для IIS6. Возможно, вам будет лучше использовать новый и поддерживаемый API-интерфейс управления IIS7. Вы можете начать с вызова ServerManager.OpenRemote, чтобы получить объект ServerManager.
Возможно, вам придется возиться с AuthenticationType, по умолчанию, начиная с 2.0, это Безопасный, но вам может потребоваться установить SSL. Кроме того, я видел сообщения об отказе в доступе от учетных записей с пометкой "пользователь должен сменить пароль при следующем входе в систему".
Это работает очень хорошо на 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;
}
}
Благодаря Дрису.