#c# #asp.net #iis-6 #windows-server-2003
#c# #asp.net #iis-6 #windows-server-2003
Вопрос:
Я пытаюсь создать веб-приложение .NET, которое перезапускает пул приложений на удаленном веб-сервере под управлением IIS 6.0 на Windows Server 2003. У меня работает код, но у меня проблема с разрешениями.
string appPoolPath = ConfigurationSettings.AppSettings["ApplicationPool"];
string systemId = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
try
{
DirectoryEntry svc = new DirectoryEntry(appPoolPath);
svc.Invoke("Recycle");
LabelResult.Text = "Application Pool Recycled Succesfully!";
LabelResult.Visible = true;
}
catch(Exception exc)
{
LabelResult.Text = "Error (" systemId "): " exc.Message " : " exc.InnerException;
LabelResult.Visible = true;
}
Когда я запускаю код, я получаю следующую ошибку:
Ошибка (NT AUTHORITY СЕТЕВАЯ СЛУЖБА): целью вызова было вызвано исключение. : Система.Исключение UnauthorizedAccessException: доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
Итак, мой вопрос в том, как я могу предоставить учетной записи СЕТЕВОЙ СЛУЖБЫ разрешение на вызов recycle без предоставления учетной записи полных прав администратора? Возможно ли это?
Я знаю другой способ решить эту проблему — выдать себя за одного из существующих администраторов на сервере, но мне не разрешено этого делать. Я не могу создавать пользователей на компьютере и не могу получить учетные данные для входа в существующие учетные записи пользователей.
Ответ №1:
Другой вариант:
Поместите фиктивный файл в каталог /bin и обновляйте его каждый раз, когда захотите перезапустить пул
Комментарии:
1. это перезапускает приложение, а не пул приложений
Ответ №2:
Это не совсем так. Вам нужен раздел в Web.Config:
<section name="TestSection" restartOnExternalChanges="true" requirePermission="false" type="System.Configuration.AppSettingsSection, System.Configuration"/>
<TestSection configSource="Test.config"></TestSection>
Затем, когда вы изменяете Test.config, пул приложений перерабатывается.
Ответ №3:
Попробуйте удалить и создать пул приложений. Решил мою проблему.
var server = new ServerManager();
var pool = server.ApplicationPools.FirstOrDefault(q => q.Name == "MyPool");
if (pool != null)
{
server.ApplicationPools.Remove(pool);
server.CommitChanges();
server.ApplicationPools.Add("MyPool");
server.CommitChanges();
}