Как создать приложение IIS и пул приложений с помощью сценария Inno Setup

Я пытаюсь развернуть приложение ASP.NET с помощью Inno Setup.

Мне нужно выполнить следующие задачи:

  1. Создайте приложение IIS.
  2. Создайте новый пул приложений IIS и установите его версию .NET на 4.
  3. Установите пул приложений нового приложения в новый пул приложений.

Я нашел скрипт для создания виртуального каталога, но мне нужно приложение и пул приложений:

procedure CreateIISVirtualDir();
var
  IIS, WebSite, WebServer, WebRoot, VDir: Variant;
  ErrorCode: Integer;
begin
  { Create the main IIS COM Automation object }

  try
    IIS := CreateOleObject('IISNamespace');
  except
    RaiseException(
      'Please install Microsoft IIS first.'#13#13'(Error ''' +
      GetExceptionMessage + ''' occurred)');
  end;

  { Connect to the IIS server }

  WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');
  WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
  WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');

  { (Re)create a virtual dir }

  try
    WebRoot.Delete('IIsWebVirtualDir', 'eipwebv4');
    WebRoot.SetInfo();
  except
  end;

  VDir := WebRoot.Create('IIsWebVirtualDir', 'eipwebv4');
  VDir.AccessRead := True;
  VDir.AccessScript := TRUE;
  VDir.AppFriendlyName := 'Easy-IP Web Client';
  VDir.Path := ExpandConstant('{app}');
  try
    VDir.AppPoolId := 'Classic .NET AppPool';
  except
  end;

  VDir.AppCreate(True);
  VDir.SetInfo();
end;

person norgepaul    schedule 18.08.2010    source источник


Ответы (2)


Вопрос был задан давно, но, возможно, кому-то будет полезен этот скрипт для IIS6/IIS7:

var
  global_AppCmdFilePath :String;
  global_IsIIS7 :Boolean;
  global_WebSites :SiteList;
  global_WebSiteName :String;
  global_vDir :String;
  global_AppCmdExitCode :Integer;

const
  IISServerName = 'localhost';
  IISApplicationPoolName = 'Test Pool';

  ERROR_NOT_FOUND = 1168;
  ERROR_NOT_SUPPORTED = 50;

  MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM = 0;
  MD_APPPOOL_IDENTITY_TYPE_LOCALSERVICE = 1;
  MD_APPPOOL_IDENTITY_TYPE_NETWORKSERVICE = 2;
  MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER = 3;

  MD_LOGON_INTERACTIVE = 0;
  MD_LOGON_BATCH = 1;
  MD_LOGON_NETWORK = 2;
  MD_LOGON_NETWORK_CLEARTEXT = 3;

function ExecAppCmd(params :String) :Boolean;
var
  execSuccessfully :Boolean;
  resultCode :Integer;
begin
  execSuccessfully := Exec('cmd.exe', '/c ' + global_AppCmdFilePath + ' ' + params, '', SW_HIDE, ewWaitUntilTerminated, resultCode);

  global_AppCmdExitCode := resultCode;

  Result := execSuccessfully and (resultCode = 0);
end;


function CreateVirtualDirectoryForIIS6(physicalPath :String) :String;
var
  IIS, webService, webServer, webRoot, vDir, vDirApp :Variant;
  appPools, appPool :Variant;
  webSiteId :String;
begin
  webSiteId := GetWebSiteIdByName(global_WebSiteName);

  { Create the main IIS COM Automation object. }
  IIS := CreateOleObject('IISNamespace');

  { Get application pools. }
  appPools := IIS.GetObject('IIsApplicationPools', 'localhost/W3SVC/AppPools');

  try
    { Check if the application pool already exists. }
    appPool := appPools.GetObject('IIsApplicationPool', IISApplicationPoolName);
  except
    { Crete the application pool. }
    try
      appPool := appPools.Create('IIsApplicationPool', IISApplicationPoolName);

      appPool.LogonMethod := MD_LOGON_NETWORK_CLEARTEXT;
      appPool.AppPoolIdentityType := MD_APPPOOL_IDENTITY_TYPE_NETWORKSERVICE;

      appPool.SetInfo();
    except
      Result := 'Failed to create an apllication pool.';
      Exit;
    end;
  end;

  { Connect to the IIS server. }
  webService := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');

  { Get the website. }
  webServer := webService.GetObject('IIsWebServer', webSiteId);
  webRoot := webServer.GetObject('IIsWebVirtualDir', 'Root');

  { Delete the virtual dir if it already exists. }
  try
    webRoot.Delete('IIsWebVirtualDir', global_vDir);
    webRoot.SetInfo();
  except
    { An exception will be raised if there is not such a website. }
  end;

  { Create the virtual directory. }
  try
    vDir := WebRoot.Create('IIsWebVirtualDir', global_vDir);

    vDir.AccessRead := True;
    vDir.AccessScript := True;
    vDir.AppFriendlyName := 'Test friendly name';
    vDir.Path := physicalPath;

    vDir.AppCreate(False);

    vDir.SetInfo();
  except
    Result := 'Failed to create a virtual directory.';
    Exit;
  end;

  { Assign the application pool to the virtual directory. }
  try
    vDir := webRoot.GetObject('IIsWebVirtualDir', global_vDir);

    vDir.AppPoolId := IISApplicationPoolName;

    vDir.SetInfo();
  except
    Result := 'Failed to assign the application pool to the virtual directory.';
    Exit;
  end;
end;

function CreateVirtualDirectoryForIIS7(physicalPath :String) :String;
var
  tempFileName :String;
  appPoolList :String;
  createAppPool :Boolean;
begin
  { Delete the application if it already exists. }
  if not ExecAppCmd(Format('delete app "%s/%s"', [global_WebSiteName, global_vDir])) then
  begin
    if (global_AppCmdExitCode <> ERROR_NOT_FOUND) and (global_AppCmdExitCode <> ERROR_NOT_SUPPORTED) then
    begin
      Result := 'Failed to delete the application.  ' + GetErrorMessageByCode(global_AppCmdExitCode);
      Exit;
    end;
  end;

  { Check if the application pool already exists. }
  tempFileName := ExpandConstant('{tmp}\AppPoolNames.txt');

  ExecAppCmd(Format('list apppool "%s" > "%s"', [IISApplicationPoolName, tempFileName]));

  if (LoadStringFromFile(tempFileName, appPoolList)) then
  begin
    createAppPool := (Pos(IISApplicationPoolName, appPoolList) = 0);
  end
  else
  begin
    createAppPool := True;
  end;

  { Create the application pool. }
  if (createAppPool) then
  begin
    if not ExecAppCmd(Format('add apppool /name:"%s" /managedRuntimeVersion:v4.0', [IISApplicationPoolName])) then
    begin
      Result := 'Failed to add the application pool. ' + GetErrorMessageByCode(global_AppCmdExitCode);
      Exit;
    end;
  end;

  { Create the application. }
  if not ExecAppCmd(Format('add app /site.name:"%s" /path:"/%s" /physicalPath:"%s" /applicationPool:"%s"', [global_WebSiteName, global_vDir, physicalPath, IISApplicationPoolName])) then
  begin
    Result := 'Failed to add the application. ' + GetErrorMessageByCode(global_AppCmdExitCode);
    Exit;
  end;

  Result := '';
end;
person Teddy Bo    schedule 29.03.2012
comment
Сначала я хотел бы поблагодарить вас за ваш ответ, это именно то, что мне нужно сделать, но мне трудно во всем разобраться. Во-первых, что мне нужно отправить в качестве моего «физического пути» при попытке создать VirtualDirectoryForIIs7, например? - person DTI-Matt; 06.08.2012
comment
Физический путь — это путь на диске, где хранится ваше приложение ASP.NET. - person Teddy Bo; 07.08.2012
comment
Означает ли это, что мне нужно будет включить все файлы, имеющие отношение к моему приложению ASP.NET, в блок [Файлы] моего сценария? Еще раз спасибо за помощь - person DTI-Matt; 07.08.2012
comment
да. Вы должны включить все файлы вашего приложения APS.NET в раздел [Files]. Иначе как вы собираетесь доставлять их на клиентскую машину? - person Teddy Bo; 09.08.2012
comment
Да, в этом есть смысл, допустим, я добавляю свой сайт с папкой верхнего уровня и всеми подпапками и файлами, например: [C:\Users\YOU\Installer\src\SeverSite*; DestDir: {localappdata}\DT\ServerSite; Атрибуты: скрыто; Флаги: ignoreversion recursesubdirs createallsubdirs;] Буду ли я продолжать вызывать CreateVirtualDirectoryForIIS7 следующим образом? [CreateVirtualDirectoryForIIS7('{localappdata}\DT\ServerSite');] Спасибо за вашу помощь - person DTI-Matt; 09.08.2012
comment
Да, ты прав. Но есть одна вещь, которую нужно иметь в виду. Если вы используете такие константы, как {localappdata} или {app} в разделе [Code], вы должны использовать метод ExpandConstant (например, ExpandConstant('{app}')). Кстати, я не уверен, что это хорошая идея - устанавливать сайт в локальную (не перемещаемую) папку Application Data. - person Teddy Bo; 10.08.2012

Итак: http://learn.iis.net/page.aspx/285/provisioning-sample-in-c/

Прокрутите вниз Create Application Pool. Он покажет вам, как создать AppPool, Application и VirtualDirectories.

person Jeroen    schedule 18.08.2010
comment
Спасибо, но я ищу пример использования Innosetup. - person norgepaul; 18.08.2010