2015-11-18 54 views
1

首先感謝您閱讀此問題。在Python中使用CreateProcessAsUser不會將用戶環境傳遞到創建的進程

我開始一個應用程序的可執行文件(可以稱之爲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:\用戶\ 交互式用戶名 \應用程序數據\漫遊

但是返回的值是:

C:\ WINDOWS \ system32 \設置\ systemprofile \應用程序數據\漫遊

這意味着儘管MyApp.exe是在交互式用戶的名稱下啓動的,但它獲取了運行Windows服務的用戶的環境SYSTEM

我的問題是我如何獲得屬於用戶而不是系統的環境路徑。

許多感謝,

附:我正在使用py2exe將MyApp和Windows服務轉換爲可執行文件。

回答

1

我找到了答案,萬一有什麼人有興趣:

根據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) 
相關問題