我想要一个显示以下内容的应用程序或脚本:工作进程、应用程序池名称、内存使用情况以及可选的 CPU 使用情况。我熟悉使用
%windir%\system32\inetsrv\appcmd.exe 列表 wp
但这只会让我获得工作进程 ID 和应用程序池名称。然后我将其与任务管理器交叉引用。这可行,但我希望信息显示得更快 - 几乎像仪表板一样。我想一定有某种解决方案可以显示信息,而不需要像进程资源管理器那样四处点击。有人有他们使用的特定东西吗?这在 powershell 中可行吗?
答案1
如果您没有 IIS 7 和提供程序,则可以使用 WMI。附加的脚本可以满足您的大多数要求,但 CPU 使用率除外。将以下脚本保存为 get-webserverapppoolstats.ps1(或您想要的任何名称)。
然后您可以使用以下命令运行脚本:
./Get-WebServerAppPoolStats.ps1'服务器1','服务器2','服务器3'-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
}
}
答案2
是的,powershell 可以使用新的IIS 的 powershell 提供程序很简单。以下是来自运行时数据演练假如:
应用程序池状态
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 cmdlet 无法帮助您确定特定工作进程正在服务哪个应用程序池。但是,这可以轻松完成:
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
会告诉你内存使用情况
答案3
我不知道为什么这个脚本的服务器“名称”部分对我来说不起作用,但我想出了一个解决方法:
替换此行:
$Server = @{名称='服务器';表达式={$server}}
用这两行:
$machine = 新对象系统.string $server
$Server = @{Name='Server';Expression={$machine}}
一旦我这样做了,它就完美地起作用了。