PID пула приложений IIS
Кто -нибудь знает способ получить пул приложений, связанный с идентификатором процесса? Я использую Win32_Process для запроса сервисов W3WP и возврата PID, теперь я пытаюсь связать пул приложений с ним.
10 ответов
Если вы просто используете командную строку, чтобы выяснить это ad-hoc, вы можете сделать это тоже:
Сценарий уже находится в systemroot\system32 на Windows Server 2003, поэтому просто перейдите в командную строку и введите iisapp.vbs (.vbs не является обязательным), и вы получите мгновенный список всей информации пула приложений, которую вы всегда хотел знать. Возможно, вам придется ввести cscript iisapp.vbs, если CScript не является хостом сценария WSH по умолчанию.
Давайте посмотрим пример вывода:
W3WP.exe PID: 1468 AppPoolId: AppPoolForSite1.com
W3WP.exe PID: 3056 AppPoolId: AppPoolForSite2.com
W3WP.exe PID: 1316 AppPoolId: AppPoolForSite3.com
Майкрософт документирует это прямо изо рта лошади.
На Windows Server 2008 это изменилось.
в systemroot\system32\inetsrv вы найдете appcmd.exe
с помощью
appcmd list wp
Вы получите список всех рабочих процессов и приложений, которые они обслуживают.
Если вы работаете в Windows Server 2008 и хотите, чтобы PID передавался другому сценарию или команде, вы можете использовать это:
c:\windows\system32\inetsrv\appcmd list wps /apppool.name:"My Application Pool" /text:WP.NAME
Например, чтобы создать пакетный сценарий, который создает дамп памяти определенного пула приложений, используйте это:
c:\windows\system32\inetsrv\appcmd list wps /apppool.name:"My Application Pool" /text:WP.NAME > "%temp%\pid.txt"
for /F %%a in (%temp%\pid.txt) do c:\debugger\adplus.exe -hang -o d:\dumps -p %%a
pause
Я только что обнаружил, что вы также можете найти это в пользовательском интерфейсе для IIS 7. Выберите свой узел веб-сервера и откройте "Рабочие процессы". Это покажет имя каждого пула приложений вместе с идентификатором процесса и сведениями об использовании.
Вы можете использовать диспетчер задач для просмотра имени пользователя, под которым выполняется процесс (который в общем случае совпадает с именем пула приложений), и идентификатора процесса, но вы должны включить эти столбцы в диспетчере задач, и он также предполагает имя пользователя, под которым запускается процесс, совпадает с именем пула приложений (насколько я знаю, оно используется по умолчанию, если только не используется Sharepoint и т. п.).
Также обратите внимание, что все методы, перечисленные на этой странице, могут отображать только те процессы, которые выполняются в данный момент, а это означает, что если ваш конкретный процесс завершил работу из-за простоя, вы должны сначала использовать сайт, чтобы вывести процесс в список, а в вашем случае это означает, что вы должны сначала получить доступ ко всем сайтам, чтобы убедиться, что процесс, связанный с ними, запущен.
Откройте диспетчер IIS ("Выполнить"> "Inetmgr"), выберите корневой уровень в левом дереве навигации по сайту и в "Панели представления функций" выберите "Рабочие процессы"
Нажмите "Рабочие процессы", чтобы получить подробную информацию обо всех рабочих процессах, которые в данный момент выполняются.
Из этого списка вы получите имя пула приложений, идентификатор процесса
ServerManager serverManager = new ServerManager();
ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;
Попробуйте работать с этим, и он должен получить то, что вам нужно.
Это должно сделать это.
public string getAppPoolName(int pid)
{
ServerManager serverManager = new ServerManager();
ApplicationPoolCollection apc = serverManager.ApplicationPools;
foreach (var app in apc)
{
var workers = app.WorkerProcesses;
foreach (var w in workers)
{
if (w.ProcessId == pid)
{
return app.Name;
}
}
}
return string.Empty;
}
PID и пул приложений с указанием названия:
$AppPoolName = 'AppPoolForSite1'
(Get-ItemProperty IIS:\AppPools\$AppPoolName -Name WorkerProcesses).Collection.processId
Если у вас есть несколько пулов приложений и вы хотите узнать PID каждого из них. Вы можете запустить powershell ниже, который будет перебирать все пулы приложений на машине, запрашивать PID и отображать имя пула приложений и PID в удобном формате таблицы.
import-module webadministration
$dirs = dir IIS:\AppPools\
foreach($dir in $dirs)
{
Write-Output([pscustomobject]@{
Name = $dir.Name
PID = (dir IIS:\AppPools\$($dir.Name)\WorkerProcesses).ProcessId
})
}