суббота, 9 июля 2011 г.

Создание сайта на IIS из инсталлятора

Смотрю кого-то занесло ко мне с поиском по фразе "как сделать инсталлятор сайта на iis". На самом деле их есть у меня. Вот выдержки из скрипта для Inno Setup, создающего сайт на основе каталога с файлами.

Несколько общих переменных и констант:
var
  WebSiteNamePage: TInputQueryWizardPage;
  DispatchWebSiteName: string;

const
  IISServerName = 'localhost';
  IISServerNumber = '1';
В самом начале убеждаемся, что все необходимое на месте:
function InitializeSetup(): Boolean;
begin
 // Проверка, что установлено все необходимое ПО
 result := IsDotNet35Installed() and IsSQLServerInstalled() and IsIISInstalled();
end;

// Проверка, что установлен Microsoft IIS
function IsIISInstalled() : Boolean;
var
 IIS: Variant;
begin
  try
    IIS := CreateOleObject('IISNamespace');
    result:=true;
  except
    result:=false;
    MsgBox( CustomMessage('InstallIIS'), mbError, MB_OK );
  end;
end;
Собственно создание сайта у меня происходит в PostInstall(), когда уже скопированы все файлы сайта:
// Действия после установки
procedure PostInstall();
begin
 // Создать виртуальный каталог IIS для сайта
 CreateDispatchVirtualDir();
end;

// Создание сайта на основе каталога со скопированными файлами
function CreateDispatchVirtualDir() : Boolean;
var
 IIS, WebSite, WebServer, WebRoot, VDir: Variant;
 ErrorCode: Integer;
begin
 result:=true;
 // подключение к IIS
 try
  IIS := CreateOleObject('IISNamespace');
 except
  result:=false;
  MsgBox( CustomMessage('InstallIIS'), mbError, MB_OK );
 end;

 if result then
 begin
  try
   // берем рычаги
   DispatchWebSiteName := WebSiteNamePage.Values[0];
   WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');
   WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
   WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');

   // удаляем виртуальный каталог, который собираемся создавать
   try
    WebRoot.Delete('IIsWebVirtualDir', DispatchWebSiteName);
    // сохранить изменения
    WebRoot.SetInfo();
   except
   end;

   // создаем виртуальный каталог
   VDir := WebRoot.Create('IIsWebVirtualDir', DispatchWebSiteName);
   VDir.AccessRead := True;
   VDir.AccessScript:=true;
   VDir.DefaultDoc:='default.aspx';
   VDir.AppFriendlyName := DispatchWebSiteName;
   VDir.Path := ExpandConstant('{app}');
   VDir.AppCreate(True);
   // сохранить изменения
   VDir.SetInfo();

   // открываем сайт в браузере
   ShellExec( 'open', 'http://' + IISServerName + '/' + DispatchWebSiteName + '/', '', '', SW_SHOW, ewNoWait, ErrorCode );
   result:=true;
  except
   MsgBox( CustomMessage('VirtualDirNotInstalled'), mbError, MB_OK );
   result:=false;
  end;
 end;
end;
Ну и удаление при деинсталляции:
// Действия после деинсталляции
procedure PostUninstall();
begin
 DeleteDispatchVirtualDir();
end;

// Удаление виртуального каталога
function DeleteDispatchVirtualDir() : Boolean;
var
 IIS, WebSite, WebServer, WebRoot: Variant;
begin
 result:=true;
 // подключение к IIS
 try
  IIS := CreateOleObject('IISNamespace');
 except
  result:=false;
 end;

 if result then
 begin
  try
   // берем рычаги
   WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');
   WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
   WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');

   // удаляем виртуальный каталог
   try
    WebRoot.Delete('IIsWebVirtualDir', DispatchWebSiteName);
    // сохранить изменения
    WebRoot.SetInfo();
   except
   end;
   result:=true;
  except
   result:=false;
  end;
 end;
end;
Скрипт проверен на windows 2003 и 2008. Надо только не забывать в 2008-й при настройке ролей сервера дополнительно инсталлировать компоненты, обеспечивающие совместимость со средствами управления IIS6:

Комментариев нет:

Отправить комментарий