asp.net - 如何使用 Inno Setup 脚本创建 IIS 应用程序和应用程序池

标签 asp.net iis inno-setup

我正在尝试使用 Inno Setup 部署 ASP.NET 应用程序。

我需要执行以下任务:

  • 创建一个 IIS 应用程序。
  • 创建一个新的 IIS 应用程序池并将其 .NET 版本设置为 4。
  • 将新应用的应用池设置为新应用池。

  • 我找到了一个创建虚拟目录的脚本,但我需要一个应用程序和应用程序池:

    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;
    

    最佳答案

    很久以前就有人问过这个问题,但也许有人会发现这个用于 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;
    

    关于asp.net - 如何使用 Inno Setup 脚本创建 IIS 应用程序和应用程序池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512805/

    相关文章:

    visual-studio - 使用本地 IIS 编辑并继续

    asp.net - 在 TFS/版本控制中存储 IIS 配置的最佳实践

    installation - 使用 Inno Setup 联系许可证 key 服务器?

    inno-setup - 使用 Inno Setup 进行静默卸载,无需任何窗口

    c# - 有没有办法在 ASP 中为 Cellspacing 使用非 Int32 值?

    c# - 试图将 IList 转换为 List 以便 AddRange

    javascript - 在 gridview 中(标签在点击时变成文本框)一次一个

    javascript - asp.net 文本框中仅允许数字或小数数据

    asp.net - ASP.NET 开发服务器在哪里保存其日志?

    dll - 在InnoSetup中注册DLL/OCX