【翻译】使用PowerShell获取网站运行时数据

本文介绍了如何使用IIS7 PowerShell Provider管理站点和应用程序池的状态,包括启动、停止、回收等操作,并展示了如何获取当前运行的工作者进程、执行的请求及应用程序域的相关信息。

     原文链接:PowerShell Provider: Run-time Data

 

介绍

     站点的启动,停止, 应用程序池的回后或过期(time out), 接受的请求和发送的响应, AppDomains(应用程序域) 的大量

生成和关闭. IIS7 实现了一个所谓的 RSCA 接口(run-time state and control API) ,该接口允许您监视当前系统正在做的

工作.

     IIS 7.0 PowerShell Provider 使用该接口并以IIS Provider 名空间来暴露其中一些数据信息. 通过Get-WebItemState,

Start-WebItem, Stop-WebItem 和 Restart-WebItem 等cmdlets来配置站点和应用程序池的状态. 通过IIS 名空间来暴露

出来的运行时状态比如:当前运行的工作者进程,当前执行的请求和被加载的应用程序域(loaded AppDomains )等.

     本文使用的站点, applications 和虚拟目录在前一篇文章中已进行了创建.

站点和应用程序池状态

      开始查询web站点的状态.

站点状态

PS IIS:\ >  cd Sites
PS IIS:\Sites
>  Get - WebItemState IIS:\Sites\DemoSite
Started

 

     使用 Stop-WebItem cmdlet 来停止站点:

PS IIS:\Sites >  Stop - WebItem DemoSite
PS IIS:\Sites
>  Get - WebItemState IIS:\Sites\DemoSite
Stopped

 

     当然,启动站点的工作也差不多:

PS IIS:\Sites >  Start - WebItem DemoSite
PS IIS:\Sites
>  Get - WebItemState IIS:\sites\DemoSite
Started

应用程序池状态

      我们对应用程序池也施加相同操作:

PS IIS:\ >  cd AppPools
PS IIS:\AppPools
>  Get - WebItemState DemoAppPool
Started
PS IIS:\AppPools
>  Stop - WebItem DemoAppPool
PS IIS:\AppPools
>  Get - WebItemState DemoAppPool
Stopped


 

      除此之外,您也可从 AppPools 结点中获取这些状态属性. 下面我们做一个有趣的例子. 打开喇叭(电脑的声音)并执行

下面命令行(注:此时系统会用语音方式提示应用程序池被启动):

dir 'iis:\AppPools'  |   foreach  {[void](new - object  - com Sapi.SPVoice).Speak( " Application Pool State: " );}{ $poolState   =   " Application Pool  "   +   $_ .Name  + "  is  "   +   $_ .State; $poolState ;[void](new - object  - com Sapi.SPVoice).Speak( $poolState );}

 

     现在再次程序 DemoAppPool :

PS IIS:\AppPools >  Start - WebItem DemoAppPool

回收应用程序池

    应用程序池的不同之处(与站点等相比)在于它们可以被回收(recycled). 执行这个任务的 cmdlet 是:

Restart-WebItem (不是Recycle-WebItem). PowerShell 有着非常严格的命名规则,因此我们须使用

Restart-WebItem. 我们使用下面内容来扩展一下我们的例子:

  1. 创建一个对 'Default Web Site' 站页默认页面的请求
  2. 查询处理当前请求的工作者进程(worker process )的 PID 
  3. 回收该应用程序池
  4. 再次请求这个PID 以确保该进程被重启
1. 请求默认页面

     我们使用Net.WebClient 类去请求 http://localhost/. 这里不再显示输出信息,取而代之的仅是查看一

下当前响应内容的长度.

PS IIS:\AppPools >   $response   =  (new - object Net.WebClient).DownloadString( " http://localhost/ " )
PS IIS:\AppPools
>   $response .Length
689

 

2. 查询工作者进程(Worker Process) PID

    假设当前机器上没有其他正在运行的站点和应用,下面的命令行仅会返回一个:

PS IIS:\AppPools >  get - process  w3wp  |  select processname,id

ProcessName                             Id
-----------                               --
w3wp                                   
3684

     There is a better way to get to worker processes, handled a little later in this walkthrough.

3. 回收应用程序池

    我们使用 Restart-WebItem cmdlet 来回疏通应用程序池:

PS IIS:\AppPools >  Restart - WebItem DefaultAppPool

 

4. 查询工作者进程的 PID

    如果成功地回收了应用程序,那么您的进程ID就会发生变化.

PS IIS:\AppPools >  get - process  w3wp  |  select processname,id

ProcessName          Id
-----------            --
w3wp                 
5860

工作者处理和请求(Worker Processes and Requests)

    get-process cmdlet 不会找出当前工作者进程运行着那个应用程序池. 然而下面的方式可做到这一点:

PS IIS:\AppPools >  dir DefaultAppPool\WorkerProcesses

 processId                  Handles                    state StartTime
 
---------                    -------                      -----   ---------
 
6612                         326                          1   3 / 28 / 2008   12 : 20 : 27  PM

当前正在执行的请求(Currently Executing Requests) 

      注:下面的内容我实在是看不明白,所以直接将E文帖在这里,希望理解的朋友将内容发上来以便我及时更正。 

If your machine is not a production machine you will have a hard time looking at currently exeucting requests. The request is long gone until you make a request via Internet Explorer and get back into the PowerShell console. Here is a little helper; a request that takes a long time. 

 

Set - Content  " $env:systemdrive\inetpub\wwwroot\long.aspx "   " <%@ Page language=`"C#`"%><%System.Threading.Thread.Sleep(30000);Response.Write(`"slept for 30 seconds`");%> "

 

      如果想要显示当前正在执行的请求,您可以使用如下命令行 (注:get-item 命令所使用的进行ID会与您本机

上的有所不同): 

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses >  dir

Process   State      Handles  Start Time
Id
--------   -----        -------    ----------
6612      Running     737        3 / 31 / 2008   8 : 18 : 15  AM


PS IIS:\AppPools\DefaultAppPool\WorkerProcesses
>  (get - item  6612 ).GetRequests( 0 )


requestId    : d8000001800000f5
connectionId : d8000001600000f3
verb         : GET
url          : 
/ long.aspx
siteId       : 
1

 

      如果您想查看从执行请求开始到现在已过了多长时间的话:

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses >  (get - item  6612 ).GetRequests( 0 |  select url,timeElapsed

url                                        timeElapsed
---                                          -----------
/ long.aspx                                    2637

总结

      在本文中,您了解了如何查看 IIS 应用程序池和站点的状态. 如何启动和关闭它们. 您也了解了如何查看工作者

进程(worker processes)以及当前执行的请求.

 

     好了,今天的内容就到这里。

 

     原文链接:http://www.cnblogs.com/daizhj/archive/2008/12/11/1352718.html

     作者: daizhj, 代震军

     Tags: powershell,iis

     网址: http://daizhj.cnblogs.com/

转载于:https://www.cnblogs.com/daizhj/archive/2009/01/05/1352718.html

<think>嗯,用户的问题是关于在Windows 7的PowerShell获取BIOS HardwareMonitor的数据。首先,我需要回忆一下Windows系统中获取硬件信息的常用方法。通常,WMI(Windows Management Instrumentation)是主要的工具,因为它可以访问各种系统信息,包括硬件相关的数据。 用户提到的是BIOS和硬件监控数据,比如温度、风扇转速等。这候应该想到WMI中的相关类。比如,Win32_BIOS类可以获取BIOS信息,而硬件监控数据可能涉及其他类,如MSAcpi_ThermalZoneTemperature或者Win32_Fan等。不过需要注意的是,不同的硬件厂商可能提供不同的WMI类,或者有些数据可能需要特定的驱动程序支持,可能不是所有硬件都能通过标准WMI类获取。 接下来,我需要考虑如何在PowerShell使用WMI查询这些信息。PowerShell中常用的命令是Get-WmiObject,或者在新版本中使用Get-CimInstance。不过Windows 7可能更兼容Get-WmiObject。所以应该使用这个cmdlet。 首先,获取BIOS信息相对直接,使用Win32_BIOS类即可。比如: Get-WmiObject -ClassWin32_BIOS | Select-Object -Property *然后,关于硬件监控数据,可能需要查找特定的类。比如,温度可能存在于MSAcpi_ThermalZoneTemperature类,但需要确认这个类在用户系统上是否存在。此外,有些系统可能有厂商特定的类,比如Lenovo、Dell等可能有自己的WMI命名空间和类。 用户可能遇到的问题包括权限不足,或者相关的WMI类不存在。因此,在代码中需要处理异常,或者提示用户检查权限和硬件支持。 另外,可能需要使用管理员权限运行PowerShell脚本,否则访问某些WMI类会被拒绝。所以在回答中需要提醒用户以管理员身份运行脚本。 最后,考虑到不同硬件之间的差异,可能需要用户自行探索可用的WMI类,或者使用第三方工具如Open HardwareMonitor的WMI接口,但这可能需要额外的配置。 综上所述,解决方案是使用Get-WmiObject查询相关的WMI类,并处理可能的异常情况。同,提供示例代码,并解释每个部分的作用,以及可能遇到的问题和解决方法。</think>在Windows系统中可以通过WMI(Windows Management Instrumentation)获取硬件监控数据,以下是PowerShell实现方案: ```powershell # 获取BIOS基础信息 $bios = Get-WmiObject -Class Win32_BIOS Write-Host "BIOS信息:" $bios | Format-List Manufacturer,Name,SerialNumber,Version # 尝试获取温度数据(注意:可能需要管理员权限) try { $temp = Get-WmiObject -Namespace "root\WMI" -Class MSAcpi_ThermalZoneTemperature -ErrorAction Stop Write-Host "`n温度传感器:" $temp | ForEach-Object { $celsius = ($_.CurrentTemperature - 2732) / 10.0 "当前温度:{0:N1}°C" -f $celsius } } catch { Write-Warning "无法获取温度数据,可能硬件不支持或需要管理员权限" } # 尝试获取风扇转速(可能因硬件而异) try { $fan = Get-WmiObject -Namespace "root\WMI" -Class Win32_Fan -ErrorAction Stop Write-Host "`n风扇信息:" $fan | Format-List DesiredSpeed,Active } catch { Write-Warning "无法获取风扇数据,可能硬件不支持或需要管理员权限" } ``` 代码解释: 1. `Win32_BIOS`类包含BIOS基础信息 2. `MSAcpi_ThermalZoneTemperature`类提供温度数据(需要转换单位) 3. `Win32_Fan`类包含风扇信息 4. 需要以管理员身份运行PowerShell 5. 不同硬件厂商的WMI类可能不同 注意事项: - 硬件监控数据访问可能需要特定驱动支持 - 部分安全软件可能阻止WMI查询 - 不同主板/BIOS厂商的WMI实现可能不同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值