DOS命令列出IIS 6中的所有虚拟目录

时间:2012-11-04 11:14:49

标签: iis-6 cmd virtual-directory sites adsutil.vbs

我正在寻找一个DOS命令来列出Windows 2003下IIS 6中的所有站点和虚拟目录。我知道有很多方法可以使用Powershell / WMIVBS,{{3}来执行此操作但是,我想要的只是一个快速而肮脏,毫不费力的方法从DOS完成它,而无需在Web服务器上创建任何新文件。

编辑:在研究这个问题时,我设法提出了一个单行程,但如果你有一个符合上述标准的更优雅的解决方案,请提出建议。

1 个答案:

答案 0 :(得分:4)

这是我想出的:

@FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO @FOR /F delims^=^"^ tokens^=2 %B IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs GET %A/ServerComment') DO @FOR /F delims^=^"^ tokens^=2 %C IN ('@cscript %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/Root/Path') DO @ECHO %A %B "%C"

该命令输出虚拟目录ID的列表,以及"友好名称"和每个的路径,例如:

/w3svc/1 Default Web Site "c:\inetpub\wwwroot"
/w3svc/1236224994 FunWidgets "C:\Inetpub\wwwroot\FunWidgets"
/w3svc/1359392326 JimSmith.com "C:\Inetpub\wwwroot\JimSmith"
/w3svc/1835917338 BouncyToys "C:\Inetpub\wwwroot\bouncytoys"
/w3svc/198968327 AvalonWest "C:\Inetpub\wwwroot\AvWest"

如果要将输出通过管道传输到文本文件,请先确保它不存在,然后将>> filename.txt附加到上面的命令中。 (例如:DEL sites.txt & ... >> sites.txt

这里有一个关于这个令人费解的命令如何运作的细分:

  1. @以每个语句为前缀,以避免回显语句本身,这会污染输出。

  2. @FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO

    调用与IIS6一起安装的AdsUtil.vbs(并代表我们读取metabase)。

    • ENUM /P /w3svc参数告诉它从根节点开始吐出所有站点和虚拟目录ID的列表。
    • nologo开关禁止通常的CScript版权前导码,只渲染我们感兴趣的输出。双反斜杠用于转义斜杠字符,因为我们在一个内部字符串。
    • 单引号中部分的输出类似于以下内容:

      [/w3svc/1]
      [/w3svc/1236224994]
      [/w3svc/1359392326]
      [/w3svc/1835917338]
      [/w3svc/198968327]
      [/w3svc/AppPools]
      [/w3svc/Filters]
      [/w3svc/Info]
      

    这被传递到FOR /F,它遍历每一行。 delims=[]告诉FOR将方括号视为分隔符。 DO之后的所有内容都将针对每一行执行一次,%A变量设置为方括号之间的任何内容。 (如果这是批处理文件,请改为使用%%A)。

  3. @FOR /F delims^=^"^ tokens^=2 %B IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/ServerComment') DO

    第二个FOR块使用GET参数运行AdsUtil,以检索给定站点/虚拟目录的ServerComment属性。这是IIS中看到的人性化名称。不幸的是,输出解析起来有点棘手。例如对于/w3svc/1,您会回来:

    ServerComment                   : (STRING) "Default Web Site"
    

    careting trick解析引号之间的文字。

    请注意,我们不感兴趣的节点(AppPools,过滤器和信息)没有ServerComment属性,并且给出了没有引号的结果,例如:

    The path requested could not be found.
    ErrNumber: -2147024893 (0x80070003)
    Error Trying To GET the Object (GetObject Failed): w3svc/Filters
    

    因此,不会为它们调用命令行的剩余部分。

  4. @FOR /F delims^=^"^ tokens^=2 %C IN ('@cscript %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/Root/Path') DO @ECHO %A %B "%C"

    这个最终的FOR检索物理路径,然后将所有三段解析信息输出到控制台。