В 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 должен создать и прочитать временный файл?