Команда DOS для вывода списка всех виртуальных каталогов в IIS 6

Я ищу команду DOS для вывода списка всех сайтов и виртуальных каталогов в IIS 6 под Windows 2003. Я знаю, что есть способы сделать это с помощью Powershell / WMI, VBS, C# и т. Д. Но все, что мне нужно, это быстро и грязно, без суеты способ сделать это из DOS, без необходимости создавать какие-либо новые файлы на веб-сервере.

РЕДАКТИРОВАТЬ: При исследовании этого вопроса мне удалось придумать однострочную, которая делает это, но, пожалуйста, предложите альтернативу, если у вас есть более элегантное решение, которое соответствует критериям выше.

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"

Команда выводит список идентификаторов виртуальных каталогов, а также "понятное имя" и путь для каждого, например:

/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 (и читает метабазу от нашего имени).

    • ENUM /P /w3svc Параметр говорит, что он должен выдавать список всех сайтов и идентификаторов виртуальных каталогов, начиная с корневого узла.
    • Переключатель 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 запускает AdsUtil с GET параметр для получения свойства ServerComment для данного сайта / виртуального каталога. Это понятное человеку имя в IIS. К сожалению, вывод немного сложнее разобрать. например, для /w3svc/1 вы вернетесь:

    ServerComment                   : (STRING) "Default Web Site"
    

    Трюк разбирает текст между кавычками.

    Обратите внимание, что узлы, которые нас не интересуют (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 извлекает физический путь, затем выводит все три фрагмента проанализированной информации на консоль.

Другие вопросы по тегам