Использование CreateProcessAsUser в python не передает среду пользователя созданному процессу
Сначала спасибо, что уделили время на чтение этого вопроса.
Я успешно запускаю исполняемый файл приложения (назовем его MyApp.exe) из службы Windows под пользователем 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 \ Интерактивное имя пользователя \AppData\Roaming
Однако возвращаемое значение:
C: \ Windows \ System32 \ Config\systemprofile\AppData\Roaming
Это означает, что хотя MyApp.exe запускается под именем интерактивного пользователя, он получает среду для пользователя SYSTEM, под которой работает служба Windows.
Мой вопрос заключается в том, как я могу получить пути среды, которые принадлежат пользователю, а не системе.
Большое спасибо,
PS Я использую py2exe для преобразования MyApp и службы Windows в исполняемые файлы.
1 ответ
Я нашел ответ, если кто-то заинтересован:
В соответствии с этим, если среда не указана явно, процесс наследует среду родителя. Используя это, вы можете получить окружение и передать его 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)