C# WPF应用使用WMI、ETW功能仅管理员可运行问题咨询
问题解答
1. 开发设备无需额外权限的原因
你开发时大概率是用Visual Studio直接启动调试,而日常运行的Visual Studio默认就是管理员权限,调试启动的应用会直接继承VS的管理员权限,你不会感知到权限要求。另外如果你的开发设备UAC通知等级调到了最低,应用请求权限时会自动静默授予,也不会弹出提示。还有部分WMI、ETW的受限权限,对本地管理员组的账户默认在非提升模式下也开放部分访问权限,所以不会触发报错。
2. 需管理员权限的功能及验证方式
需要管理员权限的是第二项,使用TraceEventSession捕获ETW事件的功能:默认创建全局ETW会话、捕获其他进程的ETW事件都要求管理员权限,而ManagementObjectSearcher收集常规硬件信息普通用户权限即可正常调用。
验证方式很简单:分别注释掉其中一项功能后打包测试,在普通权限下运行即可定位到触发权限要求的模块,也可以直接在代码中捕获权限异常的调用栈,确认抛出异常的代码段所属功能。
3. 免管理员权限的解决方案
有以下两种可行方案:
- 调整ETW会话类型:如果你只需要统计当前应用自身的帧率,不需要捕获其他进程的绘制事件,可将ETW会话设置为用户级私有会话,不需要管理员权限即可创建;如果是统计WPF自身的帧率,直接用WPF自带的
CompositionTarget.Rendering事件计算帧间隔即可,完全不需要调用ETW接口。 - 拆分权限模块:如果必须捕获其他进程的帧率,可将ETW统计逻辑拆分为独立的Windows服务,安装时提前为服务配置对应的运行权限,主程序保持普通权限运行,通过本地RPC、共享内存等方式和服务通信获取FPS数据。
4. 不会自动弹出权限申请提示的原因
你没有在项目的应用程序清单(app.manifest)中配置权限提升要求,默认的清单配置是asInvoker,即应用继承启动它的父进程的权限,不会主动触发UAC权限提升申请。你只需要在项目中添加应用程序清单文件,将requestedExecutionLevel节点的level属性设置为requireAdministrator,重新打包后启动应用就会自动弹出UAC权限申请提示。
内容的提问来源于stack exchange,提问作者gavrilikhin.d
相关产品推荐
相关产品推荐

