PID пула приложений IIS
-
09-09-2019 - |
Вопрос
кто - нибудь знаком со способом получения пула приложений , связанного с идентификатором процесса?Я использую Win32_Process для запроса служб W3WP и возврата PID, теперь я пытаюсь получить пул приложений, связанный с ним.
Решение
Если вы просто используете командную строку, чтобы разобраться в этом 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 wp
вы получите список всех рабочих процессов и того, какой apppool они обслуживают.
Если вы работаете на 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.Выберите свой узел веб-сервера и откройте "Рабочие процессы".При этом будет показано имя каждого пула приложений вместе с идентификатором процесса и сведениями об использовании.
ServerManager serverManager = new ServerManager();
ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;
Попробуйте поработать с этим, и это должно дать вам то, что вам нужно.
Вы можете использовать диспетчер задач для просмотра имени пользователя, под которым выполняется процесс (которое, как правило, совпадает с именем пула приложений), и идентификатора процесса, но вы должны включить эти столбцы в диспетчере задач, и он также предполагает, что имя пользователя, под которым выполняется процесс, совпадает с именем пула приложений (которое, насколько я знаю, используется по умолчанию, если только вы не используете Sharepoint и тому подобное).
Также обратите внимание, что все методы, перечисленные на этой странице, могут отображать только процессы, которые выполняются в данный момент, что означает, что если ваш конкретный процесс завершает работу из-за простоя, вам сначала нужно использовать сайт, чтобы отобразить процесс в списке, и в вашем случае это означает, что вы должны сначала получить доступ ко всем сайтам, чтобы убедиться, что связанный с ними процесс запущен.
Это должно сработать.
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;
}
Откройте диспетчер IIS ( Выполнить> Inetmgr ), выберите корневой уровень в левом дереве навигации по сайту и на “Панели просмотра компонентов” выберите “Рабочие процессы”.
Нажмите на “Рабочие процессы”, чтобы получить подробную информацию обо всех рабочих процессах, которые выполняются в данный момент
Из этого списка вы получите имя пула приложений, идентификатор процесса
PID и пул приложений, дающий его имя:
$AppPoolName = 'AppPoolForSite1'
(Get-ItemProperty IIS:\AppPools\$AppPoolName -Name WorkerProcesses).Collection.processId