在 python 中使用 CreateProcessAsUser 不会将用户的环境传递给创建的进程
Using CreateProcessAsUser in python does not pass the user's environment to the created process
首先感谢您花时间阅读这个问题。
我从 [=35= 下的 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')
应该return:
C:\Users\ 交互用户名 \AppData\Roaming
然而 returned 值是:
C:\Windows\System32\config\systemprofile\AppData\Roaming
这意味着虽然 MyApp.exe 是在 interactive 用户的 名称下启动的,它为 SYSTEM 用户获取了 SYSTEM 的环境 windows服务在运行下。
我的问题是如何获取属于用户而非系统的环境路径。
非常感谢,
P.S。我正在使用 py2exe 将 MyApp 和 Windows 服务转换为可执行文件。
我找到了答案,如果有人感兴趣的话:
根据 this if the environment is not explicitly specified, the process inherits the environment of the parent. Using 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)
首先感谢您花时间阅读这个问题。
我从 [=35= 下的 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')
应该return:
C:\Users\ 交互用户名 \AppData\Roaming
然而 returned 值是:
C:\Windows\System32\config\systemprofile\AppData\Roaming
这意味着虽然 MyApp.exe 是在 interactive 用户的 名称下启动的,它为 SYSTEM 用户获取了 SYSTEM 的环境 windows服务在运行下。
我的问题是如何获取属于用户而非系统的环境路径。
非常感谢,
P.S。我正在使用 py2exe 将 MyApp 和 Windows 服务转换为可执行文件。
我找到了答案,如果有人感兴趣的话:
根据 this if the environment is not explicitly specified, the process inherits the environment of the parent. Using 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)