问题描述
- CreateFile操作驱动器的权限问题
-
开发环境:win7 64位
开发工具:VS2010
开发背景:AxtiveX插件(DLL项目) 宿主为浏览器问题描述:
在使用C++代码获取硬盘序列号的时候,使用到了CreateFile函数。主要用到了CreateFile、DeviceIoControl函数。把关键代码提取到一个Win32工程下时:
问题1:生成的exe程序,可以在本机直接双击运行获取到序列号,但是在别的机器就需要使用管理员权限(XP系统除外),是为什么?
问题2:如果是exe程序: 可以设置UAC的执行级别为administrator,或者右键使用管理员权限运行,获取序列号。但是如果要在DLL工程中怎么办? (**现在的目的就是想如何在代码里实现普通用户操作驱动器的问题(不考虑XP)?**)说明:
尝试使用过 http://bbs.csdn.net/topics/250018148 的解决方案没有解决问题,也尝试在代码里提权(AdjustTokenPrivileges),也没有解决问题。
解决方案
- ActiveX技术的优点之一就在于它的分发性好,是下载即使用.
- UAC的目的就是为了控制普通用户,防止越权操作,对操作系统或公司集群造成安全风险.
- 假设你利用各种手段提权成功,你还需要过杀软.
所以,思路要变化,为什银行的支付插件、QQ的检测登陆插件都有一个promt(提示)?
你在这个安全规范的约束内做事,而不是去打破这个规范.
关于你要实现的问题,如果你是针对集团、公司开发ActiveX,请了解GroupPolicy和AxIs.
如果你针对个人,那就参考1、2楼.
解决方案二:
dll的程序,需要它运行的宿主程序提权。
除非操作系统有bug,或者用户关闭uac,否则无解。要不然还要uac干嘛。
解决方案三:
1.很有可能是你的本机关闭了UAC,所以可以直接运行,而其他机器需要管理员权限。DeviceIoControl 这些API是需要管理员权限的。所以你的调用程序需要管理员权限
2. DLL本身没有所谓的权限要求,但是它的API里面调用了高权限函数,那么就需要加载DLL的exe有对应的权限,也就是EXE自己要先提升Admin权限
3. 这些都是有OS UAC所控制的,目的就是加强权限控制,从而达到更安全的保护。目前看,Windows,vista,WIN7,WIN8, WIN10都会这么继续下去。所以你没办法绕过,只能遵守
解决方案四:
请参考AxIs:
https://technet.microsoft.com/en-us/magazine/2007.07.axis.aspx
解决方案五:
那在获取硬盘序列号的时候,还有没有其他方式不需要调用高权限的API? (WMI方式是否可靠?)
现在想做一个类似机器指纹的操作,如今拿到了CPUID和MAC,还想再拿到一个其他固件的标识,有没有推荐的(不考虑磁盘卷的属性)?