Windows UAC权限详解以及因为权限不对等引发的若干问题排查

目录

1、什么是UAC?

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

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

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

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

4.2、当前登录用户的类型

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

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

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

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

7、案例3 - 双击桌面快捷方式启动程序时并没有自动将已经启动起来的程序窗口弹出来

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

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

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


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       在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的密码一样)。

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路径中,需要向系统注册控件,这些操作都需要管理员权限才能执行,所以安装包程序一般都要设置以管理员权限运行。如果程序设置了以管理员权限运行的属性,则程序图标的右下角会显示小盾牌的图标,如下所示:

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

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

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

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

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

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

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

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

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

设置程序以管理员权限运行无效问题的排查过程分享icon-default.png?t=N7T8https://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安装包时弹出的提示框

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

       如何通过代码去判断程序是否以管理员权限运行,可以参见我之前的文章:

VC++判断进程是否以管理员权限运行(附源码)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/45419259       如果两个程序(进程)权限不对等,相互之间操作时可能会出现失败的现象,因为系统不允许两个权限不同的进程相互操作。下面讲几个实际工作中可能遇到的问题实例,以供大家借鉴或参考。以下案例都是管理员用户(非超级管理员Administrator)登录下的场景。


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

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

C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

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

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

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

专栏2: 

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

以多年的开发实战经验为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对C++相关知识点进行详细地展开与剖析!专栏涉及了C/C++开发领域多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

VC++常用功能开发汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

专栏将10多年C++开发实践中常用的功能,以高质量的代码展现出来,并对相关功能的实现细节进行了详细的说明。这些常用的代码,其质量与稳定性是有保证的,可以直接拿过去使用,可以有效地解决C++软件开发过程中遇到的问题。


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

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

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

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

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

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

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

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

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

       如果Windbg是以管理员权限运行的,是可以成功附加到标准用户权限运行的进程上的,这个系统是允许的。 

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

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

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

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

7、案例3 - 双击桌面快捷方式启动程序时并没有自动将已经启动起来的程序窗口弹出来

       很多程序只允许启动一个程序实例(只能运行一个进程),不像浏览器程序,可以启动多个程序(窗口)。只允许程序运行一个实例,大体是这么实现的,当程序启动时会去检测是否有程序进程已经启动,如果已经有程序进程运行且不是当前的进程,则自动将当前新启动的进程退出,这样就能保证程序只运行一个实例了。

       假定当前程序已经运行且只允许运行一个程序实例,但我们没有看到程序窗口(可能程序被最小化了,或者被最小化到托盘区域了),不确定程序有没有运行起来,我们会去双击桌面快捷方式。此时,因为程序之前已经启动起来,按理我们要将已经运行的程序窗口自动弹出来。我们的软件代码也确实这么实现了,但在某个场合下还是没有将已经运行的程序窗口弹出来。

       场景是这样的:已经运行的程序,是使用安装包安装软件后自动启动起来的,因为安装包是以管理员权限运行的,所以被启动起来的程序默认是继承了管理员权限。而我们通过双击桌面快捷方式启动的新的进程是以标准权限运行的,程序初始化运行时会去检测程序是否已经运行,确实检测到程序已经运行,并找到了已经运行的程序主窗口,但在调用API函数ShowWindow将该窗口Show出来时却失败了

       于是想到MSDN上查看API函数ShowWindow的说明,看看能不能将相关值打印出来,分析一下该函数为什么会调用失败。ShowWindow函数在MSDN上的说明如下:

该函数的返回值是BOOL型的,但这个返回值只是标识窗口之前的状态,并不是标识ShowWindow函数是否执行成功的只能借助GetLastError函数,通过获取LastError值找到ShowWindow执行失败的原因

有些Windows API需要借助GetLastError获取的LastError值去判断有没有执行成功:

1)如果LastError值为0,则表示执行成功;

2)如果LastError值不为0,则表示执行失败,LastError值对应的就是执行失败的原因。

于是添加如下的打印:

BOOL bShowTargetWndSuccess = FALSE;
SetLastError(0);
::ShowWindow(hPrevWnd, SW_RESTORE);
dwLastError = GetLastError();
if ( dwLastError == 0 )
{// 窗口Show成功了bShowTargetWndSuccess = TRUE;
}
else
{// 窗口Show失败了,将API函数ShowWindow设置完后设置的LastError值打印出来char szLog[256] = { 0 };sprintf(szLog, "[CheckShowExsitingWnd] show target window failed, LastError = %d.", dwLastError);WriteLog(szLog);
}

后来复现了这个问题,查看到调用ShowWindow窗口Show失败时设置的LastError值为5,到VS自带的错误查看工具中查看该值的含义如下:

拒绝访问,应该就是权限问题导致ShowWindow执行失败了。已经运行的程序进程因为是安装包安装完成后自动启动的,所以有管理员权限,而新启动的进程是双击桌面快捷方式启动的,所以是以标准用户权限运行的。新启动的进程检测到程序已经运行,低权限(标准用户权限)的新进程想要其Show高权限(管理员权限)的已启动进程中的窗口,系统是不允许的,所以导致ShowWindow执行失败。

       目前规避的办法是,当我们发现ShowWindow执行失败(判断LastError值)时,直接弹出一个提示框,但还是没有将已启动的程序窗口弹出来,这只是个规避问题的方法,用户体验不好。

       最好的解决办法是,安装包在安装完成后自动启动进程时,直接以标准用户权限启动程序,这样就没有权限不对等的问题了,这样就能自动弹出已经运行的程序窗口了。

       和企业微信对比了一下,在同样的场景下企业微信是没问题的,企业微信能自动将已经运行的程序窗口弹出来。我们编写了监测程序进程是否以管理员权限运行的代码(本文后面会给出判断程序进程是否已管理员权限运行的代码),发现企业微信安装包执行完后自动启动起来的企业微信进程是标准用户权限运行的。企业微信安装包肯定是以管理员权限运行的(安装包要可能要向系统敏感路径写入内容,要写注册表,要注册控件,所以一般安装包需要以管理员权限运行),从企业微信的安装包程序的图标就能看出来,图标的右下角有个小盾牌:

以管理员权限运行的安装包进程,以标准用户权限去启动企业微信的主程序,即启动起来的企业微信主程序是以标准用户权限运行的。

       那如何启动一个标准用户权限运行的进程呢?还记得我之前讲过的开源工具Process Hacker吗?我们在日常排查问题时,会使用到Process Hacker,之前在菜单中看到以标准用户权限创建进程的功能。在该工具的菜单栏中,hacker -> Run as limited user...

因为Process Hacker的源码是开源的,大家需要这个功能的话,可以到源码中去找该菜单项对应的源码实现。此处给出Process Hacker开源代码中以标准用户权限创建一个进程的部分代码

NTSTATUS status;
HANDLE tokenHandle;
HANDLE newTokenHandle;if (NT_SUCCESS(status = PhOpenProcessToken(NtCurrentProcess(),TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ADJUST_GROUPS |TOKEN_ADJUST_DEFAULT | READ_CONTROL | WRITE_DAC,&tokenHandle)))
{if (NT_SUCCESS(status = PhFilterTokenForLimitedUser(tokenHandle,&newTokenHandle))){status = PhCreateProcessWin32(NULL,(PWSTR)runFileDlg->lpszFile,NULL,NULL,0,newTokenHandle,NULL,NULL);NtClose(newTokenHandle);}NtClose(tokenHandle);
}

如果要实现这个功能,则需要到Process Hacker开源代码中拷贝完整的源码。

我们之前还讲过一个类似的工具叫Process Explorer,这个工具我们日常用的比较多,它也有类似的功能,但该工具不是开源的,我们看不到他的源码实现。

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

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

8.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发生共享冲突。

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

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

       如果主程序确实需要管理员权限启动(可能是程序中执行的很多操作都需要管理员权限,比如向系统路径写入内容、向系统注册控件等),则可以单独写一个exe启动程序,比如XXXLauncher.exe,该启动程序不设置以管理员权限启动,可以完成开机自启动,然后在该程序启动起来后再将调用ShellExecuteEx将主程序以runas方式启动起来,这样主程序就以管理员权限运行了。关于以runas启动目标程序的代码,上面已经说了,直接拿过来使用就可以了。

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

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

相关文章

API测试工具

apifox 微信扫描登录 不推荐&#xff1a; Download Postman

CorelDraw安装时界面显示不全的解决方案

问题原因&#xff1a;安装包权限 解决方案&#xff1a; 1、安装包解压后&#xff0c;找到Setup文件&#xff0c;复制粘贴到当前文件夹并重命名为Getup后&#xff0c;右击Getup文件&#xff0c;选择“以管理员身份运行” 说明&#xff1a;除了命名Gsetup。还可以命名为其他的…

Vue第三方库与插件实战手册

title: Vue第三方库与插件实战手册 date: 2024/6/8 updated: 2024/6/8 excerpt: 这篇文章介绍了如何在Vue框架中实现数据的高效验证与处理&#xff0c;以及如何集成ECharts、D3.js、Chart.js等图表库优化数据可视化效果。同时&#xff0c;探讨了Progressive Web App(PWA)的接入…

MySQL-相关日志

官方文档 1、MySQL支持的日志 MySQL有不同类型日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分别为 二进制日志、错误日志、通用查询日志、慢查询日志、中继日志、数据定义语句日志 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time的所有查询&#xf…

攻防世界---misc---Excaliflag

1、题目描述&#xff0c;下载附件是一张图片 2、用winhex分析&#xff0c;没有发现奇怪的地方 3、在kali中使用binwalk -e 命令&#xff0c;虽然分离出来了一些东西&#xff0c;但是不是有用的 4、最后用stegsolve分析&#xff0c;切换图片&#xff0c;发现有字符串&#xff0c…

Apache IoTDB 分布式架构三部曲(三)副本与共识算法

IoTDB 首创并应用的共识协议统一框架&#xff0c;为用户提供了灵活选择不同共识算法的可能性。 对于一个分布式集群而言&#xff0c;为了使得海量数据场景下集群能够横向扩展&#xff0c;集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上&#xff0c;从而能够更…

CNN简介与实现

CNN简介与实现 导语整体结构卷积层卷积填充步幅三维卷积立体化批处理 实现 池化层特点实现 CNN实现可视化总结参考文献 导语 CNN全称卷积神经网络&#xff0c;可谓声名远扬&#xff0c;被用于生活中的各个领域&#xff0c;也是最好理解的神经网络结构之一。 整体结构 相较于…

GUI编程-01

组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 Java提供了丰富的图形用户界面&#xff08;Graphics User Interface&#xff0c;GUI&#xff09;的类库&#xff0c;基于这些类库可以编写窗口程序。 Java关于图形界面的类库主要放在…

171.二叉树:二叉树的所有路径(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}* Tree…

LabVIEW伺服电机测控系统

LabVIEW伺服电机测控系统 开发了一个基于LabVIEW的伺服电机测控系统。系统主要用于精确控制电机的运动&#xff0c;以达到高效率和高精度的要求。通过使用LabVIEW软件和配套的硬件&#xff0c;开发者能够实现对伺服电机的实时监控和控制&#xff0c;进而提高整个系统的性能和可…

【Linux系统编程】进程地址空间

目录 前言 进程虚拟地址空间的引入 进程地址空间的概念 进一步理解进程地址空间 为什么需要进程地址空间&#xff1f; 系统层面理解malloc/new内存申请 前言 首先&#xff0c;在我们学习C语言的时候一定会见过如下这张图。&#xff08;没见过也没关系&#xff0c;接下来…

【JavaScript对象详解】 Day05

JavaScript对象详解 JavaScript 基础 - 第5天对象语法对象属性对象使用属性-查属性-改属性-增属性-删 &#xff08;了解&#xff09; 方法和调用遍历对象遍历数组对象null 内置对象Math属性方法生成任意范围随机数 综合案例随机点名案例猜数字游戏猜数字游戏设定次数生成随机颜…

运维 之 DNS域名解析

前言 我们每天打开的网站&#xff0c;他是如何来解析&#xff0c;并且我们怎么能得到网站的内容反馈的界面呢&#xff1f;那什么是DNS呢&#xff08;DNS&#xff08;DomainNameservice&#xff0c;域名服务&#xff0c;主要用于因特网上作为域名和IP地址相互映射&#xff09;那…

React的表单学习

react的表单的双向绑定 // userState实现计数实例 import {useState} from react// 1.声明一个react的状态 -useState// 2.核心绑定流程//1.通过value属性绑定react状态//2.绑定onChange事件&#xff0c;通过事件参数e拿到输入框最新的值&#xff0c;反向修改到react状态 func…

机器学习与数据挖掘知识点总结(二)之常用的分类算法

目录 1、什么是数据挖掘 2、为什么要有数据挖掘 3、数据挖掘用在分类任务中的算法 朴素贝叶斯算法 svm支持向量机算法 PCA主成分分析算法 k-means算法 决策树 1、什么是数据挖掘 数据挖掘是从大量数据中发现隐藏在其中的模式、关系和规律的过程。它利用统计学、机器学…

Kafka监控系统efak的安装

下载地址Kafka Eaglehttp://download.kafka-eagle.org/下载地址连接不稳定&#xff0c;可以多次尝试直到成功连接下载 1.解压安装包并重命名 tar -zxvf kafka-eagle-bin-3.0.1.tar.gz 查看到解压后包含一个安装包&#xff0c;再解压 tar -zxvf efak-web-3.0.1-bin.tar.gz 移…

【Nacos 2.3.3支持Postgre SQL数据源配置】

Nacos 2.3.3支持Postgre SQL数据源配置 1、Nacos下载2、 插件下载&#xff1a;3、SQL脚本获取、nacos数据库创建、插件编译4、Nacos 集群搭建方式&#xff1a; 1、Nacos下载 下载地址&#xff1a; https://download.nacos.io/nacos-server/nacos-server-2.3.2.zip 或者自行在官…

1.Vue2使用ElementUI-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址&#xff1a;source-code: 源码笔记 1.下载nodejs v16.x 下载地址&#xff1a;Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

SpringCloud-OpenFeign拓展-连接池、最佳使用方法、日志输出

目录 1 OpenFeign连接池 1.1 常见连接类型 1.2 连接池使用方法 1.2.1 引入依赖 1.2.2 开启连接池功能 1.2.3 配置完成&#xff0c;重启实例即可&#xff0c;底层将更改设置。 2 OpenFeign最佳使用方法 2.1 每个微服务都是单独的project&#xff0c;内部有三个独立模块 …

Docker:认识镜像仓库及其命令

文章目录 Docker Registry什么是Docker Registry 镜像仓库工作机制使用流程实际使用方法仓库的拉取机制 常用的镜像仓库---DockerHub什么是DockerHub私有仓库 镜像仓库命令docker logindocker pulldocker pushdocker searchdocker logout Docker Registry 什么是Docker Regist…