2009-10-07 168 views
1

在我的應用程序中,我在幾個不同的用戶帳戶下運行子進程。我需要能夠讀取這些子進程寫入註冊表的一些信息。每個人都寫入HKEY_CURRENT_USER,我知道他們正在運行的用戶帳戶名稱。從Python註冊表中讀取HKEY CURRENT USER,指定用戶

在Python中,如何從特定用戶的HKEY_CURRENT_USER讀取值?我假設我需要以用戶名加載註冊表值,然後從那裏讀取它們,但是怎麼做?

編輯:爲了確保清楚,我的Python程序以管理員身份運行,並且我有帳戶「user1」,「user2」和「user3」,每個帳戶都有自己的HKEY_CURRENT_USER中的信息。作爲管理員,我如何讀取user1的HKEY_CURRENT_USER數據?

回答

3

根據MSDNHKEY_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 
2

HKEY_CURRENT_USER映射到HKEY_USERS \ {id}鍵。

嘗試通過將HKEY_USERS {id} \ Volatile Environment \ USERNAME鍵與用戶的用戶名(通過枚舉/遍歷系統上存在的{id})進行匹配來查找id。當您發現匹配只是使用HKEY_USERS {id}就好像它是HKEY_CURRENT_USER

+0

這是解決方案,我想出了爲好,但我希望更多的東西「正確」似乎 - 盧卡斯的建議,是有點多具體。 – gdm 2009-10-07 16:58:28

+0

我不得不同意:)。他的回答更加強大。 – KarlW 2009-10-07 17:12:34

+0

我給了這個+因爲它在Python之外工作,並且不需要額外的程序 - 這個想法適用於任何平臺。 – Espen 2014-02-18 21:22:23

0

如果你不想安裝win32的東西Python和因爲你已經在使用子進程,可以運行內置的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