【问题标题】:DOS command to list all virtual directories in IIS 6列出 IIS 6 中所有虚拟目录的 DOS 命令
【发布时间】:2012-10-24 11:00:42
【问题描述】:

我正在寻找一个 DOS 命令来列出 Windows 2003 下 IIS 6 中的所有站点和虚拟目录。我知道使用Powershell / WMIVBSC# 等可以做到这一点。但所有我想要的是一种从 DOS 中快速、肮脏、简单的方法,无需在 Web 服务器上创建任何新文件。

编辑:在研究这个问题时,我设法想出了一个可以做到这一点的单线,但如果你有一个更优雅的解决方案符合上述标准,请提出一个替代方案。

【问题讨论】:

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


    【解决方案1】:

    这是我想出的:

    @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

      调用AdsUtil.vbs,它与IIS6一起安装(并代表我们读取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、Filters 和 Info)没有 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 检索物理路径,然后将所有三个解析信息输出到控制台。

    【讨论】:

    • 感谢分享。这不是递归搜索我。它仅列出“默认网站”。我需要改变的地方有路径吗?我正在本地测试。
    • @jmosesman:在 IIS 中,您的子节点上是否缺少 ServerComment 字段?如果是这样,请尝试不使用过滤器,即:@FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO @FOR /F delims^=^"^ tokens^=2 %C IN ('@cscript %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs //nologo GET %A/Root/Path') DO @ECHO %A "%C"。如果这不起作用,请单独尝试第 2 步:@FOR /F "delims=[]" %A IN ('@cscript //nologo %SystemDrive%\Inetpub\AdminScripts\adsutil.vbs ENUM /P /w3svc') DO @echo %A。如果仍然不满意,请恢复使用我超链接的非 DOS 技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多