Мне нужно приложение или сценарий, который отображает следующее: рабочий процесс, имя пула приложений, использование памяти и, возможно, использование процессора. Я знаком с использованием
% windir% \ system32 \ inetsrv \ appcmd.exe список wp
но это просто дает мне идентификатор workerproces и имя пула приложений. Затем я беру это и перекрестно ссылаюсь на диспетчер задач. Это работает, но я хотел бы более быстрого - почти приборной панели, как отображение информации. Я полагаю, что должно быть какое-то решение, которое показывает информацию без необходимости щелкать мышью, как проводник процессов. У кого-нибудь есть что-то конкретное, что они используют? Возможно ли это в PowerShell?
Да, PowerShell может сделать это с новым поставщик powershell для IIS это просто. Вот несколько примеров из прохождение данных во время выполнения при условии:
Состояние AppPool
PS IIS:\> cd AppPools
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Started
PS IIS:\AppPools> Stop-WebItem DemoAppPool
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Stopped
Рабочие процессы и запросы Командлет get-process не помогает определить, какой пул приложений обслуживает конкретный рабочий процесс. Однако это легко сделать:
PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses
processId Handles state StartTime
--------- -------
6612 326 1 3/28/2008 12:20:27 PM
обратите внимание, что если у вас есть регулярный PID
get-process -id pid
расскажет вам об использовании памяти
Если у вас нет IIS 7 и поставщика, вы можете использовать WMI. Прилагаемый скрипт подходит для большинства ваших требований, кроме использования ЦП. Сохраните приведенный ниже скрипт как get-webserverapppoolstats.ps1 (или как хотите).
Затем вы можете запустить сценарий с помощью:
./Get-WebServerAppPoolStats.ps1 'Server1', 'Server2', 'Server3' -IntegratedAuthentication ИЛИ Get-Content servers.txt | ./Get-WebServerAppPoolStats.ps1 -IntegratedAuthentication
param (
$webserver = $null,
$username,
$password,
[switch]$IntegratedAuthentication)
BEGIN
{
$path = $MyInvocation.MyCommand.Path
if ($webserver -ne $null)
{
if ($IntegratedAuthentication)
{
$webserver | &$path -IntegratedAuthentication
}
else
{
$webserver | &$path -username $username -password $password
}
}
$OFS = ', '
$Fields = 'CommandLine', 'Name', 'CreationDate', 'ProcessID', 'WorkingSetSize', 'ThreadCount', 'PageFileUsage', 'PageFaults'
$query = @"
Select $fields
From Win32_Process
Where name = 'w3wp.exe'
"@
$AppPool = @{Name='Application Pool';Expression={($_.commandline).split(' ')[-1]}}
$Process = @{Name='Process';Expression={$_.name}}
$RunningSince = @{Name='Running since';Expression={[System.Management.ManagementDateTimeconverter]::ToDateTime($_.creationdate)}}
$Memory = @{Name='Memory Used';Expression={'{0:#,#}' -f $_.WorkingSetSize}}
$Threads = @{Name='Thread Count';Expression={$_.threadcount}}
$PageFile = @{Name='Page File Size';Expression={'{0:#,#}' -f $_.pagefileusage}}
$PageFaults = @{Name='Page Faults';Expression={'{0:#,#}' -f $_.pagefaults}}
}
PROCESS
{
$server = $_
if ($server -ne $null)
{
if ($IntegratedAuthentication)
{
$result = Get-WmiObject -Query $query -ComputerName $server
}
else
{
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securepassword
$result = Get-WmiObject -Query $query -ComputerName $server -Credential $cred
}
$Server = @{Name='Server';Expression={$server}}
$result | Select-Object $Server, $AppPool, $Process, $RunningSince, $Memory, $Threads, $PageFile, $pageFaults
}
}
Я не знаю, почему часть «Имя сервера» в этом скрипте у меня не сработала, но я нашел обходной путь:
замените эту строку:
$ Server = @ {Имя = 'Сервер'; Выражение = {$ server}}
с этими двумя строками:
$ machine = New-Object system.string $ server
$ Server = @ {Имя = 'Сервер'; Выражение = {$ machine}}
как только я это сделал, все заработало отлично.