从Pythonregistry中读取HKEY CURRENT USER,指定用户

在我的应用程序中,我运行几个不同的用户帐户下的subprocess。 我需要能够读取这些subprocess写入registry的一些信息。 每个人都写入HKEY_CURRENT_USER,我知道他们正在运行的用户帐户名称。

在Python中,如何从特定用户的HKEY_CURRENT_USER读取值? 我假设我需要以某种方式加载用户名下的registry值,然后从那里读取它们,但是如何?

编辑:只是为了确保清楚,我的Python程序是以pipe理员身份运行的,而且我拥有帐户“user1”,“user2”和“user3”,每个帐户都有自己的HKEY_CURRENT_USER中的信息。 作为pipe理员,我如何读取user1的HKEY_CURRENT_USER数据?

根据MSDN , HKEY_CURRENT_USER是一个指向HKEY_USERS/SID of the current user指针。 您可以使用pywin32来查找帐户名称的SID。 一旦你有了这个,你可以使用打开并使用_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 

HKEY_CURRENT_USER映射到HKEY_USERS \ {id}键。

尝试通过将HKEY_USERS {id} \ Volatile Environment \ USERNAME键与用户的用户名(通过枚举/迭代系统上存在的{id})来查找id。 当您找到匹配只是使用HKEY_USERS {id},就好像它是HKEY_CURRENT_USER

如果您不想为Python安装win32的东西,并且您已经在使用子进程,则可以运行内置的Windows命令来获取您正在查找的注册表数据。

要查询特定用户的SID,请执行以下操作:

wmic useraccount where name='John' get sid

然后,您可以使用该SID查询该特定用户的其他注册表项:

reg query HKEY_USERS\[SID]

例如,如果您想知道特定用户的已安装网络驱动器,请执行以下操作:

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

输出结果如下所示:

 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. 

在Python中解析应该相对简单。

参考文献:

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