判断进程是否以管理员权限运行Word文件下载.docx
- 文档编号:14110453
- 上传时间:2022-10-18
- 格式:DOCX
- 页数:12
- 大小:330.93KB
判断进程是否以管理员权限运行Word文件下载.docx
《判断进程是否以管理员权限运行Word文件下载.docx》由会员分享,可在线阅读,更多相关《判断进程是否以管理员权限运行Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
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()
{
BOOLbElevated= FALSE;
ﻩHANDLE hToken=NULL;
CStringstrTip;
//Getcurrent processtoken
ﻩif(!
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&
hToken))
ﻩ{
strTip.Format(_T("
OpenProcessTokenfailed,GetLastError:
%d"), GetLastError());
ﻩﻩAfxMessageBox(strTip);
ﻩreturnFALSE;
ﻩ}
ﻩTOKEN_ELEVATIONtokenEle;
DWORDdwRetLen=0;
ﻩ//Retrievetokenelevationinformation
if(GetTokenInformation(hToken, TokenElevation,&
tokenEle,sizeof(tokenEle),&
dwRetLen) )
ﻩ{
ﻩif(dwRetLen==sizeof(tokenEle) )
{
ﻩﻩbElevated=tokenEle.TokenIsElevated;
ﻩ}
ﻩ}
ﻩelse
ﻩstrTip.Format(_T("GetTokenInformation failed,GetLastError:
%d"
),GetLastError());
ﻩAfxMessageBox(strTip );
}
ﻩCloseHandle( hToken);
returnbElevated;
}
上述函数,已经在上面的各种场景中进行了验证,是没有问题的。
之前在《Windows核心编程》第5版的第4章第5节“管理员以标准用户权限运行时”看到,书中也给出了一个方法,如下所示:
(代码要在win7及以上系统中运行)
BOOLCTestDlgDlg:
:
GetProcessElevation( BOOL&
bRunasAdmin)
HANDLEhToken=NULL;
DWORDdwSize=0;
ﻩbRunasAdmin=FALSE;
ﻩ//Get current processtoken
ﻩif (!
OpenProcessToken( GetCurrentProcess(),TOKEN_QUERY,&
hToken))
ﻩreturnFALSE;
BOOLbResult= FALSE;
ﻩTOKEN_ELEVATION_TYPE tokenEleType;
//Retrieveelevationtypeinformation
ﻩif( GetTokenInformation( hToken,TokenElevationType, &
tokenEleType,
sizeof(TOKEN_ELEVATION_TYPE),&
dwSize))
{
ﻩ// CreatetheSIDcorresponding totheAdministratorsgroup
ﻩﻩbyte adminSID[SECURITY_MAX_SID_SIZE];
ﻩﻩdwSize = sizeof(adminSID);
ﻩCreateWellKnownSid( WinBuiltinAdministratorsSid,NULL, &
adminSID, &dwSize );
ﻩif(tokenEleType==TokenElevationTypeLimited)
ﻩ{
ﻩ//Gethandletolinkedtoken (willhaveone ifwearelua)
ﻩﻩﻩHANDLEhUnfilteredToken= NULL;
ﻩGetTokenInformation(hToken,TokenLinkedToken,(VOID*)&hUnfilteredToken,
ﻩsizeof(HANDLE),&dwSize);
//Checkifthis originaltokencontainsadminSID
ﻩBOOLbAdmin =FALSE;
if(CheckTokenMembership(hUnfilteredToken, &
adminSID, &bRunasAdmin ))
ﻩ{
ﻩAfxMessageBox(_T("
CheckTokenMembership returnTRUE,bResult=TRUE"
));
ﻩﻩﻩﻩbResult= TRUE;
ﻩﻩ}
ﻩﻩ// Don'
t forget to closetheunfilteredtoken
ﻩﻩCloseHandle(hUnfilteredToken);
}
ﻩelse
ﻩ{
ﻩﻩbRunasAdmin =IsUserAnAdmin();
AfxMessageBox(_T("
pElevationType!
=TokenElevationTypeLimited,bResult=TRUE"
ﻩﻩbResult=TRUE;
ﻩ}
}
//Don'
tforget toclosetheprocesstoken
ﻩCloseHandle(hToken );
returnbResult;
}
对照上述各种场景,使用未配置requireAdministrator属性的TestDlg.exe来对上述核心编程中的代码进行测试,测试结果如下:
1、UAC打开:
(1)在标准用户下:
1)直接双击运行,tokenEleType为TokenElevationTypeDefault,调用IsUserAnAdmin,返回FALSE,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 判断 进程 是否 管理员权限 运行