3

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

我使用以下代码在Interactive 用户下从我的 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 是在交互式用户名下启动的,但它会获取运行 Windows 服务的SYSTEM用户的环境。

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

多谢,

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

4

1 回答 1

4

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

据此,如果没有明确指定环境,则该进程继承父级的环境。使用这个可以获取环境并将其传递给 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)
于 2015-11-18T11:44:55.917 回答