Windows平台使用Python切换用户运行程序
时间:2022-05-14
本文章向大家介绍Windows平台使用Python切换用户运行程序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在Windows平台,如果需要以某个指定用户来运行程序,此时可以通过使用 Windows CreateProcessAsUser API来实现。但是要实现这个功能首先需要有要切换用户的用户名和密码。
import psutil
import win32process
import win32security
import win32con
import win32api
import win32service
import win32file
import win32profile
import pywintypes
try:
username = 'admin'
password = 'admin'
domain = ''
token = win32security.LogonUser (
username,
domain,
password,
win32con.LOGON32_LOGON_SERVICE,
win32con.LOGON32_PROVIDER_DEFAULT
)
win32security.ImpersonateLoggedOnUser(token)
cmd = '<a command line programe>'
cwd = '<a work dir>'
env = os.environ
priority = win32con.NORMAL_PRIORITY_CLASS
startup = win32process.STARTUPINFO()
(hProcess, hThread, dwProcessId, dwThreadId) =
win32process.CreateProcessAsUser(token, None, cmd, None, None, True, priority, env, cwd, startup)
# win32process.GetExitCodeProcess(hProcess) == win32con.STILL_ACTIVE
process = psutil.Process(dwProcessId)
return_code = process.wait()
print 'return code: %s' % str(return_code)
except win32security.error as e:
print e
- 要使上面的程序生效,首先需要使用一个windows service来执行这个程序(目前我是这么测试的,有人说也可以在命令行以administrator来运行,但是我没有测试成功)。关于Python创建Windows Service的方法,可以参考我前面文章。
- 要切换用户执行脚本,需要有被切换用户的用户名和密码。
- 在用 CreateProcessAsUser API执行命令后,可以通过 GetExitCodeProcess api 来检查进程状态,如果返回结果是 win32con.STILL_ACTIVE,我们可以继续等待。
- 显然,通过 GetExitCodeProcess api来检查进程是否退出不是很好用,所以这里我使用了psutil库来等待进程退出。
参考
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)
- MySQL 5.7 Group Replication错误总结(r11笔记第84天)
- 空结构体struct{}解析
- 动态创建MySQL Group Replication的节点(r11笔记第84天)
- sysbench压测小记(r11笔记第99天)
- WordPress启用memcached动态缓存以及报错解决
- 升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
- 相差数十倍的SQL性能分析(r11笔记第98天)
- shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度
- Oracle中的PGA监控报警分析(r11笔记第96天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 每天一道前端面试题:如何进行网站性能优化
- PowerBI DAX 度量值管理 - 驾驭度量值依赖关系,删除无效
- Git 实用命令小抄
- 手把手教你画酷炫环形图(图文详解)
- 为什么说神经网络可以逼近任意函数?
- 缩放|位移|渐变简单动画
- HTTP状态码及其含义
- 卷积神经网络中的参数共享/权重复制
- 前端面试基础题:从浏览器地址栏输入url到显示页面的步骤
- 学会这15个TS面试题,拿到更高薪的offer
- 前端面试基础题:请描述⼀下 cookies , sessionStorage 和 localStorage 的区别?
- matplotlib基础绘图命令之pie
- 【从0到1学算法】快速排序
- 每天一道前端面试题:左边宽度固定,右边⾃适应
- 几个IDEA高级调试技巧,完全是bug杀手啊