【Python】在Windows下以管理员身份执行cmd命令

目标以及问题

我在完成一项任务中,需要杀掉一个弹窗进程,但是Windows下执行taskkill /im Au_.exe /f并没有杀掉进程,而是提示:拒绝访问该进程。经过分析是因为权限不够,无法杀掉这个进程。所以我要想办法来获取更高的权限杀掉这个进程。

查看博客找了很久没有找到自己想要的,解决这个问题有两种方案。 一种是更高权限的命令,需要键入用户名和密码,这种程序跑在不同主机,有不同的用户名和密码,不够自动化,所以不是我想要的。还有就是一种在python程序中获取管理员的权限执行。

解决问题代码

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
	print("以管理员权限运行")
	# 杀掉名字为Au_.exe的进程
	os.system("taskkill /im Au_.exe /f")
else:
	if sys.version_info[0] == 3:
		print("无管理员权限")
		ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

没错,这个代码就是大部分博客所贴出来的代码,我起初并不知道,这段代码都是什么意思,试着执行了一下,是可以的,但是是怎么执行的,就需要调式来分析一下,那么我就来分享一下其他人没有对这段代码说明的的内容,我根据我的调式过程来简单分析一下这段代码。

分析代码

其中runas是获得更高权限的一种命令,但是这段代码是怎么个执行过程呢?
在上面代码,进程的确被杀掉了,但是它是怎么执行的呢,控制台也没有打印"以管理员权限运行"字样。
于是我在一定的位置,加入了睡眠函数,我的天!一个黑框框成功捕捉!打印出了我想看的东西。

所以我写了如下调试代码:

import ctypes, sys, os, time


def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False


def admin_exe() :
    if is_admin():
        print("admin_exe函数内,以管理员权限运行")
        time.sleep(10)
        os.system("taskkill /im Au_.exe /f")
        time.sleep(100)
    else:
        if sys.version_info[0] == 3:
            print('admin_exe函数内,还没有管理员权限')
            ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)


if __name__ == '__main__':
    print("admin_exe前")
    admin_exe()
    print("admin_exe后")

主程序控制台:
【Python】在Windows下以管理员身份执行cmd命令_第1张图片
运行过程中一个管理员权限的控制台:
【Python】在Windows下以管理员身份执行cmd命令_第2张图片
程序的核心一定是这句代码:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
其中有一个参数为__file__,可以猜测,这句代码应该是获取管理员权限然后重新执行该文件。
而且,我在睡眠那么久的情况下,主程序仍然立刻正常退出,可以分析出,执行这个系统命令并不是主程序完成的,那么可以分析得到,这行代码是以管理员身份重新开了一个进程执行系统命令。
再观察弹出的这个黑框中打印出的内容,打印的内容,完全就是又执行了一遍我这个程序,只是以管理员身份执行了一遍我这个主程序。
综上,这行代码以管理员身份开启一个新进程,重复执行该文件内容,并有一个自己的控制台。

提示:如果你只是执行这一个文件,那么写不写这个 if __name__='__main__':都可以,但是要是在其他文件调用该方法,还是要写的,不然会在import该方法的时候,就执行代码了,就出现问题了

你可能感兴趣的:(【Python】在Windows下以管理员身份执行cmd命令)