开发环境:Win8 + Vs2013 + Sqlserver2010 Express + .net4.0
最近在做后台框架,涉及到服务器性能监测部分,主要监测CPU使用率、内存使用率、磁盘使用率、网络流量这四个数据。在网上找了些资料,分别使用了WMI编程和System.Diagnostics.PerformanceCounter进行预研。相信大家都碰到过这样的情况,就是在Vs平台里进行调试,数据获取都没有问题,而只要部署到IIS,就会出现问题。System.Diagnostics.PerformanceCounter的错误页如下:
而WMI不会报出此类异常,但却获取不到数据。
这两种错误现象给我的第一感觉就是权限问题,主要是因为VS平台调试时使用的是当前登录用户,这个用户一般都是超管,权限最大能做任何事情。而IIS用户默认为IIS 来宾帐号,很多需要较高权限执行的操作根本无法执行。
根据这种思路,在网上查了较多资料,基本都是说让在System.Web配置节上增加<identity impersonate="true" userName="" password=""/>的标识,这种方式在无数据库项目中可以,但在我的项目中不行,最终会报出SqlServer数据库连接错误,而在事件管理器中的记录则是“Windows API 调用 CreateNamedPipeW 返回了错误代码: 1307。Windows 系统错误消息为: 这个安全 ID 不能分配为此对象的所有者。”。为此,我就在WMI和PerformanceCounter两种方式中进行测试,依然存在问题。
然后开始查WMi组件的授权使用,通过运行【wmimgmt.msc】可以启动WMI控件管理器,右键查看WMI控件属性,可以对其安全性进行设置。可我将Everyone 和Guest 用户分配全部权限并加入到授权用户中,WMI类仍然取不到数据,也就是说授权失败了。
难道彻底没有办法了吗?最后在VS2013中发现了端倪,看下图:
上图是VS2013进程调试的选择界面。IIS8会为每一个部署的网站,在运行时启动W3Wp.exe进程,VS2013进行IIS调试时,就选择附加到这个进程上即可。大家注意,在用户名列中,w3wp.exe进程的用户名为IIS AppPOOL\test,用户名前边为程序池的具体标记,test为部署网站的池名称,再查看IIS应用程序池:
其标识列为ApplicationPoolIdentity,按英文意思就是应用程序池标识,右键点击查看池的[高级设置],在[标识]属性里双击可以更改这种属性值,如下图:
在这里可以直接指定池用户,将内置帐户改为[LocalService]或[LocalSystem],点击确定保存即可。启动网站后问题解决。