搜索
查看: 11034|回复: 14

【分享】检查是否是以管理员方式运行程序

[复制链接]

39

主题

195

帖子

1269

积分

四级会员

Rank: 6Rank: 6

积分
1269
发表于 2012-10-21 00:07:24 | 显示全部楼层 |阅读模式
在开发NBCompressor2.0的时候,因为有自己定义的项目文件扩展名.nbcp,要进行注册表关联,改动了注册表的HKEY_CLASSES_ROOT根节点(操作这个要管理员权限),所以新的问题就如何让程序提示以管理员方式运行。

这个问题我还是纠结了很久,看了一下VC源码,一头雾水,于是在aardio“范例”找到新大陆——获取物理序列号。 我理解这个,可能要获取到序列号,必须以管理员身份才能获取到。

以获取物理序列号这种方式判断是否以管理员方式运行的程序,个人不能确保100%有效(但Win8确实是这样的,有效啊!)。其中还要判断是否是 Windows Vista以后的操作系统,以前的XP/2003这些是不需要的。用现成最少的代码完成最好的目标,何乐而不为呢? 源码如下。

/*
* 检查是否是以管理员方式运行
* @access  public
* @return  bool
*/

isRunAS =
function(){
   
import win.version;
   
if (win.version.platformId == 2) {
        
if (win.version.majorVersion > 5) { //判断是win Vista系统后的操作系统版本
            import sys.hd;
            
var hdinfo = sys.hd.getInfo();
            
if (hdinfo.sSerialNumber == null) {
               
return false;
            }
else {
               
return true;
            }
        }
else {
            
return true;
        }
    }
else {
        
return true;
    }
}

if else 这些木有简化的, 目的是让更多人理解判断流程。 希望对有需求的人有帮助。


附注:aardio最新版本标准库已提供 process.admin.isRunAs() 用于
判断进程是否以管理方式运行,下面是示例代码:
  1. import console;
  2. import process.admin;

  3. var isAdmin,isXp = process.admin.isRunAs()
  4. console.log("是否Vista,WIN7,WIN8 管理员权限",isAdmin)
  5. console.log("是否XP操作系统",!!isXp)
复制代码
回复

使用道具 举报

39

主题

195

帖子

1269

积分

四级会员

Rank: 6Rank: 6

积分
1269
 楼主| 发表于 2012-10-21 00:10:44 | 显示全部楼层

如果逻辑有虫子,请大侠优化说明一下。谢谢

如果逻辑有虫子,请大侠优化说明一下。谢谢
回复

使用道具 举报

4

主题

874

帖子

4704

积分

荣誉会员

Rank: 8Rank: 8

积分
4704
发表于 2012-10-21 10:08:29 | 显示全部楼层

HKEY_CLASSES_ROOT 在win7下没有管理员权限是不可写的,但是可以读, 所以写完了读一下有没有写成功,就知道需不需要管理员权限了。用 runa

HKEY_CLASSES_ROOT 在win7下没有管理员权限是不可写的,但是可以读,
所以写完了读一下有没有写成功,就知道需不需要管理员权限了。用 runas请求管理员权限(论坛搜一下)

至于文件关联,并不需要写HKEY_CLASSES_ROOT,也不需要管理员权限。
直接写  HKEY_CURRENT_USER\Software\Classes 就可以了,你可以在注册表里打开看一下就知道了。

不过系统是让你写的,但是360,金山就要警告可疑启动项了(但不会阻止你写)
必须去他们的安全认证平台提交安全认证
回复

使用道具 举报

33

主题

543

帖子

3304

积分

荣誉会员

Rank: 8Rank: 8

积分
3304
发表于 2012-10-21 11:05:05 | 显示全部楼层

[u][b]方法一、判断当前进程是否"以管理员身份运行"[/b][/u] [url=http://blog.csdn.net/cometnet/article

方法一、判断当前进程是否"以管理员身份运行"
http://blog.csdn.net/cometnet/article/details/6612498

方法二、修改 manifest 文件,强制要求“以管理员身份运行”
123.png

可以使用 ResHacker 等工具,修改aardio发布的 exe 中的 manifest 资源,在最后一行“</assembly>”之前添加如下代码:
  1.     <!-- Identify the application security requirements. -->
  2.     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  3.         <security>
  4.             <requestedPrivileges>
  5.                 <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
  6.             </requestedPrivileges>
  7.         </security>
  8.     </trustInfo>
复制代码
效果如下(“aardio工程7.exe”为修改后的 exe 文件,另一个则为修改前的文件):
1.PNG

方法三、使用 NSIS 等安装打包工具
添加文件关联可以在程序安装的时候由安装程序代理完成,而这些在 NSIS、Inno Setup 中很容易实现,安装程序会替你考虑管理员权限问题。
回复

使用道具 举报

39

主题

195

帖子

1269

积分

四级会员

Rank: 6Rank: 6

积分
1269
 楼主| 发表于 2012-10-21 12:50:13 | 显示全部楼层

@lujjjh 的第2个方法不错,简单快捷。 如果aardio能提供一个属性功能,在发布的时候用第2种方法,就给力了。

@lujjjh 的第2个方法不错,简单快捷。
如果aardio能提供一个属性功能,在发布的时候用第2种方法,就给力了。
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 2012-10-21 17:28:31 | 显示全部楼层

不需要管理权限可以完成的操作,为什么要主动去请求管理权限呢? 我觉得程序应当尽可能不要去申请管理权限,能用普通权限完成的事,就不要搞的用户很紧张。 其他

不需要管理权限可以完成的操作,为什么要主动去请求管理权限呢?
我觉得程序应当尽可能不要去申请管理权限,能用普通权限完成的事,就不要搞的用户很紧张。

其他工具可以轻松完成的操作,也没有必要都集成到aardio里。
我们用aardio是因为他简单,而不是因为他无所不能,无所不能的开发工具已经有很多。
回复

使用道具 举报

39

主题

195

帖子

1269

积分

四级会员

Rank: 6Rank: 6

积分
1269
 楼主| 发表于 2012-10-21 18:08:35 | 显示全部楼层

[quote][size=2][color=#999999]编程 发表于 2012-10-21 17:28[/color] [url=forum.php?mod

编程 发表于 2012-10-21 17:28
不需要管理权限可以完成的操作,为什么要主动去请求管理权限呢?
我觉得程序应当尽可能不要去申请管理权限 ...

大侠,在Win8下,注册表根节点HKEY_CLASSES_ROOT ,如果要对他进行写的操作,必须要管理员,不然要报错。 所以才有了那个判断的想法。

点评

这个当然是有必要的,我指的是你说的文件关联,如果可以不去请求管理权限那当然最好不要去用,你看快手都不需要管理权限,至少大多数情况都可以避免,除了杀毒软件这类一般没有这个需求,难免会让用户误解。  发表于 2012-10-22 10:18
回复

使用道具 举报

1

主题

27

帖子

345

积分

二级会员

Rank: 3Rank: 3

积分
345
QQ
发表于 2012-10-22 10:02:52 | 显示全部楼层

又学到了 几招 哈哈 以后那啥都用管理员权限{:3_46:}

又学到了 几招 哈哈 以后那啥都用管理员权限
回复

使用道具 举报

39

主题

205

帖子

1351

积分

四级会员

Rank: 6Rank: 6

积分
1351
发表于 2012-10-22 17:13:19 | 显示全部楼层

好东西,刚好了解到权限操作问题

好东西,刚好了解到权限操作问题
回复

使用道具 举报

53

主题

277

帖子

1738

积分

四级会员

Rank: 6Rank: 6

积分
1738
发表于 2012-10-31 21:31:21 | 显示全部楼层

[quote][size=2][color=#999999]lujjjh 发表于 2012-10-21 11:05[/color] [url=forum.php

lujjjh 发表于 2012-10-21 11:05
方法一、判断当前进程是否"以管理员身份运行"
http://blog.csdn.net/cometnet/article/details/6612498

...

第二种修改好像要复制到新位置 才会生效啊...

点评

应该是缓存机制的缘故  发表于 2012-10-31 21:41
回复

使用道具 举报

48

主题

593

帖子

3336

积分

五级会员

Rank: 8Rank: 8

积分
3336
发表于 2012-12-23 22:55:34 | 显示全部楼层

这个记录一下 谢谢

这个记录一下 谢谢
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2012-12-23 23:51:17 | 显示全部楼层

最新版本已支持自定义Manifest了。 首先生成一次EXE文件,可以看到工程目录下自动生成了默认的 /.build/Manifest.xml 可以用记事本

最新版本已支持自定义Manifest了。
首先生成一次EXE文件,可以看到工程目录下自动生成了默认的 /.build/Manifest.xml
可以用记事本打开编辑此文件后保存再生成EXE即可。
回复

使用道具 举报

39

主题

195

帖子

1269

积分

四级会员

Rank: 6Rank: 6

积分
1269
 楼主| 发表于 2012-12-24 10:26:18 | 显示全部楼层

感谢老大!!!

感谢老大!!!
回复

使用道具 举报

0

主题

2

帖子

12

积分

新手入门

Rank: 1

积分
12
发表于 2012-12-26 08:14:09 | 显示全部楼层

不错,收藏一下

不错,收藏一下
回复

使用道具 举报

0

主题

34

帖子

190

积分

一级会员

Rank: 2

积分
190
发表于 2013-12-2 15:08:29 | 显示全部楼层

[i=s] 本帖最后由 浪子天涯 于 2013-12-2 15:33 编辑 [/i] 感谢分享,用install实现了uac权限,然后用process.adm

本帖最后由 浪子天涯 于 2013-12-2 15:33 编辑

感谢分享,用install实现了uac权限,然后用process.admin.isRunAs()代码检测了下,发现已是管理员权限了。uac权限好像和管理员权限有区别的吧??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 04:18 , Processed in 0.093750 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表