My code was just experimental and will be much refined in the future which will include specific exception catches. Connecting to the local registry is to 'go the last yard' for a full-blown implementation.
I had a hard time grasping the Windows registry concept of having to first get a key handle for the parent keypath and then specifying an already existing fina/'leaf' key as a string in order to simply read the key's valuename/value data. Who can tell what they were thinking at the time! It seems like a good idea to "abstract" this out since it seems overly complicated and needlessly confusing. Thanks for your extensive info. Its too bad this isn't published in the python winreg/_winreg modules' info. Ray Pasco On Fri, Jul 31, 2020 at 12:43 AM R Pasco <pascor22...@gmail.com> wrote: > My code was simply experimental and will be much refined in the future > which will include specific exception catches. Connecting to the local > registry is to go the 'last yard' for a full implementation. > > I had a hard time grasping the Windows registry concept of having to first > get a key handle for the parent keypath and then specifying an already > existing final or 'leaf' key as a string in order to simply read the key's > valuename/value data. Who can tell what they were thinking at the time! It > seems like a good idea to "abstract" this out since it seems overly > complicated and needlessly confusing. > > Thanks for your extensive info. Its too bad this isn't published in the > python winreg/_winreg modules' info. > Ray Pasco > > > > On Thu, Jul 30, 2020 at 11:53 PM Eryk Sun <eryk...@gmail.com> wrote: > >> On 7/30/20, R Pasco <pascor22...@gmail.com> wrote: >> >> > access rights must be set to [winreg.KEY_ALL_ACCESS | >> winreg.KEY_WOW64_64KEY >> >> It's a bad practice to request more access than you require, at the >> very least because the request may fail with access denied for no good >> reason. >> >> KEY_ALL_ACCESS includes all applicable standard rights (WRITE_OWNER, >> WRITE_DAC, READ_CONTROL, DELETE) and all key rights (KEY_QUERY_VALUE, >> KEY_SET_VALUE, KEY_CREATE_SUB_KEY, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, >> KEY_CREATE_LINK). For an existing key, do you need to change the >> owner, read and modify the security, delete the key, set a symlink, >> etc? It looks like you just need to set a value, i.e. KEY_SET_VALUE. >> >> > winreg.KEY_WOW64_32KEY] (??? Why does this also work ?) >> >> By default a 64-bit process doesn't see redirected keys, but if you >> need to access them, use KEY_WOW64_32KEY in the desired access. >> Normally a 32-bit process under WOW64 sees redirected keys, and if you >> need to access the non-redirected keys, use KEY_WOW64_64KEY. >> >> Note that KEY_WOW64_64KEY and KEY_WOW64_32KEY access modes only affect >> runtime redirection. As with the standard MAXIMUM_ALLOWED access mode, >> they're not assignable rights that can be granted or denied in a key >> object's access control list. >> >> > with winreg.ConnectRegistry( None, hive ) as hivehndl >> >> There is no need to call ConnectRegistry here. By default, predefined >> handles are resolved to local key handles. Also, if you actually need >> to access a remote machine, note that it's nonsensical to try to >> connect to HKEY_CURRENT_USER. The API allows it, but why would one >> assume that the remote machine will have a profile for the current >> user's SID? The remote system will most likely just connect to a >> handle for the default user profile. >> >> > The key HKEY_LOCAL_MACHINE:SOFTWARE requires KEY_WOW64_64KEY >> > to be 'OR'ed. Winreg gives no indication of this requirement, but the >> > Windows doc "Redirected, Shared, and Reflected Keys Under WOW64" does >> > specifically mention HKEY_CURRENT_USER :SOFTWARE as needing this added >> > access. >> >> At the machine level, the software hive is stored on disk at >> "%SystemRoot%\System32\config\SOFTWARE" and mounted at >> "\REGISTRY\MACHINE\SOFTWARE". For a WOW64 process, by default there is >> extensive runtime redirection of keys in this hive to the subkeys >> "WOW6432Node" and "Classes\WOW6432Node". >> >> At the user level, there are two hives mounted. The user profile is >> stored on disk at "%USERPROFILE%\NTUSER.DAT" and mounted at >> "\REGISTRY\USER\<SID>", where "<SID>" is the string form of the user's >> security identifier (e.g. "S-1-5-21-<RID1>-<RID2>-<RID3>-<RID4>"). For >> a WOW64 process, there is no redirection of subkeys that are >> physically stored in this hive. >> >> The user's software classes hive is stored on disk at >> "%LOCALAPPDATA%\Microsoft\Windows\UsrClass.dat" and mounted at >> "\REGISTRY\USER\<SID>_Classes". In the user profile, the >> "Software\Classes" key is a symbolic link to the latter. For a WOW64 >> process, some subkeys in the classes hive are redirected to subkeys in >> "WOW6432Node" (i.e. "Software\Classes\WOW6432Node"). It's just a >> limited subset, including "CLSID", "DirectShow", "Interface", "Media >> Type", and "MediaFoundation". >> >> --- >> >> One never sees "\REGISTRY\MACHINE" and "\REGISTRY\USER" in the >> registry API because it's designed to always use the "RootDirectory" >> handle in the native NT object attributes [1]. For local access, the >> API maps real handles for "\REGISTRY\MACHINE" and "\REGISTRY\USER" to >> the predefined pseudo-handles HKEY_LOCAL_MACHINE and HKEY_USERS. >> Similarly, HKEY_CURRENT_USER is mapped to a handle for >> "\REGISTRY\USER\<SID>", where "<SID>" is the string form of the user's >> security identifier. For remote access via RegConnectRegistryW (i.e. >> winreg.ConnectRegistry), the predefined handles are mapped to >> remote-procedure-call (RPC) handles that proxy real key handles on the >> remote system. >> >> [1] >> https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_object_attributes >> > -- https://mail.python.org/mailman/listinfo/python-list