2015-11-18 3 views
1

D'abord, merci de lire cette question.L'utilisation de CreateProcessAsUser en python ne transmet pas l'environnement de l'utilisateur au processus créé

Je commence un exécutable de l'application (permet de l'appeler MyApp.exe) avec succès de mon service Windows sous le utilisateur interactif en utilisant le code suivant:

#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) 

De l'intérieur MyApp je dois obtenir les chemins d'environnement qui appartiennent à l'utilisateur interactif . Par exemple, j'utilise le code suivant pour obtenir le chemin pour% AppData de% de l'utilisateur:

#MyApp.py 

user_app_data_path = os.getenv('APPDATA') 

Il devrait retourner:

C: \ Users \ Interactive-user-name \ AppData \ Roaming

Cependant, la valeur retournée est:

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

Ce qui signifie que bien que MyApp.exe soit démarré sous nom de l'utilisateur interactif, il obtient l'environnement SYSTEM utilisateur que le service Windows exécute sous.

Ma question est de savoir comment je peux obtenir les chemins d'environnement qui appartiennent à l'utilisateur et non au système.

Un grand merci,

post-scriptum J'utilise py2exe pour convertir le service MyApp et Windows en exécutables.

Répondre

1

Je trouve la réponse, dans le cas où quelqu'un est intéressé:

Selon this si l'environnement n'est pas spécifié explicitement, le processus hérite de l'environnement du parent. En utilisant this on peut obtenir l'environnement et le transmettre à CreateProcessAsUser.

Suivez simplement le mot d'environnement dans le code suivant.

#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)