Windows UAC权限详解以及因为权限不对等引发软件工具无法正常使用的实例分析

news2024/10/4 20:29:23

目录

​1、什么是UAC?

2、微软为什么要设计UAC?

3、标准用户权限与管理员权限

4、程序到底以哪种权限运行?与哪些因素有关?

4.1、给程序设置以管理员权限运行的属性

4.2、当前登录用户的类型

4.3、如何通过代码判断某个进程是否以管理员权限运行?

5、权限不对等引发软件工程无法正常使用的说明

5、案例1 - 无法在企业微信聊天框中启动安装包程序

6、案例2 - 使用Windbg时可能会遇到的权限不对等导致操作失败的问题

6.1、Windbg附加到目标进程失败

6.2、dump文件拖到以管理员权限运行的Windbg中没反应

7、案例3 - 使用Process Explorer工具查看不到某个进程加载的dll库列表

8、案例4 - API Monitor工具不能直接打开QQ的安装包程序

9、与管理员权限相关的其他问题

9.1、如何以管理员权限启动一个程序?

9.2、开机自启动程序不能设置管理员权限

10、最后


       在Windows系统中,我们使用软件时时常会遇到因权限不对等(一个是标准用户权限,一个是管理员权限)导致操作失败的问题,对Windows系统不太了解的人搞不清楚是怎么回事,今天我们就来详细讲讲与之相关的UAC权限,并给出具体的因为权限不对等引发工具无法使用的问题实例,供大家借鉴或参考。

​1、什么是UAC?

       UAC(User Account Control),用户帐户控制,是微软从Windows Vista开始引入的一种新的控制机制,其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到阻止恶意程序(有时也称为“恶意软件”)损坏系统的目的。

UAC用户账户控制机制主要是权限隔离,防止低权限、低安全的应用获取系统高等级权限。系统弹出UAC提示框,让用户确认是否信任、是否以管理员权限运行未知、未签名应用。

       当运行一些会影响系统安全的程序时,会自动触发UAC,用户确认后程序才能运行。比如当你运行一个安装程序(一般以管理员权限运行)或者打开一个未经验证的程序时,就会弹出类似如下的UAC提示框:(以在Win10系统中双击需要以管理员权限运行的QQ安装包程序为例)

​用户确认后程序才能继续运行。

       这个弹框是提示用户程序可能会对当前计算机进行修改,但这个提示对对绝大部分用户来说,好像并没有什么用。对普通用户而言,不但没什么用,反而会带来困扰(到底是该允许呢?还是不允许呢?)。并且老是时不时地弹框,用户也很厌烦!

       稍微专业的用户,可能会将UAC通知关闭掉。具体方法是,打开控制面板,然后点击“用户账户”,进入用户账户设置页面:

​然后点击“更改用户账户控制设置”,到如下的页面中:

​将滚动条拉到底,就可以将UAC通知关闭掉。关闭后,就不会再弹UAC提示框了。

       既然大家都不喜欢UAC提示框,微软为什么还要设计出这样一个别脚的东西来呢?

2、微软为什么要设计UAC?

        很多人都用过Windows XP,大多数人在用Windows XP时,使用的应该是管理员权限的账户。而在微软的设想中,普通用户都应该都使用标准账户。为什么大家不用标准账户?Windows XP里的标准账户,可能连程序都没法正常安装!没有人愿意为了装个程序,切换到管理员账户,装完了再切换回标准用户。

       当然,微软也注意到了这一点,于是就设计了UAC系统。UAC与Windows XP的用户账户权限管理,最大的不同在于,UAC对权限的控制很有弹性。它默认所有程序都是以标准权限运行的(无论你使用的是管理员账户还是标准账户),而当你运行一个需要管理员权限运行的程序时,UAC就会跑出来问你,这个程序需要管理员权限,要不要继续,如下:

​如果你允许,UAC就会提升权限,用管理员权限运行这个程序。

       其实从UAC的设计的本意上来看,它即避免了直接使用管理员账户导致权限控制形同虚设,又解决了标准用户需要频繁切换到管理员账户的问题(可能是模仿Linux系统中的su权限提升)。

       但Windows下的UAC一点也不智能,连复制文件之类的操作,甚至都会跑过来问你一下,很多用户不厌其烦,直接把UAC一关了事。尽管Windows对UAC做了一些改变和优化,但UAC还是很烦。比如,你第一次打开一个需要管理员权限的程序,UAC会尽忠职守地问你是否要提升权限;你第二次打开,UAC还会尽忠职守地问你是否要提升权限;你第三次打开,UAC还会尽忠职守地问你是否要提升权限……于是大家不愿意了,把UAC一关了之。

甚至有些人直接使用Administrator这个超级管理员用户,在这个用户登录下,所有程序默认以管理员权限运行,基本所有的操作都不会弹UAC提示框了。

       用过Android手机的用户都知道,Android里有个信任程序列表,一旦加入这个列表,再次运行的时候,系统就不会做多余的询问了。而Windows UAC中没有这个东西,因为微软的人认为,如果要创建一个信任列表,那这个列表必然会被储存在注册表或者硬盘的某个地方,这样hacker就可以想办法破解并修改这个列表了(就像XP的密码一样)。

       关于Windows UAC权限的详细说明,可以查看我的文章:

Vista/Win7 UAC兼容程序开发指南icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/139564971

3、标准用户权限与管理员权限

       Windows从Vista系统开始就引入了UAC权限控制机制,强化了管理员权限的概念,做了更严格的权限限制与安全控制。比如对一些权限敏感的路径,比如C:\Program Files、C:\Windows\system32,如果要在这些路径下创建文件、向文件中写数据,都是需要管理员权限的。再比如,在Windows系统的注册表中,如果要向HKEY_LOCAL_MACHINE路径下写入或修改内容时,也需要管理员权限的。

       程序运行权限主要有标准用户权限和管理员权限两种。有很多操作,都需要管理员权限,比如:

1)管理员权限的程序才能向系统安全敏感路径执行写操作,比如在C:\Program Files、C:\Windows\system32等系统路径中创建文件、拷贝文件,向这些路径下的文件执行写操作。
2)只有管理员权限的程序,才能向系统注册表路径HKEY_LOCAL_MACHINE下执行创建或写操作。没有管理员权限的程序,只能对HKEY_CURRENT_USER路径下执行写操作。
3)只有管理员权限的程序,才能向系统注册控件(要向HKEY_LOCAL_MACHINE路径下的注册表写入信息)。

       安装包程序需要执行一些需要管理员权限的操作:一般默认是将程序默认安装到C:\Program Files或者C:\Program Files (x86)敏感路径中;需要向系统注册控件;要向HKEY_LOCAL_MACHINE注册表路径下写入内容,所以安装包程序一般都要设置以管理员权限运行。如果是Visual Studio开发的程序,可以在exe主程序的工程属性中,链接器 -> 清单文件 -> UAC执行级别路径下

选择reguireAdministrator选项就可以了。 

       如果程序设置了以管理员权限运行的属性,则程序图标的右下角会显示小盾牌的图标,如下所示:

注意,如果在超级管理员Administrator登录的场景下,是看不到小盾牌的,因为在超级管理员登录的情况下,所有程序默认以管理员权限运行,不管程序有没有设置以管理员权限运行。

       此外,对于以标准用户权限运行的程序,如果要执行需要管理员权限才能正常执行的操作,会涉及到一个系统重定向的问题,详细说明可以参见我之前写的文章:VC++ Windows7及以上系统中管理员权限与UAC虚拟化详解(附源码)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/124096307


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:该精品技术专栏的订阅量已达到520多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达160多个,专栏文章已经更新到400多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏3:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


4、程序到底以哪种权限运行?与哪些因素有关?

        程序有没有以管理员权限运行,主要和两个因素有关,一个是当前系统登录的用户类型(标准用户、管理员用户以及超级管理员用户),一个是程序有没有设置以管理员权限运行的属性。下面以win10系统来说明,win10系统和win7系统有一些不同的,不过大体上是一样的。

4.1、给程序设置以管理员权限运行的属性

       如何给程序设置以管理员权限运行的属性呢?对于Visual Studio编译的程序,设置以管理员权限运行比较简单。只要在exe主程序的工程属性中,链接器 -> 清单文件 -> UAC执行级别,如下所示:

​我们选择reguireAdministrator选项就可以了。设置这个属性后,程序在启动时会自动向系统申请以管理员权限运行。如果系统不给程序管理员权限,则程序会启动失败。

如果当前启动的是设置了管理员运行权限的程序:

1)如果当前登录的管理员用户,则程序启动时直接以管理员权限运行。

2)如果当前登录的是标准用户,则启动时会弹出提权的提示框,需要输入一个管理员账户和密码才能将程序启动起来。

       这里还有个细节问题,需要注意一下。之前在帮兄弟项目组排查过一个程序设置以管理员权限运行无效的问题,可以参见我之前写的文章:

设置程序以管理员权限运行无效问题的排查过程分享icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/128158192

4.2、当前登录用户的类型

       程序到底以哪种权限运行,除了设置以管理员权限运行的属性外,还和当前登录的用户有关。

4.2.1、超级管理员Administrator登录

        如果使用Administrator超级管理员登录,不管程序有没有设置以管理员权限运行,都会以管理员权限运行。超级管理员Administrator的权限是最高的。

       在Windows系统中,默认情况下,超级管理员Administrator是禁用的,可以通过这样的途径来开启:右键计算机 ->管理 ->系统工具 ->本地用户和组 ->用户 ->右键Administrator ->属性 ->取消账户禁用

​超级管理员在用户管理中是可以重命名的。

4.2.2、管理员用户登录

       这里讲的管理员是普通管理员,不是超级管理员。可以右键点击程序,在弹出的右键菜单中点击“以管理员身份运行”:

这样启动起来的程序有管理员权限。

       如果是直接双击启动的或者通过桌面快捷方式或开始菜单快捷方式运行,到底是以何种权限运行,就要看程序有没有设置以管理员权限运行的属性。如果设置了,就以管理员权限运行;如果没设置,就以标准用户权限运行。

4.2.3、标准用户登录

       如果当前登录的是标准用户,那要看程序有没有设置以管理员权限运行的属性。如果没有配置,则以标准用户权限运行;如果配置了以管理员权限运行,则会弹出如下的提示框:(在标准用户登录下双击需要管理员运行权限的QQ安装包时弹出的提示框

​需要输入管理员账户和密码,要提权到管理员账户,然后才能以管理员权限运行。如果取消管理员账户的登录,则程序启动失败。

4.3、如何通过代码判断某个进程是否以管理员权限运行?

       有时我们需要在代码中判断目标进程是否以管理员权限运行,所以此处我们顺便说一下如何通过代码去判断进程是否以管理员权限运行的。

       Widnows系统提供了API函数GetTokenInformation可以检测到程序是否以管理员权限运行:

BOOL GetTokenInformation(
  [in]            HANDLE                  TokenHandle,
  [in]            TOKEN_INFORMATION_CLASS TokenInformationClass,
  [out, optional] LPVOID                  TokenInformation,
  [in]            DWORD                   TokenInformationLength,
  [out]           PDWORD                  ReturnLength
);

该函数的第一个参数传入与待检测进程的token值,第二个参数传入TokenElevation标记(检测进程有没有提权成功),第三个参数传入TOKEN_ELEVATION结构体对象地址,其中TOKEN_ELEVATION结构体定义如下:

typedef struct _TOKEN_ELEVATION {
    DWORD TokenIsElevated;
} TOKEN_ELEVATION, *PTOKEN_ELEVATION;

检测目标进程是否以管理员权限运行的代码如下:(下列函数IsRunasAdmin的参数是要检测的目标进程的句柄)

BOOL IsRunasAdmin( HANDLE hProcess )
{
    BOOL bElevated = FALSE;  
    HANDLE hToken = NULL;  
 
    CString strTip;
 
    // Get target process token
    if ( !OpenProcessToken( hProcess, TOKEN_QUERY, &hToken ) )
    {
        strTip.Format( _T("OpenProcessToken failed, GetLastError: %d"), GetLastError() );
        AfxMessageBox( strTip );
        return FALSE;
    }
 
    TOKEN_ELEVATION tokenEle;
    DWORD dwRetLen = 0;  
 
    // Retrieve token elevation information
    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 );  
    return bElevated;  
}

          假设我们要检测某个进程id对应的进程是否以管理员权限运行,相关测试代码如下:

CString strTip;
DWORD dwPid = 14060; // 目标进程的进程id
HANDLE hProcess = ::OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPid );
if ( hProcess == NULL )
{
    strTip.Format( _T("OpenProcess to get the process handle failed, possible reason: the process id doesn't exsit, GetLastError: %d"), GetLastError() );
    AfxMessageBox( strTip );
    return;
}
 
BOOL bRunAsAdmin = IsRunasAdmin( hProcess );
if ( bRunAsAdmin )
{
    strTip.Format( _T("Pid(%d) run as admin!"), dwPid );
}
else
{
    strTip.Format( _T("Pid(%d) don't run as admin!"), dwPid );
}

5、权限不对等引发软件工程无法正常使用的说明

       如果两个程序(进程)权限不对等,相互之间操作时可能会出现失败的现象,因为系统不允许两个权限不同的进程相互操作。具体的规则为:下面讲的高权限,指的是管理员权限;低权限,指的是标准用户权限

1)高权限(管理员权限)的进程,可以操作高权限(管理员权限)的进程。

2)高权限(管理员权限)的进程,可以操作低权限(标准用户权限)的进程。

3)低权限(标准用户权限)的进程,不能操作高权限(管理员权限)的进程。比如不能把磁盘上的dump文件拖入到以管理员权限运行的Windbg中打开。

4)低权限(标准用户权限)的进程,可以操作低权限(标准用户权限)的进程。

       比如我们的软件出问题了,我们需要使用一些工具去分析我们的软件(进程),例如使用Process Explorer工具查看进程的信jinc息,使用Windbg分析dump文件或者将Windbg附加到目标进程上动态调试。软件工具是一个进程,我们的软件是另一个进程,用软件工具进程去查看或者分析我们的软件进程,就涉及到了进程之间的操作,可能会因为权限不对等操作失败的问题。

       再比如,我们要用API Monitor工具去监测某个程序在实现某个功能时都调用了哪些API接口以及在调用API接口传递的参数。我们用Process Monitor工具去监测目标程序的文件活动与注册表活动。这些软件工具进程都要关联到目标程序进程上,去监控去探测,也涉及到了进程之间的操作。

       下面讲几个实际工作中遇到因为权限不对等导致工具无法使用的问题实例,以供大家借鉴或参考。以下案例都是管理员用户(非超级管理员Administrator)登录下的场景。

5、案例1 - 无法在企业微信聊天框中启动安装包程序

       企业微信默认是以标准用户运行的,比如双击桌面快捷方式或者从开始菜单中点击运行起来的,都是以标准用户权限运行的。某天我将软件最新的安装包发到企业微信的群中,同事在群中收到该文件后,直接在企业微信聊天框中双击该安装包文件,但弹出了如下的报错提示框

​大家平时在企业微信中收到文件后,常习惯于直接双击去查看文件或者启动程序,但此次双击却报错了。同事怀疑是我们的软件安装包有问题,询问我们是怎么回事。从这个截图看,截图的标题是个企业微信的路径,然后提示文字是:Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。

       作为开发人员,我们这类程序运行权限的问题比较熟悉了,一看就大概知道怎么回事了。当前的企业微信是以标准用户权限运行的,而我们的软件安装包是设置以管理员权限运行的,两个程序进程的权限不对等,所以操作失败了。低权限(标准用户权限)进程不能启动高权限(管理员权限)进程。

       解决办法是,打开安装包程序所在的路径,直接双击即可运行。

6、案例2 - 使用Windbg时可能会遇到的权限不对等导致操作失败的问题

       我们在使用Windbg静态分析dump文件和附加到目标进程上动态调试时,也遇到过权限不对等导致操作失败的问题。

6.1、Windbg附加到目标进程失败

       当前要被附加调试的目标程序正以管理员权限运行,至于为什么以管理员权限运行,可能是右键以管理员权限运行的,也有可能程序是安装包安装后自动启动的(安装包是以管理员权限运行的,其启动的程序也继承了管理员权限)。而当前启动起来的Windbg是以标准用户权限运行(双击桌面快捷方式启动起来的),当将Windbg附加到以管理员权限运行的目标程序进程上时,附加失败,如下所示:

低权限(标准用户权限)Windbg是不能附加到高权限(管理员权限)的目标程序进程上的。

       解决办法是,以管理员权限启动Windbg工具,这样Windbg就有管理员运行权限了,就可以正常附加到有管理员权限的进程上了。

        关于使用Windbg附加到进程上动态调试目标进程去排查C++软件异常的一般步骤与要点,可以查看我的文章:

使用Windbg动态调试目标进程的一般步骤及要点详解icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131029795

6.2、dump文件拖到以管理员权限运行的Windbg中没反应

       某天,同事反馈,无法用Windbg打开某个dump文件,具体现象是,将磁盘上的dump文件拖入到已经打开的Windbg中没反应

​         正常打开dump文件时的效果如下:

​同事怀疑是不是dump文件比较特殊,比如文件损坏了,所以打不开。按讲不应该的,dump文件的大小是非0的,估计是程序运行权限引起的。经确认,Windbg是右键以管理员权限运行的,而dump文件是从磁盘上拖过来的,运行在explorer文件资源管理器进程中的,而文件资源管理器是以标准用户权限运行的,因为Windbg进程(管理员权限运行)与explorer.exe文件资源管理器进程(标准用户权限运行)权限不对等,所以系统禁止了文件拖放行为所以拖到Windbg中没反应。

        解决办法是,重启启动Windbg,不要以管理员权限启动。

        关于使用Windbg静态分析dump文件去排查C++软件异常崩溃的一般步骤与要点,可以查看我的文章:

使用Windbg静态分析dump文件的一般步骤及要点详解icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/130873143

7、案例3 - 使用Process Explorer工具查看不到某个进程加载的dll库列表

       Process Explorer是双击桌面快捷方式运行的,因为当前在管理员用户(非超级用户Administrator)登录场景下,该工具是以默认的标准用户权限运行的。而我们要查看的进程TestDlg.exe是以管理员权限运行的,所以在Process Explorer看不到TestDlg.exe进程加载的dll库列表,如下所示:

而看其他程序进程是可以看到的:

因为TestDlg.exe是以管理员权限运行的,而当前的Process Explorer工具是以标准权限运行的,所以低权限的Process Explorer无法访问高权限的TestDlg.exe进程信息,所以上面显示空白。

      解决办法是,以管理员权限启动Process Explorer工具即可。

     关于使用Process Explorer分析C++软件异常的实战案例,可以查看我的文章:

使用Process Explorer和Dependency Walker排查dll动态库没法调试的问题(dll库加载失败导致没法动态调试)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140803687使用Process Explorer/Process Hacker和Windbg高效排查C++程序高CPU占用问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140731953使用Process Explorer和Dependency Walker排查C++程序启动时缺少ucrtbase.dll等运行时库以及报0xC000007B错误icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140731927

8、案例4 - API Monitor工具不能直接打开QQ的安装包程序

       我们经常使用API Monitor工具去探测一些主流软件在实现某一功能时调用了哪些系统API函数以及调用API函数时传递的参数,比如使用API Monitor探测Beyond Compare软件在打开.chm文件时给API函数HtmlHelp传入了什么样的参数、使用API Monitor探测QQ安装包在创建桌面快捷方式时都调用哪些COM接口类及相关参数。

      我们在用API Monitor时,支持两种方式去附加到目标进程上。一是工具窗口左下角的进程列表中找到目标进程,右键点击之,在弹出菜单中点击“Start Monitoring”即可。二是直接在API Monitor中启动目标程序,点击主界面中的"Monitor New Process”按钮,找到目标程序的路径启动目标程序即可。相关界面入口如下所示:

       有时,我们需要监测程序启动时调用API函数的情况,就需要选择第二种方式,即在API Monitor中启动目标程序。比如我们想监测QQ安装包在启动时的行为,我们直接双击磁盘上的API Monitor程序,将之启动起来(从资源管理器中启动,以标准用户权限运行),然后点击主界面中的“Monitor New Process”按钮,在弹出界面中以浏览路径的方式设置要启动的QQ安装包程序路径,然后点击确定,弹出如下的提示框:

提示需要提权。因为QQ安装包可能要向C:\Program Files或C:\Program Files (x86)敏感路径中拷贝文件、要向系统注册控件、要向注册表中写入信息,这些操作都需要管理员权限,所以安装包肯定设置了以管理员权限启动。而当前的API Monitor是以标准用户权限运行的,是没法启动以管理员权限运行的QQ安装包,所以弹出了这个提示框。

       解决办法是,直接右键以管理员权限启动API Monitor即可。

       关于使用API Monitor监测第三方程序功能实现的实战案例,可以查看我的文章:

使用API Monitor探测QQ安装包在创建桌面快捷方式时都调用了哪些API及COM接口,去解决C++程序安装包中的问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140177266使用API Monitor探测C++程序在调用HtmlHelp接口打开.chm文件时传入了哪些参数icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140721015使用API Monitor巧妙探测C++程序中监听2620端口的模块icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140731406

9、与管理员权限相关的其他问题

        还有一些与管理员权限相关的其他问题,比如如何通过代码去以管理员权限启动一个程序,开机自启动程序不能时设置以管理员权限运行的程序。下面我们就来详细看看这两个典型的问题。

9.1、如何以管理员权限启动一个程序?

       一个有管理员权限的程序,其启动起来的其他程序默认也是有管理员权限的,即子进程默认是继承父进程的管理员运行权限的。同理,一个没有管理员权限的程序,其启动起来的其他程序,默认是没有管理员权限的。

       那一个没有管理员权限的程序是否能够启动一个有管理员权限的程序呢?答案是肯定的,是可以做到的。一个没有管理员权限的程序,可以调用API函数ShellExecuteEx,传入runas参数去启动另一个程序,这样这个被启动起来的程序就是以管理员权限启动的,即启动起来的程序是以管理员权限运行的。以runas方式将启动程序的代码如下:

SHELLEXECUTEINFO si;
RtlZeroMemory( &si, sizeof( SHELLEXECUTEINFO ) );
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.lpFile = _T("D:\\test.exe");
//si.lpParameters = lpCmdParam;
si.nShow = SW_SHOWNORMAL;
si.lpVerb = _T("runas");
BOOL bRet = ShellExecuteEx( &si );
if ( !bRet ) // TL启动失败
{
    TCHAR achLog[256] = { 0 };
 
    // 先取lasterror值
    DWORD dwLastErr = GetLastError();
    _stprintf( achLog, _T("ShellExecuteEx failed, GetLastError: %d."), dwLastErr );
    WriteLog( achLog );
 
    // 再取hInstApp错误代码
    int nHInsVal = (int)si.hInstApp;
    if ( nHInsVal <= 32 )
    {
        _stprintf( achLog, _T("ShellExecuteEx failure, errcode: %d."), nHInsVal );
        WriteLog( achLog );
    }
}

       注意,在调用ShellExecuteEx启动程序失败时,可通过SHELLEXECUTEINFO结构体中的hInstApp字段值来获取错误码,代码如上所示,错误码主要有以下几种:

错误说明
ERROR_FILE_NOT_FOUND找不到指定的文件。
ERROR_PATH_NOT_FOUND未找到指定路径。
ERROR_DDE_FAIL动态数据交换 (DDE) 事务失败。
ERROR_NO_ASSOCIATION没有与指定的文件扩展名关联的应用程序。
ERROR_ACCESS_DENIED拒绝访问指定文件。
ERROR_DLL_NOT_FOUND找不到运行应用程序所需的库文件之一。
ERROR_CANCELLED函数提示用户输入其他信息,但用户取消了请求。
ERROR_NOT_ENOUGH_MEMORY没有足够的内存来执行指定的操作。
ERROR_SHARING_VIOLATION发生共享冲突。

9.2、开机自启动程序不能设置管理员权限

       所谓开机自启动,是跟随Windows系统一起启动,即在Windows系统启动起来进入桌面后,程序自动启动起来。对于设置开机自启动的程序不能设置以管理员权限启动,否则该程序会自启动失败出于安全考虑,Windows系统禁止以管理员权限启动的程序在开机时自启动,因为管理员权限启动起来的程序,可以修改系统关键目录中的文件。

       如果主程序确实需要管理员权限启动(可能是程序中执行的很多操作都需要管理员权限,比如向系统路径写入内容、向系统注册控件等),则可以单独写一个exe启动程序,比如XXXLauncher.exe,该启动程序不设置以管理员权限启动,可以完成开机自启动,然后在该程序启动起来后再将调用ShellExecuteEx将主程序以runas方式启动起来:

SHELLEXECUTEINFO si;
RtlZeroMemory( &si, sizeof( SHELLEXECUTEINFO ) );
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.lpFile = _T("D:\\test.exe");
//si.lpParameters = lpCmdParam;
si.nShow = SW_SHOWNORMAL;
si.lpVerb = _T("runas");
BOOL bRet = ShellExecuteEx( &si );
if ( !bRet ) // TL启动失败
{
    TCHAR achLog[256] = { 0 };
 
    // 先取lasterror值
    DWORD dwLastErr = GetLastError();
    _stprintf( achLog, _T("ShellExecuteEx failed, GetLastError: %d."), dwLastErr );
    WriteLog( achLog );
 
    // 再取hInstApp错误代码
    int nHInsVal = (int)si.hInstApp;
    if ( nHInsVal <= 32 )
    {
        _stprintf( achLog, _T("ShellExecuteEx failure, errcode: %d."), nHInsVal );
        WriteLog( achLog );
    }
}

这样主程序就以管理员权限运行了。关于以runas启动目标程序的代码,上面已经说了,直接拿过来使用就可以了。

10、最后

       本文详细介绍了与程序运行权限相关的UAC用户帐户控制概念,标准用户权限与管理员权限的相关内容,并讲解了若干个因为权限不对等导致的软件工具无法正常使用的案例,有一定的实战参考价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2188647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能 AI 写作软件:开启创作新纪元

不论你在哪行哪业应该都躲不开写作这件事被。写作已经成为了我们生活和工作中不可或缺的一部分。随着人工智能技术的飞速发展&#xff0c;AI 智能写作工具应运而生。接下来&#xff0c;让我们一起揭开智能ai写作工具的神秘面纱。 1.笔灵AI写作 直通车&#xff1a;https://ibi…

②EtherCAT转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherCAT 转 Modbus TCP (接上一章&#xff09; GW系列型号 配置说明 上载 网线连接电脑到模块上的 WEB 网页设置网口&#…

论文笔记:Online Class-Incremental Continual Learning with Adversarial Shapley Value

这篇工作的focus 是 memory-based approach 1. 挑战/问题&#xff1a; 灾难性遗忘&#xff1a;深度神经网络在学习新任务时往往会忘记先前任务的知识。内存和计算效率&#xff1a;在个人设备上执行深度学习任务时&#xff0c;需要最小化内存占用和计算成本。数据流增量学习&am…

系统安全 - 大数据组件的安全及防护

文章目录 导图1. Hadoop的安全风险2. 常见攻击方式3. Hadoop的自带安全功能4. Apache Knox和Apache Ranger等安全框架5. 安全策略建议 导图 1. Hadoop的安全风险 Hadoop最初设计为在可信网络中运行&#xff0c;因此默认安全性较低。常见的安全风险包括&#xff1a; 未经授权的…

探索未来:揭秘pymqtt,AI与物联网的新桥梁

文章目录 探索未来&#xff1a;揭秘pymqtt&#xff0c;AI与物联网的新桥梁背景&#xff1a;为什么选择pymqtt&#xff1f;什么是pymqtt&#xff1f;如何安装pymqtt&#xff1f;简单的库函数使用方法1. 配置MQTT连接2. 创建Mqtt对象3. 发布消息4. 订阅主题5. 运行MQTT客户端 场景…

Java项目实战II基于Java+Spring Boot+MySQL的小徐影城管理系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着文化娱乐产业的快速发展&#xff0c;影城管理面临着日益复杂的挑战&#xff0c;包括票务管理、座…

Redis操作常用API

说明&#xff1a;Redis应用于java项目中&#xff0c;操作Redis数据可以使用API&#xff0c;相较于命令行更方便。使用前&#xff0c;需先添加依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-re…

HIKVISION 海康威视对讲服务配置平台弱口令

漏洞描述 杭州海康威视系统技术有限公司对讲服务配置平台存在弱口令 漏洞复现 FOFA "document.write(TITLE_SYSTEM);" POC admin #账号 12345 #密码 登录成功

利用Spring Boot打造新闻推荐解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

Kotlin基本知识

Kotlin是一种现代的静态类型编程语言&#xff0c;由JetBrains公司在2010年推出&#xff0c;并被Google在2019年宣布为Android开发的首选语言。 超过 50% 的专业 Android 开发者使用 Kotlin 作为主要语言&#xff0c;而只有 30% 使用 Java 作为主要语言。 70% 以 Kotlin 为主要语…

Redis数据库与GO(二):list,set

一、list&#xff08;列表&#xff09; list&#xff08;列表&#xff09;是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。List本质是个链表&#xff0c; list是一个双向链表&#xff0c;其元素是有序的&#xff0c;元…

【含文档】基于Springboot+Vue的护肤品推荐系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

ctfshow-web入门(信息收集,持续更新中。。)

写在之前:近期打了个比赛,备受打击,入手了vip账号进修,加油! 文章目录 ctfshow-web1查看源代码ctfshow-web2burp抓包ctfshow-web3burp抓包ctfshow-web4访问robots.txtctfshow-web5dirscarch扫描PHPS文件泄露ctfshow-web6dirscarch扫描ctfshow-web7dirscarch扫描ctfshow-w…

力扣 简单 101.对称二叉树

文章目录 题目介绍解题思路 题目介绍 解题思路 在上题【100. 相同的树】的基础上稍加改动,将根节点的左右子树看成左右两个树 递归判断左边的右子树和右边的左子树以及左边的左子树和右边的右子树是否都相同 class Solution {public boolean isSymmetric(TreeNode root) {re…

1.2.2 计算机网络的分层结构(下)

水平视角 YSCS协议&#xff08;压缩传输协议&#xff09; 发送方先压缩然后接收方再解压。 为什么要分层&#xff1f;为什么要制定协议&#xff1f; 计算机网路功能负责->采用分层结构&#xff0c;将诸多功能合理地划分在不同层次->对等层之间制定协议&#xff0c;以…

10.4今日错题解析(软考)

目录 前言系统开发基础——概要设计与详细设计系统开发基础——开发模型 前言 这是用来记录我备考软考设计师的错题的&#xff0c;今天知识点为概要设计与详细设计、开发模型&#xff0c;大部分错题摘自希赛中的题目&#xff0c;但相关解析是原创&#xff0c;有自己的思考&…

SpringBoot3+Vue3开发后台管理系统脚手架

后台管理系统脚手架 介绍 在快速迭代的软件开发世界里&#xff0c;时间就是生产力&#xff0c;效率决定成败。对于构建复杂而庞大的后台系统而言&#xff0c;一个高效、可定制的后台脚手架&#xff08;Backend Scaffold&#xff09;无疑是开发者的得力助手。 脚手架 后台脚…

CSS计数器

CSS 中的计数器类似于变量&#xff0c;可以实现简单的计数功能&#xff0c;并将结果显示在页面上&#xff0c;在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性&#xff1a; counter-reset&#xff1a;创建或者重置计数器&#xff1b;counter-increment&#xf…

day04笔试练习

1.Fibonacci数列 题目链接&#xff1a;Fibonacci数列_牛客题霸_牛客网 题目思路&#xff1a; 定义 a b c 三个变量 使 c 一直加到比 n 大的最近的斐波那契数 此时比较 c 和 b 哪个数离得最近就好 public static void main(String[] args) {Scanner sc new Scanner(System.in…

选择网络安全模式启动Windows系统,解决PC无法连接网络问题

目录 1、电脑无法连接网络 2、发现C:\Windows\System32\drivers路径下的很多文件不见了 3、使用360安全卫士中的断网急救箱工具修复&#xff0c;也就解决不了问题 4、重启系统&#xff0c;以网络安全模式启动系统&#xff0c;修复系统网络模块&#xff0c;完美解决问题 5、…