Кто-нибудь знаком со способом получить пул приложений, связанный с идентификатором процесса? Я использую Win32_Process, чтобы запросить службы W3WP и вернуть PID, теперь я пытаюсь получить связанный с ним пул приложений.
PID пула приложений IIS
Ответы (9)
Если вы просто используете командную строку, чтобы понять это 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
Microsoft прямо из уст лошади документирует это.
В 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 и т.п.).
Также обратите внимание, что все методы, перечисленные на этой странице, могут отображать только те процессы, которые в настоящее время запущены, что означает, что если ваш конкретный процесс был отключен из-за времени простоя, вы должны сначала использовать сайт, чтобы вывести процесс в список, и в вашем случае это означает, что вы должны сначала получить доступ ко всем сайтам, чтобы убедиться, что связанный с ними процесс запущен.
appcmd
может не указывать пулы приложений SYSTEM / NETWORK SERVICE (я действительно не тестировал это), НЕ то, что пулы приложений под общим пользователем не будут работать с appcmd
. Ваше решение по-прежнему бесполезно в описанном мной случае: например, сервер Sharepoint с несколькими сайтами.
- person Shaamaan; 18.07.2012
appcmd
просто работает, ваше предложение МОЖЕТ сработать.
- person Shaamaan; 18.07.2012
ServerManager serverManager = new ServerManager();
ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;
Попробуйте поработать с этим, и вы получите то, что вам нужно.
Откройте диспетчер IIS («Выполнить»> «Inetmgr»), выберите корневой уровень в левом дереве навигации сайта и в «Панели просмотра функций» выберите «Рабочие процессы».
Щелкните «Рабочие процессы», чтобы получить подробную информацию обо всех рабочих процессах, которые выполняются в данный момент.
Из этого списка вы получите имя пула приложений, идентификатор процесса
Это должно сработать.
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