Использование 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)
Другие вопросы по тегам