Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Тим Амманн
Скрипты WMI позволяют управлять рабочими процессами и доменами приложений (AppDomains) в IIS с относительной легкостью. Рабочие процессы IIS создаются службой активации процессов Windows (WAS) и выполняются W3wp.exe. Рабочие процессы могут содержать домены приложений, которые обычно создаются в ответ на запрос на страницу .aspx.
В этой статье описывается, как всего с помощью нескольких строк VBScript выполнить следующие задачи:
- Просмотр запросов, выполняющихся в данный момент, для рабочего процесса
- Узнать состояние всех рабочих процессов
- Выгрузить определенный домен приложения или все домены приложений
- Отображение всех доменов приложений и их свойств
Первые шаги
Убедитесь, что службы IIS и скрипты включены.
a. Если вы используете Windows Vista, откройте панель управления, программы и компоненты, а затем компоненты Windows. В разделе "Средства управления веб-сайтами" выберите "Средства и сценарии управления IIS", чтобы включить скрипты. б. Если вы используете Windows Server® 2008, откройте диспетчер серверов. Используйте мастер добавления ролей для установки веб-сервера IIS. На странице "Выбор служб ролей" в разделе "Средства управления" выберите "Сценарии и средства управления IIS".
Выполните команды от имени администратора. Чтобы открыть окно командной строки с повышенными привилегиями, нажмите кнопку "Пуск", выберите пункт "Все программы", щелкните "Аксессуары", щелкните правой кнопкой мыши командную строку и нажмите кнопку "Запуск от имени администратора". При открытии командной оболочки от имени администратора все приложения, выполняемые из этой командной оболочки, будут запускаться от имени администратора.
Сохраните файлы скриптов в текстовом формате с расширением VBS. Их можно запустить в командной строке с помощью синтаксиса "cscript.exe <scriptname.vbs>".
Перед началом создайте резервную копию файла System32\inetsrv\config\applicationhost.config с помощью средства AppCmd. Резервная копия позволит вам восстановить IIS в его исходное состояние, просто заменив более позднюю версию на исходную. Чтобы создать резервную копию, выполните следующие действия.
a. Откройте окно командной строки с повышенными привилегиями.
б. Введитеcd %Windir%\system32\inetsrv\c.Type appcmd add backup backupName для резервного копирования файла ApplicationHost.config, где backupName — это имя, которое вы указываете для резервной копии. Каталог с указанным именем резервной копии будет создан в каталоге%Windir%\system32\inetsrv\backup. Если имя не указано, appcmd автоматически создаст имя каталога с использованием текущей даты и времени.
Рабочие процессы
В этом разделе показано, как получить текущие запросы для каждого рабочего процесса на веб-сервере. Затем вы узнаете, как отобразить каждый рабочий процесс PID, состояние и пул приложений, к которому он принадлежит.
Получение запросов на выполнение
Одна из интересных новых функций IIS — это возможность видеть запросы, которые в настоящее время выполняются в рабочем процессе. Это можно сделать с помощью метода WorkerProcess.GetExecutingRequests.
Метод WorkerProcess.GetExecutingRequests в моментальном режиме сообщает о запросах, выполняющихся на тот момент, когда метод был вызван. Так как большинство запросов выполняются очень быстро, это может быть непросто для тестирования метода вручную с помощью веб-браузера. По этой причине вы создадите веб-страницу только для этой цели.
Используйте блокнот, чтобы поместить следующий текст в текстовый файл. Затем сохраните файл с помощью имени Sleep.aspx.
<% System.Threading.Thread.Sleep(30000)
Response.Write ("I'm finally finished...") %>
Поместите файл Sleep.aspx в каталог содержимого веб-сайта по умолчанию: %systemdrive%\inetpub\wwwroot
Созданный вами файл Sleep.aspx заставляет запрос на веб-страницу выполняться за 30 секунд. Это даст вам время для запуска скрипта, который будет отображать GetExecutingRequests в действии.
Метод GetExecutingRequests принимает пустую переменную массива в качестве параметра OUT, который затем заполняется объектами HttpRequest. Можно перебрать эти запросы, чтобы отобразить атрибуты каждого запроса. Следующий скрипт принимает выходные данные объекта HttpRequest и отображает текущий модуль, команду, имя узла и URL-адрес для каждого запроса.
Скопируйте следующий скрипт в блокнот и сохраните его с именем файла GetRequests.vbs.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oWorkerProcesses = oWebAdmin.InstancesOf("WorkerProcess")
For Each oWorkerProcess In oWorkerProcesses
' Place the requests queued for a process into an array variable.
oWorkerProcess.GetExecutingRequests arrReqs
' Show the number of requests queued.
If IsNull(arrReqs) Then
WScript.Echo "No currently executing requests."
Else
' Display the number of requests.
WScript.Echo "Number of currently executing requests: " & _
UBound(arrReqs) + 1
WScript.Echo
' List the properties of each request.
For Each oRequest In arrReqs
WScript.Echo "Module: " & "[" & oRequest.CurrentModule & "]"
WScript.Echo "Verb:" & "[" & oRequest.Verb & "]"
WScript.Echo "HostName: " & "[" & oRequest.HostName & "]"
WScript.Echo "Url: " & "[" & oRequest.Url & "]"
WScript.Echo
Next
End If
Next
Откройте окно командной строки с повышенными привилегиями и перейдите в каталог, в котором вы сохранили файл GetRequests.vbs.
Перед запуском скрипта введите http://localhost/sleep.aspx в адресную строку веб-браузера. Это запустит выполнение запроса и заставит браузер ожидать в течение 30 секунд, пока он ожидает отрисовки страницы Sleep.aspx.
Пока браузер по-прежнему ждет отрисовки страницы, запустите сценарий, введя следующий текст в окне командной строки, который вы только что открыли:
Cscript.exe GetRequests.vbs
Пример выходных данных
Выходные данные, которые вы видите, должны выглядеть следующим образом.
Number of currently executing requests: 2
Module: [ManagedPipelineHandler]
Verb:[GET]
HostName: [localhost]
Url: [/MyApp/]
Module: [ManagedPipelineHandler]
Verb:[GET]
HostName: [localhost]
Url: [/MyApp/default.aspx]
Получение состояния рабочего процесса
Объект WorkerProcess в поставщике WMI IIS имеет метод GetState, который показывает, запускается ли рабочий процесс, выполняется или останавливается. WorkerProcess также имеет два свойства, интересующие нас здесь: ApplicationPool и PID. Свойство ApplicationPool представляет пул приложений, к которому принадлежит рабочий процесс. Свойство PID содержит идентификатор процесса, который однозначно идентифицирует рабочий процесс.
Следующий код можно использовать для перечисления каждого идентификатора рабочего процесса и состояния и пула приложений. Если рабочие процессы не выполняются, скрипт завершится автоматически. Скопируйте код в блокнот и сохраните его с именем файла GetState.vbs.
' Connect to the WMI WebAdministration namespace.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Get the worker process instances.
Set oWorkerProcesses = oWebAdmin.InstancesOf("WorkerProcess")
' Get the ID of each worker process in the application pool and report its status.
For Each oWorkerProcess In oWorkerProcesses
' Report the worker process state via the GetStateDescription helper function.
WScript.Echo "WorkerProcess " & oWorkerProcess.ProcessID & ": " & _
GetStateDescription(oWorkerProcess.GetState)
WScript.Echo "Application Pool: " & oWorkerProcess.AppPoolName
WScript.Echo
Next
' The helper function translates the return value into text.
Function GetStateDescription(StateCode)
Select Case StateCode
Case 0
GetStateDescription = "Starting"
Case 1
GetStateDescription = "Running"
Case 2
GetStateDescription = "Stopping"
Case 3
GetStateDescription = "Unknown"
Case Else
GetStateDescription = "Undefined value."
End Select
End Function
Откройте окно командной строки с повышенными привилегиями и перейдите в каталог, в котором вы сохранили файл GetState.vbs. Запустите скрипт, введя следующее в открывшемся окне командной строки:
Cscript.exe GetState.vbs
Пример выходных данных
Выходные данные должны выглядеть следующим образом:
WorkerProcess 1336: Running
Application Pool: DefaultAppPool
WorkerProcess 3680: Running
Application Pool: Classic .NET AppPool
WorkerProcess 1960: Running
Application Pool: NewAppPool
Теперь, когда вы научились использовать скрипты WMI для выявления секретов рабочих процессов, сделайте то же самое для доменов приложений.
AppDomains
При первом получении запроса на страницу ASP.NET модуль управляемого модуля IIS создает домен приложения (AppDomain) в памяти. AppDomain обрабатывает запросы на страницы aspx или любую страницу, использующую управляемый код. Выгрузка и перечисление доменов приложений с помощью WMI проста, и в этом разделе показано, как это сделать.
Выгрузка определенного домена приложения
Выгрузка appDomain в IIS 7 и выше работает несколько иначе, чем в IIS 6.0. В то время как команда IIS 6.0 AppUnload выгружала внепроцессные приложения ASP, метод IIS 7 и выше AppDomain.Unload выгружает только домены приложений ASP.NET. Функциональные возможности AppUnload исчезли, так как режим совместимости IIS 5.0, который он поддерживает, больше не присутствует в IIS 7 и более поздних версиях.
Чтобы выгрузить определенный домен приложения, необходимо иметь возможность однозначно определить его. Объекты AppDomain имеют три ключевых свойства: ApplicationPath, ID и SiteName. Однако только одно из них может быть достаточно для ваших целей.
Кстати, свойство идентификатора appDomain не является числом, но путь, который выглядит следующим образом:
/LM/W3SVC/1/ROOT
Значение "1" в указанном пути — это идентификатор сайта (по умолчанию 1 соответствует веб-сайту по умолчанию).) Если необходимо сначала создать список доменов приложений сервера и их свойств, см. раздел "Перечисление доменов приложений" далее в этой статье.
Следующий скрипт выгрузит Домен приложения с именем Northwind. Скрипт выполняет итерацию по доступным доменам приложений, пока он не найдет его с соответствующим ApplicationPath. Скопируйте код в блокнот, замените "Northwind" на путь приложения AppDomain и сохраните файл с именем AppDomainUnload.vbs.
Откройте окно командной строки с повышенными привилегиями и перейдите в каталог, в котором вы сохранили файл AppDomainUnload.vbs. Запустите скрипт, введя следующее в открывшемся окне командной строки:
Cscript.exe AppDomainUnload.vbs
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppDomains = oWebAdmin.ExecQuery("SELECT * FROM AppDomain")
' Unload only the Northwind application domain.
For Each oAppDomain In oAppDomains
If oAppDomain.ApplicationPath = "/Northwind/" Then
oAppDomain.Unload
Exit For
End If
Next
Выгрузка всех доменов приложений
Выгрузка всех доменов приложений на сервере еще проще: вы просто извлекаете их, выполняете итерацию и выгрузите каждый из них в свою очередь.
В следующем примере выгружаются все домены приложений на веб-сервере IIS. Обратите внимание, что для получения доменов приложений используется простой WQL-запрос (WQL — версия WMI SQL).
Скопируйте код в блокнот и сохраните файл с именем AppDomainUnloadAll.vbs. Откройте окно командной строки с повышенными привилегиями и перейдите в каталог, в котором вы сохранили файл AppDomainUnloadAll.vbs. Запустите скрипт, введя следующее в открывшемся окне командной строки:
Cscript.exe AppDomainUnloadAll.vbs
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Get all the application domains on the Web server.
Set oAppDomains = oWebAdmin.ExecQuery("SELECT * FROM AppDomain")
' Unload all the application domains.
For Each oAppDomain In oAppDomains
oAppDomain.Unload
Next
В качестве альтернативы синтаксису запроса WQL можно использовать метод WMI InstancesOf, как и ранее с WorkerProcess:
Set oAppDomains = oWebAdmin.InstancesOf("AppDomain")
Перечисление доменов приложений
Вы можете отобразить все запущенные в настоящее время домены приложений и их свойства с помощью подхода, аналогичного предыдущему скрипту. Ниже приведен список свойств AppDomain:
- ApplicationPath
- Id
- IsIdle
- Физический путь
- ProcessId
- SiteName
В следующем скрипте показаны все свойства для каждого домена appDomain, кроме свойства Физического пути, но это можно легко добавить. Для удобства скрипт отображает свойства ключа и времени выполнения отдельно.
Скопируйте код в блокнот и сохраните файл с именем AppDomainProps.vbs. Откройте окно командной строки с повышенными привилегиями и перейдите в каталог, в котором вы сохранили файл AppDomainProps.vbs. Запустите скрипт, введя следующее в открывшемся окне командной строки:
Cscript.exe AppDomainProps.vbs
'Connect to the WMI WebAdministration namespace
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppDomains = oWebAdmin.InstancesOf("AppDomain")
WScript.Echo "AppDomain Count: " & oAppDomains.Count
WScript.Echo
ADCounter = 0
For Each oAppDomain In oAppDomains
ADCounter = ADCounter + 1
WScript.Echo "---- AppDomain " & ADCounter & " of " & _
oAppDomains.Count & " ----" & vbCrLf
WScript.Echo "[ Key properties ]"
WScript.Echo "ID: " & oAppDomain.ID
WScript.Echo "Site Name: " & oAppDomain.SiteName
WScript.Echo "Application Path: " & oAppDomain.ApplicationPath
WScript.Echo
WScript.Echo "[ Run-time properties ]"
WScript.Echo "Process ID: " & oAppDomain.ProcessID
WScript.Echo "Is idle: " & oAppDomain.IsIdle
WScript.Echo vbCrLf
Next
Пример выходных данных
Выходные данные должны выглядеть следующим образом:
AppDomain Count: 3
---- AppDomain 1 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/1/ROOT
Site Name: Default Web Site
Application Path: /
[ Run-time properties ]
Process ID: 3608
Is idle: False
---- AppDomain 2 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/2/ROOT/ContosoApp
Site Name: ContosoSite
Application Path: /ContosoApp/
[ Run-time properties ]
Process ID: 3608
Is idle: True
---- AppDomain 3 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/1/ROOT/Fabrikam
Site Name: Default Web Site
Application Path: /Fabrikam/
[ Run-time properties ]
Process ID: 2552
Is idle: False
Conclusion
В этой статье показаны некоторые основные методы скриптов WMI для получения сведений о рабочих процессах IIS и доменах приложений. Метод WMI InstanceOf и запросы WQL использовались для их извлечения. Ниже приведен краткий обзор представленных задач и используемых методов:
- Просмотр текущих запросов для рабочего процесса: WorkerProcess.GetExecutingRequests
- Получение состояния всех рабочих процессов: WorkerProcess.GetState
- Выгрузить определенный домен приложения или все домены приложений: AppDomain.Unload