在我的应用程序中,我运行几个不同的用户帐户下的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