2009-10-07 4 views
1

Dans mon application, j'exécute des sous-processus sous plusieurs comptes utilisateur différents. Je dois être capable de lire certaines des informations écrites dans le registre par ces sous-processus. Chacun écrit dans HKEY_CURRENT_USER et je connais le nom du compte d'utilisateur sous lequel ils s'exécutent.Lecture de HKEY CURRENT USER à partir du registre en Python, en spécifiant l'utilisateur

En Python, comment lire les valeurs de HKEY_CURRENT_USER pour un utilisateur spécifique? Je suppose que j'ai besoin de charger les valeurs du registre sous le nom de l'utilisateur, puis les lire à partir de là, mais comment? Edit: Pour m'assurer que tout est clair, mon programme Python fonctionne en tant qu'administrateur, et j'ai les comptes "user1", "user2", et "user3", qui ont chacun des informations dans leur propre HKEY_CURRENT_USER. En tant qu'administrateur, comment lire les données HKEY_CURRENT_USER de user1?

Répondre

3

Selon MSDN, HKEY_CURRENT_USER est un pointeur vers HKEY_USERS/SID of the current user. Vous pouvez utiliser pywin32 pour rechercher le SID pour un nom de compte. Une fois que vous avez cela, vous pouvez utiliser open et utiliser la clé de registre avec le module _winreg.

import win32security 
import _winreg as winreg 

sid = win32security.LookupAccountName(None, user_name)[0] 
sidstr = win32security.ConvertSidToStringSid(sid) 
key = winreg.OpenKey(winreg.HKEY_USERS, sidstr) 
# do something with the key 
2

HKEY_CURRENT_USER correspond à une clé HKEY_USERS \ {id}.

Essayez de trouver l'ID en faisant correspondre la clé HKEY_USERS {id} \ Volatile Environment \ USERNAME au nom d'utilisateur de l'utilisateur (en énumérant/itérant les {id} présents sur le système). Lorsque vous trouvez la correspondance, utilisez simplement HKEY_USERS {id} comme si c'était HKEY_CURRENT_USER

+0

C'était la solution que j'avais trouvé aussi, mais j'espérais quelque chose de plus apparente 'correct' - la suggestion de Lukas est un peu plus béton. – gdm

+0

Je serais d'accord :). Sa réponse est plus robuste. – KarlW

+0

J'ai donné un + parce que cela fonctionne en dehors de Python et n'a pas besoin de programmes supplémentaires - l'idée fonctionne sur n'importe quelle plateforme. – Espen

0

Si vous ne souhaitez pas installer des trucs win32 pour Python et que vous utilisez déjà sous-processus, vous pouvez exécuter construit dans Windows commandes pour obtenir les données de Registre que vous recherchez.

Pour interroger le SID d'un utilisateur particulier:

wmic useraccount where name='John' get sid

vous pouvez ensuite utiliser ce SID pour interroger d'autres entrées de registre pour cet utilisateur particulier:

reg query HKEY_USERS\[SID]

Par exemple, si vous voulez connaître les lecteurs réseau montés pour un utilisateur particulier:

reg query HKEY_USERS\S-1-5-21-4205028929-649740040-1951280400-500\Network /s /v RemotePath

La sortie ressemblera à quelque chose comme ceci:

HKEY_USERS\S-1-5-21-4205028929-649740040-1951280400-500\Network\R 
    RemotePath REG_SZ \\MACHINENAME1\shared 

HKEY_USERS\S-1-5-21-4205028929-649740040-1951280400-500\Network\T 
    RemotePath REG_SZ \\MACHINENAME2\testing 

HKEY_USERS\S-1-5-21-4205028929-649740040-1951280400-500\Network\V 
    RemotePath REG_SZ \\MACHINENAME3\videos 

End of search: 3 match(es) found. 

qui devrait être relativement simple à analyser en Python.

Références:

http://www.windows-commandline.com/get-sid-of-user/

https://superuser.com/questions/135752/list-mapped-network-drives-from-the-command-line-to-text-file

Questions connexes