[英]How can I list websites on IIS7, from script, without using IIS6 compat pack (WMI veneer)
在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
}
我知道我以前可以安装IIS6兼容性包,但是可以在IIS7上运行此脚本 。
是否可以在不需要兼容性包的前提下获取网站列表?
我知道我可以从命令行运行AppCmd来执行此操作:
\Windows\system32\inetsrv\appcmd list sites
但是...我可以通过MSI中的自定义操作来运行它吗? 而且...如果没有,我该如何使用javascript做等效的事情(在IIS7上列出网站)?
编辑
这是我尝试从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()
不能访问标准输出,因此我将不得不将输出重定向到一个临时文件,然后读取输出。 我还没有尝试过。 这可能会带来一些安全问题; 我得看看。
是的,您可以从自定义操作中运行appcmd,就像执行运行exe的任何自定义操作一样。 首先,您应该编写DirectorySearch / FileSearch元素以查找可执行文件的完整路径。 接下来,使用ExeCommand属性添加自定义操作。 您可能正在尝试从用户那里获得反馈,所以请立即保留。 另外,考虑使用QuietExec以便不向用户显示控制台窗口。
顺便说一句,如果我的猜测是正确的,那么您正在尝试做这样的事情 。 希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.