Не удалось получить список веб-сайтов IIS, чтобы пользователь мог выбрать место установки для использования в настройке Inno Script. - PullRequest
1 голос
/ 09 марта 2011

В настоящее время я пытаюсь создать установщик сценария Inno, который запрашивает список «веб-сайтов» из пользовательской установки IIS, чтобы пользователь мог выбрать соответствующий веб-сайт из списка со списком, и этот список можно использовать для созданиявиртуальный каталог в правильном расположении веб-сайта.

Мне нужно создать список веб-сайтов IIS, например, «Веб-сайт по умолчанию», заполнив поле со списком

До сих пор мне удалось добиться только установкивиртуальный каталог к ​​местоположению, основанный на жестко заданном поле со списком со следующим кодом.

[Run]
Filename: {sys}\iisvdir.vbs; Parameters: "/create ""{code:GetWebSite}"" MyApp ""{app}\Website"""; Flags: skipifdoesntexist waituntilterminated shellexec; StatusMsg: Creating IIS Virtual Directory

[Code]
var
  WebsitePage: TWizardPage;
  ComboBox: TNewComboBox;

procedure InitializeWizard;
begin
  WebsitePage := CreateCustomPage(wpSelectComponents, 'Select which website you wish to install to',
'Which website should I install to?');
  ComboBox := TNewComboBox.Create(WebsitePage);
  ComboBox.Width := WebsitePage.SurfaceWidth;
  ComboBox.Parent := WebsitePage.Surface;
  ComboBox.Style := csDropDownList;
  ComboBox.Items.Add('Default Web Site');
  ComboBox.Items.Add('Website 1');
  ComboBox.ItemIndex := 0;
end;

function GetWebSite(Param: String): String;
begin
  { Return the selected Website }
  Result  := ComboBox.Text;
end;

Все, что мне нужно сейчас сделать, - это динамически настроить элементы из доступных веб-сайтов, которые пользователь имеет в IIS..

Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

На самом деле я "решил" это вчера, до сих пор не нашел ничего другого на эту тему, поэтому я думаю, что мы пионеры;). Я начал долгие строки, которые вы сделали, но я не смог найти никакой полезной документации и пошел по другому пути. Хотя мое решение работает, оно очень грязное.

Обычно я запускаю скрипт VB, который выводит список веб-сайтов в текстовый файл, а затем считываю этот текстовый файл обратно в настройку Inno. Ниже приведен мой грубый код, я планирую привести его в порядок и позже добавить соответствующую обработку ошибок.

Website.vbs

OPTION EXPLICIT

DIM CRLF, TAB
DIM strServer
DIM objWebService
strServer = "localhost"

CRLF = CHR( 13 ) & CHR( 10 )

' WScript.Echo "Enumerating websites on " & strServer & CRLF
SET objWebService = GetObject( "IIS://" & strServer & "/W3SVC" )
EnumWebsites objWebService

SUB EnumWebsites( objWebService)
    DIM objWebServer, objWebServerRoot, strBindings

    Dim objFSO, objFolder, objShell, objTextFile, objFile
    Dim strDirectory, strFile, strText

    strFile = "website.txt"

    ' Create the File System Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FileExists(strFile) Then
       Set objFolder = objFSO.GetFolder(strDirectory)
    Else
       Set objFile = objFSO.CreateTextFile(strFile)
       ' Wscript.Echo "Just created " & strDirectory & strFile
    End If 

    set objFile = nothing
    set objFolder = nothing

    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8

    Set objTextFile = objFSO.OpenTextFile _
    (strFile, ForAppending, True)

    FOR EACH objWebServer IN objWebService
        IF objWebserver.Class = "IIsWebServer" THEN

            SET objWebServerRoot = GetObject(objWebServer.adspath & "/root")

            ' Writes strText every time you run this VBScript
            objTextFile.WriteLine(objWebServer.ServerComment)

        END IF
    NEXT

    objTextFile.Close
END SUB

Innosetup скрипт

[Code]
var

  WebsitePage: TWizardPage;
  ComboBox: TNewComboBox;
  WebSite: Variant;
  WebServer: Variant;
  WebRoot: Variant; 
  ErrorCode: Integer;
  ResultCode: Integer;
  Sites: AnsiString;

procedure InitializeWizard;
begin

  ExtractTemporaryFile('Website.vbs');
  if not ShellExec('', ExpandConstant('{tmp}\Website.vbs'),     '', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode) then
    begin
      MsgBox('Oh no!:' #13#13 'The file could not be executed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    end;

  if LoadStringFromFile(ExpandConstant('{tmp}\website.txt'), Sites) then
  begin
    //MsgBox(Sites, mbInformation, MB_OK);
  end else begin
    Exit; 
  end;

WebsitePage := CreateCustomPage(DataDirPage.ID, 'Select which website you wish to install to',
'Which website should the application be install to?');
  ComboBox := TNewComboBox.Create(WebsitePage);
  ComboBox.Width := WebsitePage.SurfaceWidth;
  ComboBox.Parent := WebsitePage.Surface;
  ComboBox.Style := csDropDownList;
  ComboBox.Items.Text := Sites;
  ComboBox.ItemIndex := 0;
end;
2 голосов
/ 31 марта 2011

Хорошие новости !!Я нашел скрытую вещь, которую мы оба искали, и вам не нужен отдельный проект vb, чтобы это исправить.

Вот мой код снова:

[Code]
var
  WebsitePage: TWizardPage;
  ComboBox: TNewComboBox;
  IIS, WebSite, WebServer: Variant;
  IISServerIndex: Integer;

procedure InitializeWizard;
begin
  WebsitePage := CreateCustomPage(wpSelectComponents, 'Select which website you wish to install to',
'Which website should I install to?');
  ComboBox.Width := WebsitePage.SurfaceWidth;
  ComboBox.Parent := WebsitePage.Surface;
  ComboBox.Style := csDropDownList;

// ------------------------------------------------------------------------------

    IIS := CreateOleObject('IISNamespace');
WebServer := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');

IISServerIndex := 1;
try
    while True do
    begin
        WebSite := WebServer.GetObject('IIsWebServer', IISServerIndex);
        ComboBox.Items.Add(WebSite.ServerComment);
        IISServerIndex := IISServerIndex + 1;
    end;
except
end;

Ответ былизменение строки ComboBox.Items.Add на .ServerComment, а не .Name.

Наслаждайтесь:)

Stu

1 голос
/ 30 марта 2011

Я немного углубился в твою проблему, но я все еще не решил ее!Я могу получить номер, который появляется в каталоге, но не само имя.

Вот что у меня есть.Если вам удастся продвинуться дальше, пожалуйста, дайте мне знать, что вы сделали:)

[Code]
var
  WebsitePage: TWizardPage;
  ComboBox: TNewComboBox;
  IIS, WebSite, WebServer: Variant;
  IISServerIndex: Integer;

procedure InitializeWizard;
begin
  WebsitePage := CreateCustomPage(wpSelectComponents, 'Select which website you wish to install to',
'Which website should I install to?');
  ComboBox.Width := WebsitePage.SurfaceWidth;
  ComboBox.Parent := WebsitePage.Surface;
  ComboBox.Style := csDropDownList;

// ------------------------------------------------------------------------------

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

    IISServerIndex := 1;
    try
        while True do
        begin
            WebServer := WebSite.GetObject('IIsWebServer', IISServerIndex);
            OneClickSiteComboBox.Items.Add(WebServer.Name);
            IISServerIndex := IISServerIndex + 1;
        end;
    except
    end;

Извините, если один или два комбинированных списка названы неверно.Я скопировал его из моего источника и попытался сопоставить его с вашими именами.Он в основном подключается к IIS и перечисляет имена веб-серверов.По какой-то причине они выглядят как ID: (

Мне также не понадобилась вторая функция (ваш сайт)

MSDN упоминает, что имя может быть переопределено для отображения ключей, но не 'Я не схожу с ума, пытаясь выяснить, где это может быть переопределено, если это ошибка. http://msdn.microsoft.com/en-us/library/ms525545%28VS.90%29.aspx

...