Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программное управление IIS  (Прочитано 19058 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Megabotan
Участник

ru
Offline Offline

« : 11-12-2006 16:25 » 

Я пытаюсь создать узел IIS средствами ASP.NET. Как выяснил нужно использовать интерфейс WMI.
Когда пытаюсь выполнить код на C#:

   System.Management.ManagementObject pre = new System.Management.ManagementObject();
   pre.Path = new System.Management.ManagementPath("IIsWebService='W3SVC'");
   System.Management.ManagementBaseObject Params = pre.GetMethodParameters("CreateNewSite");

на последней строчке выдаётся ошибка "недопустимый класс". Я в ней пытаюсь получить параметры метода создания узла, чтобы потом вызвать метод InvokeMethod.
Подскажите, что здесь неверно? Я всяко уже пробовал. Может какая-нибудь статейка есть об управлении IIS средствами ASP.NET?
« Последнее редактирование: 13-12-2007 18:40 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-12-2006 20:45 » 

Какая версия IIS? Какая операционная система? Поддежка множества сайтов реализована только в IIS 6.0, входящего поставку MS Windows Server 2003. В MS Windows XP стоит IIS 5.1 - в нём функция создания новых сайтов заблокирована (хотя в интерфейсе имеется) - там только один сайт "Default Web Site". Читай MSDN.

Про MS Windows 2000 точно не скажу. Но и там скорее всего можно создавать множество сайтов только в Server версиях.
« Последнее редактирование: 11-12-2006 20:48 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Megabotan
Участник

ru
Offline Offline

« Ответ #2 : 11-12-2006 20:51 » 

У меня Windows Server 2003, IIS 6.0. Это всё понятно.
С помощью утилиты WMI Code Creator я уже необходимый код сгенирировал (так сам WMI-объект с другими параметрами создался). Единственное, что это как задать ServerBindings. Допустим:

ManagementBaseObject Params = pre.GetMethodParameters("CreateNewSite");
Params["ServerBindings"]=???

Это ведь не строка, а массив структур.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-12-2006 08:38 » 

Каких ещё структур? В MSDN же ясно написано:

Цитата
pvServerBindings
[in]  Pointer to a VARIANT containing an array of server binding strings specifying what server bindings you want on this site. Each server binding string includes at least one of the host name, port, or IP address. The string format is IP:Port:Hostname.
Что по-русских означает: массив строк, каждая из которого содержит описание в формате "<IP-адрес>:<Порт>:<Имя хоста>". В строке должен быть указан хотя бы один из этих параметров.

« Последнее редактирование: 12-12-2006 08:40 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 12-12-2006 08:50 » 

Проверил, всё работает:

Код: (Text)
<job id="main">
    <!--
        Test.wsf
       
        Run it by command: cscript Test.wsf        
      -->
    <script language="VBScript">
        Dim IIS
       
        Set IIS = GetObject("IIS://localhost/W3SVC")
       
        Call IIS.CreateNewSite( _
            "TestSite", _
            Array("127.0.0.1:4000:", ":8000:"), _
            "C:\Inetpub\WWWRoot")
    </script>
</job>
Создаётся остановленный сайт "TestSite", принимающий запросы на 127.0.0.1:4000 и на порт 8000 по всем IP адресам хоста.
« Последнее редактирование: 12-12-2006 08:52 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Megabotan
Участник

ru
Offline Offline

« Ответ #5 : 12-12-2006 15:48 » 

Спасибо. А на C# как это выглядеть будет? Там везде типы надо прописывать.
в общем надо этому параметру присвоить одноячеечный (или многоячеечный) массив строк. А почему это вообще массив? Это для того чтобы к узлу несколько IP или несколько портов привязать?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 12-12-2006 18:51 » 

Цитата: Megabotan
А на C# как это выглядеть будет?
А где спортивный интерес? Ага

Цитата: Megabotan
Там везде типы надо прописывать.
Тем не менее на C# можно написать работающий код.

Цитата: Megabotan
А почему это вообще массив? Это для того чтобы к узлу несколько IP или несколько портов привязать?
Я не архитектор IIS - не ко мне вопрос. У инструмента, которым собираются пользоваться, есть определённый интерфейс. Работу с этим интерфейсом нужно всего лишь реализовать. Почему, как и зачем - это в данном случае вопросы посторонние. Особенно они излишни в тех случаях, когда разработчик принимает интерфейс как данность и не может его изменить.

В учебных же целях... Тебе известно, что такое виртуальные хосты Apache? Вот то же самое. И используется в тех же целях.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Megabotan
Участник

ru
Offline Offline

« Ответ #7 : 15-12-2006 19:15 » 

Так дело в том, что VBScript качественно отличается от C#. Попытка присвоить массив строк не проходит:
Код:
System.Management.ManagementObject classInstance =
                    new System.Management.ManagementObject("root\\MicrosoftIISv2",
                    "IIsWebService='W3SVC'",
                    null);

                // Obtain in-parameters for the method
                System.Management.ManagementBaseObject inParams =
                    classInstance.GetMethodParameters("CreateNewSite");

                // Add the input parameters.
                String[] Bindings = new String[1]{":10000:testserv1"};
                inParams["PathOfRootVirtualDir"] =  "C:\\Inetpub\\wwwroot";
                inParams["ServerBindings"] = Bindings;
                inParams["ServerComment"] =  "testserver1";

                // Execute the method and obtain the return values.
                System.Management.ManagementBaseObject outParams =
                    classInstance.InvokeMethod("CreateNewSite", inParams, null);

                // List outParams
                Response.Write("Out parameters:\n");
                Response.Write("ReturnValue: " + outParams["ReturnValue"]+"\n");
Выдаётся ошибка "Unable to cast object of type 'System.String' to type 'System.Management.ManagementBaseObject'" на строчке "inParams["ServerBindings"] = Bindings;".
Я так и думал, что с этим проблемы будут. B VB можно как угодно с типами извращаться, а C# не позволяет.
Мне вероятно какого-то понимания в задании нужных типов не хватет.
Буду премного благодарен, если скажите что присвоить, а то я на этом месте уже неделю торможу.
« Последнее редактирование: 13-12-2007 18:41 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 15-12-2006 21:36 » 

Я не знаю, что ты там где пишешь, просто доверяю MSDN и вижу положительные результаты собственных экспериментов.

Тебе дан пример работы с IIS при помощи так называемого ADSI (Active Directory Service Interface). В MSDN чёрным по белому написано:
Цитата
Active Directory Service Interface (ADSI) is a COM-based interface that supports multiples directories and multiple languages such as C++, C#, Java, Visual Basic, and Microsoft Visual Basic Scripting Edition (VBScript). ADSI comes with providers that are used to access servers running systems such as the Microsoft Windows NT(R) Server 4.0 operating system, Novell NetWare 3, Novell NetWare 4, and LDAP.
Важное выделено. Сие означает, что нет никакой разницы, при помощи какого языка программирования формировать сообщения этому интерфейсу. Т.е. всё должно работать.

Проверяем. Факты - вещь упрямая. Вышеприведённый пример буквально переписывается с VBScript на C# и без всякой ругани о типах прекрасно работает:
Код: (Text)
using System.DirectoryServices;
namespace ADSITest
{
  class Program
  {
    static void Main()
    {
      DirectoryEntry IIS = new DirectoryEntry("IIS://localhost/W3SVC");          
      object[] bindings = new object[] { "127.0.0.1:4000:", ":8000:" };
      IIS.Invoke("CreateNewSite", "TestSite", bindings, "C:\\InetPub\\WWWRoot");
    }
  }
}
Естественно, в references проекта надо добавить System.DirectoryServices.dll.

Ты же продолжаешь мучать WMI, да ещё утилита-кодогенератор какая-то. Хотя, полагаю, в WMI тоже нет никаких проблем, поскольку интерфейс IIS от способа доступа к нему не меняется.

P.S.
Цитата: dimka
А где спортивный интерес?
Спортивного достижения не получилось Жаль
« Последнее редактирование: 15-12-2006 21:49 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 15-12-2006 21:51 » 

Цитата: Megabotan
Как выяснил нужно использовать интерфейс WMI.
Кстати, твоё любимое слово "нужно" (поскольку не первый раз его встречаю) на самом деле оказывается словом "можно" Ага
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Megabotan
Участник

ru
Offline Offline

« Ответ #10 : 15-12-2006 22:36 » 

Это я первое на что наткнулся в MSDN.
Пример ADSI действительно прекрасно работает, странно только почему WMI также ввиде массива строк параметр не принимает.
Кстати, а это можно реализовать на связке php и Delphi? Php допустим вызывает delphi exe-шник... Хотя ладно.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-12-2006 04:11 » 

Цитата: Megabotan
Кстати, а это можно реализовать на связке php и Delphi? Php допустим вызывает delphi exe-шник...
Я даже подозреваю, что и без Delphi обойтись можно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Megabotan
Участник

ru
Offline Offline

« Ответ #12 : 16-12-2006 10:57 » 

Да, но помоему с правами доступа будут проблемы - ведь IIS запускается от имени непривелегированного пользователя.
А если одними средствами php можно обойтись, я б тогда с удовольствием. Только как заставить php работать с метабазой IIS - я об этом никогда не слышал.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines