Как я могу перечислить сайты на IIS7, из сценария, без использования пакета IIS6 compat (WMI фанера) - PullRequest
1 голос
/ 20 марта 2011

В IIS6 я могу использовать WMI для отображения списка доступных веб-сайтов, например:

    var iis = GetObject("winmgmts://localhost/root/MicrosoftIISv2");
    var query  = "SELECT * FROM IIsWebServerSetting"

    // get the list of virtual servers
    var results = iis.ExecQuery(query);

    for(var e = new Enumerator(results); !e.atEnd(); e.moveNext()) {
        var site = e.item();
        // site.Name                   // W3SVC/1, W3SVC/12378398, etc
        // site.Name.substr(6)         // 1, 12378398, etc
        // site.ServerComment)         // "Default Web Site", "Site2", etc
        // site.ServerBindings(0).Port // 80, 8080, etc
    }

Я знаю, что могу запустить этот скрипт на IIS7, если я ранее установил пакет совместимости IIS6 .

Можно ли получить список веб-сайтов, не требуя пакета совместимости в качестве предварительного условия?

Я знаю, что могу запустить AppCmd, чтобы сделать это из командной строки:

\Windows\system32\inetsrv\appcmd list sites

Но ... я могу запустить это из пользовательского действия в MSI?И ... если нет, как я могу сделать эквивалентную вещь (список веб-сайтов на IIS7) из JavaScript?


РЕДАКТИРОВАТЬ
Вот как я пытался запустить команду изв Javascript.

function GetWebSites_IIS7()
{
    var ParseOneLine = function(oneLine) {
        ...a bunch of regex parsing here....
    };

    LogMessage("GetWebSites_IIS7() ENTER");
    var shell = new ActiveXObject("WScript.Shell");
    var windir = shell.Environment("system")("windir");
    // aka Session.Property("%WINDIR%")

    var appcmd = windir + "\\system32\\inetsrv\\appcmd.exe list sites";
    var oExec = shell.Exec(appcmd);

    var sites = [];
    while (!oExec.StdOut.AtEndOfStream) {
        var oneLine = oExec.StdOut.ReadLine();
        var line = ParseOneLine(oneLine);
        LogMessage("  site: " + line.name);
        sites.push(line);
    }

    return sites;
}

Это работает, но на короткое время появляется видимое окно консоли, которое затем исчезает.Не выглядит очень отполированным.Я думаю, что могу избежать окна консоли, используя shell.Run() вместо shell.Exec().Но shell.Run() не дает доступа к стандартному выводу, поэтому мне придется перенаправить вывод во временный файл, а затем прочитать вывод.Я еще не пробовал это.Это может привести к некоторым проблемам безопасности;Мне придется посмотреть.


Связанный:
Где и как мой CustomAction должен создать и прочитать временный файл?

1 Ответ

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

Да, вы можете запускать appcmd из настраиваемого действия так же, как и любое настраиваемое действие, запускаемое exe.Прежде всего, вы должны создать элементы DirectorySearch / FileSearch , чтобы найти полный путь к исполняемому файлу.Затем добавьте настраиваемое действие с атрибутом ExeCommand .Возможно, вы пытаетесь получить отзыв от пользователя, поэтому оставьте его незамедлительным.Кроме того, подумайте об использовании QuietExec , чтобы не показывать окно консоли своим пользователям.

Кстати, если мое предположение верно, вы пытаетесь сделать что-то вродеэто .Надеюсь, это поможет.

...