




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
判断进程是否以管理员权限运行关键词:安装包,UAC,管理员权限摘 要:安装包运行时,将执行写注册表、注册组件等高权限操作,在Win7及以上系统中就需要使用管理员权限,否则相关操作会执行失败。安装包一般都要设置以管理员方式运行,但是在UAC关闭且登录用户为标准用户情况下,没法申请到管理员权限,不能以管理员权限运行,所以不能进行正常的安装。所以需要检测安装包是否以管理员权限运行,如果不是,则提示需要管理员权限才能安装。1、 案例描述安装包运行时,将执行写注册表、注册组件等高权限操作,在Win7及以上系统中就需要使用管理员权限,否则相关操作将会执行失败。安装包一般都要设置以管理员方式运行,但是在UAC关闭且登录用户为标准用户情况下,没法申请到管理员权限,不能以管理员权限运行,所以不能进行正常的安装。所以需要检测安装包是否以管理员权限运行,如果不是,则提示需要管理员权限才能安装。本文讨论到的管理员权限均是指Win7及以上系统中的管理员权限。2、 管理员权限相关说明在维护TL安装包时,遇到管理员权限的问题,参考了QQ等安装包的做法,并对管理员权限与UAC的打开和关闭、登录用户的类型关系进行了分析和研究。2.1 QQ安装包的参考在UAC关闭且登录用户为标准用户情况下,QQ安装包申请不到管理员权限,不能以管理员权限运行,会弹出如下的提示框:TL安装包之前对于这种情况没有做相应的处理,QQ的做法是合理的,所以参考QQ,在不是以管理员权限运行时,给出类似的提示。2.2 管理员权限与UAC的打开和关闭、登录用户类型的关系在win7及以上的系统中,程序在什么情况下可以申请到管理员权限,在什么情况下申请不到,在这里就各种场景简单的说明一下。主要考虑当前的登入的用户类型、UAC的打开与关闭、程序本身有没有设置requireAdministrator属性。在VS2008及以上版本中,对于需要管理员权限的程序,可以通过内嵌manifest文件的方式,设置requireAdministrator(需要管理员权限),这样在程序启动时会申请管理员权限。工程的属性中对需要管理员权限的配置,如下图所示: 1、UAC打开 此种情况只讨论设置requireAdministrator属性如何申请到管理员权限的情形。对于没有设置requireAdministrator属性的程序,肯定是以非管理员权限运行的。 (1)登录的是超级管理员Administrator 默认情况下,超级管理员Administrator是禁用的,可以通过这样的途径来开启:右键计算机 -管理 -系统工具 -本地用户和组 -用户 -右键Administrator -属性 -取消账户禁用 -注销(不行就重启)-登陆Administrator即可。超级管理员在用户管理中是可以重命名的,但是是不能删除的。 对于设置了requireAdministrator属性的程序,启动时能申请到管理员权限。由于Administrator是超级管理员,权限最高的用户,所以在提权的时候不会弹出UAC提示窗口。 (2)登录的是管理员(非超级管理员Administrator) 在启动设置了requireAdministrator属性的程序时,会弹出UAC提示框,如下所示: (3)登录的是标准用户(非管理员) 在启动设置了requireAdministrator属性的程序时,需要通过管理员账户来提权,会弹出输入管理员密码的UAC提示框,如下: 输入管理员密码后,才能正常的启动程序。 2、UAC关闭 此种情况设置了requireAdministrator属性的程序和没有设置requireAdministrator属性的程序都要加以说明。 (1)登录的是超级管理员Administrator或者管理员(普通管理员) 在启动设置了requireAdministrator属性的程序,会申请到管理员权限,且不会弹出UAC提示框。对于没有设置requireAdministrator属性的程序,启动时会以管理员权限运行还是标准权限运行呢?经研究,发现也会以管理员权限运行。比如在运行中输入cmd,打开cmd窗口,窗口的标题中会加上“管理员”的字样,如下所示: 当然还有很多示例可以拿来加以验证。 (2)登录的是标准用户 在启动设置了requireAdministrator属性的程序,还会弹出提示输入管理员密码的提示框吗?UAC已经关闭,不会再弹出提示要输入管理员密码的提示框,那程序权限是如何处理的呢?查看系统关于UAC关闭时的说明如下: 由上可知,程序是申请不到管理员权限的,程序是可以启动的,但是所有执行需要管理员权限的操作都会返回失败。这就是QQ在申请不到管理员权限时弹出无法安装的提示的原因所在了。3、 判断当前进程是否以管理员权限运行上面详细叙述了各种场景下设置requireAdministrator的程序能否以管理员权限运行。我们需要在代码中判断当前进程是否以管理员权限运行,即在我们的安装包程序中进行判断。经查阅相关资料得知,调用GetTokenInformation函数,获取TOKEN_ELEVATION结构体信息,通过结构体中的TokenIsElevated字段就能判断出来,相关的代码如下:(代码要在win7及以上系统中运行)BOOL IsRunasAdmin() BOOL bElevated = FALSE; HANDLE hToken = NULL; CString strTip;/ Get current process tokenif ( !OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken ) )strTip.Format( _T(OpenProcessToken failed, GetLastError: %d), GetLastError() );AfxMessageBox( strTip );return FALSE;TOKEN_ELEVATION tokenEle;DWORD dwRetLen = 0; / Retrieve token elevation informationif ( GetTokenInformation( hToken, TokenElevation, &tokenEle, sizeof(tokenEle), &dwRetLen ) ) if ( dwRetLen = sizeof(tokenEle) ) bElevated = tokenEle.TokenIsElevated; elsestrTip.Format( _T(GetTokenInformation failed, GetLastError: %d), GetLastError() );AfxMessageBox( strTip );CloseHandle( hToken ); return bElevated; 上述函数,已经在上面的各种场景中进行了验证,是没有问题的。 之前在Windows核心编程第5版的第4章第5节“管理员以标准用户权限运行时”看到,书中也给出了一个方法,如下所示:(代码要在win7及以上系统中运行)BOOL CTestDlgDlg:GetProcessElevation( BOOL& bRunasAdmin ) HANDLE hToken = NULL;DWORD dwSize = 0; bRunasAdmin = FALSE;/ Get current process tokenif ( !OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken) )return FALSE;BOOL bResult = FALSE;TOKEN_ELEVATION_TYPE tokenEleType;/ Retrieve elevation type information if ( GetTokenInformation( hToken, TokenElevationType, &tokenEleType, sizeof(TOKEN_ELEVATION_TYPE), &dwSize ) ) / Create the SID corresponding to the Administrators groupbyte adminSIDSECURITY_MAX_SID_SIZE;dwSize = sizeof(adminSID);CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, &adminSID, &dwSize );if ( tokenEleType = TokenElevationTypeLimited ) / Get handle to linked token (will have one if we are lua)HANDLE hUnfilteredToken = NULL;GetTokenInformation( hToken, TokenLinkedToken, (VOID*) &hUnfilteredToken, sizeof(HANDLE), &dwSize);/ Check if this original token contains admin SIDBOOL bAdmin = FALSE;if ( CheckTokenMembership( hUnfilteredToken, &adminSID, &bRunasAdmin ) ) AfxMessageBox( _T(CheckTokenMembership return TRUE, bResult = TRUE );bResult = TRUE;/ Dont forget to close the unfiltered tokenCloseHandle( hUnfilteredToken ); else bRunasAdmin = IsUserAnAdmin();AfxMessageBox( _T(pElevationType != TokenElevationTypeLimited, bResult = TRUE );bResult = TRUE;/ Dont forget to close the process tokenCloseHandle( hToken );return bResult;对照上述各种场景,使用未配置requireAdministrator属性的TestDlg.exe 来对上述核心编程中的代码进行测试,测试结果如下:1、UAC打开:(1)在标准用户下: 1)直接双击运行,tokenEleType为TokenElevationTypeDefault,调用IsUserAnAdmin,返回FALSE,bRunasAdmin=FALSE;(RIGHT) 2)右键以管理员方式运行,输入管理员密码,通过管理员账户提权,tokenEleType为TokenElevationTypeFull,调用IsUserAnAdmin,返回TRUE,bRunasAdmin=TRUE;(RIGHT)(2)在管理员用户下: 1)直接双击运行,tokenEleType为TokenElevationTypeLimited,调用CheckTokenMembership,返回TRUE,bRunasAdmin=TRUE;(WRONG - 此种情况下判断是有问题的) 2)右键以管理员方式运行,直接提权,tokenEleType为TokenElevationTypeFull,调用IsUserAnAdmin,返回TRUE,bRunasAdmin=TRUE;(RIGHT)2、UAC关闭:(1)在标准用户下: UAC关闭,标准用户登录系统后,程序都是以非管理员权限运行。tokenEleType为TokenElevationTypeDefault,调用IsUserAnAdmin,返回FALSE,bRunasAdmin=FALSE;(RIGHT)(2)在管理员用户下: UAC关闭,管理员登录系统后,程序都是以管理员权限运行。直接运行,tokenEleType为TokenElevationTypeDefault,调用IsUserAnAdmin,返回TRUE,bRunasAdmin=TRUE;(RIGHT)所以综上,核心编程中提供的代码是有问题的。4、 判断其他进程是否以管理员权限运行上一节给出了如何判断当前进程是否以管理员权限运行的代码,稍加改造一下就可以判断其他进程是否以管理员权限运行。假设我们知道目标进程的进程id(在测试时,我们可以到任务管理器中查看目标进程的进程id),则可以调用OpenProcess得到进程句柄,然后再将这个句柄传递给OpenProcessToken。相关代码如下所示:(代码要在win7及以上系统中运行)DWORD dwPid = 2337; / target process idHANDLE hProcess = :OpenProcess( /*PROCESS_ALL_ACCESS*/PROCESS_QUERY_INFORMATION, FALSE, dwPid );if ( hProcess = NULL )strTip.Format( _T(OpenProcess to get the process handle failed, possible reason: the process id doesnt exsit, GetLastError: %d), GetLastError() );AfxMessageBox( strTip );return;BOOL bRunAsAdmin = IsRunasAdmin( hProcess );if ( bRunAsAdmin )strTip.Format( _T(Pid(%d) run as admin!), dwPid );elsestrTip.Format( _T(Pid(%d) dont run as admin!), dwPid );AfxMessageBox( strTip );CloseHandle( hProcess );BOOL IsRunasAdmin( HANDLE hProcess ) BOOL bElevated = FALSE; HANDLE hToken = NULL; CString strTip;/ Get current process tokenif ( !OpenProcessToken( hProcess/*GetCurrentProcess()*/, TOKEN_QUERY, &hToken ) )strTip.Format( _T(OpenProcessToken failed, GetLastError: %d), GetLastError() );AfxMessageBox( strTip );return FALSE;TOKEN_ELEVATION tokenEle;DWORD dwRetLen = 0; / Retri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兖州水产安全培训班课件
- 创造宣言新课件
- 化学品进厂安全培训课件
- 创建森林城市的课件
- 先导课和基础课件
- 内瘘绳梯式穿刺课件
- 26《赤壁》(公开课一等奖创新教学设计)统编版语文八年级上册
- 1《自然选择的证明》公开课一等奖创新教学设计统编版高中语文选择性必修下册
- 创伤性脑出血课件
- 《纸的发明》公开课一等奖创新教案
- 学堂在线 生活英语听说 章节测试答案
- 先心病常见病介入封堵治疗讲课件
- 锅炉安装改造维修管理制度
- 2025邮储银行面试题目及答案
- 企业合规经营及纳税证明书(5篇)
- 2025年云南文山砚山七乡发展投资有限公司招聘笔试参考题库含答案解析
- 湘艺版小学音乐四年级上册全册教案1
- 中医养生馆合作协议书范本
- 海底捞晋升面试题及答案
- 2025年理综试题及答案全国乙卷
- 2025年二次供水市场规模分析
评论
0/150
提交评论