2015-11-18 1 views
1

Прежде всего спасибо вам за то, что вы читаете этот вопрос.Использование CreateProcessAsUser в python не передает среду пользователя созданному процессу

я запустить приложение исполняемого файла (назовём его MYAPP.EXE) успешно из службы окон под пользователем Interactive используя следующий код:

#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 \ Interactive-пользовательского имени \ AppData \ Roaming

Однако возвращаемое значение:

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

Это означает, что хотя MyApp.exe запущен под именем имя пользователя интерактивного пользователя, он получает среду для пользователя пользователя, которому работает служба Windows.

Мой вопрос в том, как я могу получить пути к среде, которые принадлежат пользователю, а не системе.

Многие благодарственное,

P.S. Я использую 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)