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

标签 python windows-services user-environment

首先感谢您花时间阅读这个问题。

我在 Interactive user 下使用以下代码从我的 Windows 服务成功启动了一个应用程序可执行文件(我们称之为 MyApp.exe) :

#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% 的路径:

#MyApp.py

user_app_data_path = os.getenv('APPDATA')

它应该返回:

C:\Users\交互用户名\AppData\Roaming

但是返回值是:

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

这意味着虽然 MyApp.exe 是在 interactive 用户 名下启动的,但它为 SYSTEM 用户获取 Windows 服务在其下运行的环境。

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

非常感谢,

附言我正在使用 py2exe 将 MyApp 和 Windows 服务转换为可执行文件。

最佳答案

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

根据 this如果未明确指定环境,则进程继承父进程的环境。使用 this可以获取环境并将其传递给 CreateProcessAsUser。

在下面的代码中简单地跟在环境词后面。

#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)

关于python - 在 python 中使用 CreateProcessAsUser 不会将用户的环境传递给创建的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33778717/

相关文章:

python - MongoDB 集合到 pandas Dataframe

python - 在 python 中以 2 的间隔将列表元素插入到列表的第二个列表中

python - 从 numpy 数组中选择 'some' 个随机点

R 环境错误 : Could not find Ghostscript on path. RWebLogo

python - 如何使用 Django 作为别名发送电子邮件

windows-services - 安装窗口服务

c# - 如何找到windows服务exe路径

.net - 管理 worker 的多个实例的架构?

windows - CreateEnvironmentBlock 返回的 block 对于 Windows Vista 上的 CreateProcessWithLogon 来说太大了