首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中使用CreateProcessAsUser不会将用户的环境传递给创建的进程

在python中使用CreateProcessAsUser不会将用户的环境传递给创建的进程
EN

Stack Overflow用户
提问于 2015-11-18 11:20:07
回答 1查看 1.2K关注 0票数 3

首先,谢谢你花时间阅读这个问题。

我使用以下代码成功地从我的windows服务下的交互式用户下启动了一个应用程序可执行文件(让我们称之为):

代码语言:javascript
运行
复制
#MyWindowsService.py

console_session_id = win32ts.WTSGetActiveConsoleSessionId()
console_user_token = win32ts.WTSQueryUserToken(console_session_id)

my_app_path= os.path.normpath(r"/Path\to\MyApp.exe")
startup = win32process.STARTUPINFO()
priority = win32con.NORMAL_PRIORITY_CLASS
handle, thread_id ,pid, tid = win32process.CreateProcessAsUser(console_user_token, my_app_path, None, None, None, True, priority, None, None, startup)

从MyApp内部,我需要获取属于交互式用户的环境路径。例如,我使用以下代码获取用户%appdata%的路径:

代码语言:javascript
运行
复制
#MyApp.py

user_app_data_path = os.getenv('APPDATA')

它应返回:

C:\User\ Interactive-user-name \AppData\漫游

然而,返回的值是:

C:\Windows\System32\config\systemprofile\AppData\Roaming

这意味着尽管MyApp.exe是以交互式用户名启动的,但它为运行windows服务的系统用户提供了环境。

我的问题是如何获得属于用户而不是系统的环境路径。

许多人感谢,

P.S.我正在使用py2exe将MyApp和MyApp服务转换为可执行文件.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 11:44:55

我找到了答案,以防有人感兴趣:

根据,如果没有显式指定环境,则进程继承父进程的环境。使用可以获取环境并将其传递给CreateProcessAsUser。

只需按照以下代码中的环境单词操作即可。

代码语言:javascript
运行
复制
#MyWindowsService.py

console_session_id = win32ts.WTSGetActiveConsoleSessionId()
console_user_token = win32ts.WTSQueryUserToken(console_session_id)

my_app_path= os.path.normpath(r"/Path\to\MyApp.exe")
startup = win32process.STARTUPINFO()
priority = win32con.NORMAL_PRIORITY_CLASS
environment = win32profile.CreateEnvironmentBlock(console_user_token, False)
handle, thread_id ,pid, tid = win32process.CreateProcessAsUser(console_user_token, my_app_path, None, None, None, True, priority, environment, None, startup)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33778717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档