<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=GetUserShellFolderFromRegistry</id>
	<title>GetUserShellFolderFromRegistry - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=GetUserShellFolderFromRegistry"/>
	<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=GetUserShellFolderFromRegistry&amp;action=history"/>
	<updated>2026-05-12T20:51:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=GetUserShellFolderFromRegistry&amp;diff=17677&amp;oldid=prev</id>
		<title>Anders: Created page with &#039;{{PageAuthor|Anders}}  This useless piece of code tries to get a shell folder path for a specific user, for use with EnumUsersReg. There is no documented way to get a shell f…&#039;</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=GetUserShellFolderFromRegistry&amp;diff=17677&amp;oldid=prev"/>
		<updated>2009-09-22T08:32:52Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;{{PageAuthor|Anders}}  This useless piece of code tries to get a shell folder path for a specific user, for use with &lt;a href=&quot;/EnumUsersReg&quot; title=&quot;EnumUsersReg&quot;&gt;EnumUsersReg&lt;/a&gt;. There is no documented way to get a shell f…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{PageAuthor|Anders}}&lt;br /&gt;
&lt;br /&gt;
This useless piece of code tries to get a shell folder path for a specific user, for use with [[EnumUsersReg]]. There is no documented way to get a shell folder for another user without a token handle AFAIK, so we have to use raw registry lookups in undocumented locations. This code tries its best to expand environment variables etc, but be prepared for &amp;quot;&amp;quot; (empty string) if the lookup fails. See &amp;quot;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders&amp;quot; for a list of string id&amp;#039;s to use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
!include EnumUsersReg.nsh&lt;br /&gt;
!include GetUserShellFolderFromRegistry.nsh&lt;br /&gt;
&lt;br /&gt;
Function MyEnumUsersRegCallback&lt;br /&gt;
Pop $0&lt;br /&gt;
!insertmacro GetUserShellFolderFromRegistry &amp;quot;SendTo&amp;quot; $0 $1&lt;br /&gt;
DetailPrint $0=$1&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
${EnumUsersReg} MyEnumUsersRegCallback temp.key&lt;br /&gt;
SectionEnd&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==GetUserShellFolderFromRegistry.nsh==&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!macro _GetUserShellFolderFromRegistry_SetEnv env regh regp regv expenv tmpvar&lt;br /&gt;
System::Call &amp;#039;kernel32::GetEnvironmentVariable(t &amp;quot;${env}&amp;quot;,t.s,i ${NSIS_MAX_STRLEN})i&amp;#039;&lt;br /&gt;
ReadRegStr ${tmpvar} ${regh} &amp;quot;${regp}&amp;quot; &amp;quot;${regv}&amp;quot;&lt;br /&gt;
!if &amp;quot;${expenv}&amp;quot; != &amp;quot;&amp;quot;&lt;br /&gt;
	ExpandEnvStrings ${tmpvar} ${tmpvar}&lt;br /&gt;
!endif&lt;br /&gt;
System::Call &amp;#039;kernel32::SetEnvironmentVariable(t &amp;quot;${env}&amp;quot;,t &amp;quot;${tmpvar}&amp;quot;)&amp;#039;&lt;br /&gt;
!macroend&lt;br /&gt;
!macro _GetUserShellFolderFromRegistry_RestoreEnv env&lt;br /&gt;
System::Call &amp;#039;kernel32::SetEnvironmentVariable(t &amp;quot;${env}&amp;quot;,ts)&amp;#039;&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
Function GetUserShellFolderFromRegistry&lt;br /&gt;
Exch $1 ;_hku&lt;br /&gt;
Exch&lt;br /&gt;
Exch $2 ;_shellfolderid&lt;br /&gt;
Push $0&lt;br /&gt;
Push $3&lt;br /&gt;
;NOTE: we try the legacy key first so we don&amp;#039;t have to expand&lt;br /&gt;
ReadRegStr $0 HKU &amp;quot;$1\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders&amp;quot; $2&lt;br /&gt;
${If} $0 == &amp;quot;&amp;quot;&lt;br /&gt;
	StrCpy $3 $1 3&lt;br /&gt;
	${If} $3 == &amp;quot;S-1&amp;quot;&lt;br /&gt;
		ReadRegStr $2 HKU &amp;quot;$1\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders&amp;quot; $2&lt;br /&gt;
		;Let&amp;#039;s hope other env strings like username is not used by anyone&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_SetEnv &amp;quot;APPDATA&amp;quot; HKU &amp;quot;$1\Volatile Environment&amp;quot; APPDATA &amp;quot;&amp;quot; $3&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_SetEnv &amp;quot;HOMEDRIVE&amp;quot; HKU &amp;quot;$1\Volatile Environment&amp;quot; HOMEDRIVE &amp;quot;&amp;quot; $3&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_SetEnv &amp;quot;HOMEPATH&amp;quot; HKU &amp;quot;$1\Volatile Environment&amp;quot; HOMEPATH &amp;quot;&amp;quot; $3&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_SetEnv &amp;quot;HOMESHARE&amp;quot; HKU &amp;quot;$1\Volatile Environment&amp;quot; HOMESHARE &amp;quot;&amp;quot; $3&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_SetEnv &amp;quot;userprofile&amp;quot; HKLM &amp;quot;SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1&amp;quot; ProfileImagePath x $3&lt;br /&gt;
		ExpandEnvStrings $0 $2&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_RestoreEnv &amp;quot;userprofile&amp;quot;&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_RestoreEnv &amp;quot;HOMESHARE&amp;quot;&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_RestoreEnv &amp;quot;HOMEPATH&amp;quot;&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_RestoreEnv &amp;quot;HOMEDRIVE&amp;quot;&lt;br /&gt;
		!insertmacro _GetUserShellFolderFromRegistry_RestoreEnv &amp;quot;APPDATA&amp;quot;&lt;br /&gt;
	${Endif}&lt;br /&gt;
${EndIf}&lt;br /&gt;
StrCpy $1 $0&lt;br /&gt;
Pop $3&lt;br /&gt;
Pop $0&lt;br /&gt;
Pop $2&lt;br /&gt;
Exch $1&lt;br /&gt;
FunctionEnd&lt;br /&gt;
!macro GetUserShellFolderFromRegistry _shellfolderid _hku _outvar&lt;br /&gt;
push &amp;quot;${_shellfolderid}&amp;quot;&lt;br /&gt;
push &amp;quot;${_hku}&amp;quot;&lt;br /&gt;
call GetUserShellFolderFromRegistry&lt;br /&gt;
!if &amp;quot;${_outvar}&amp;quot; != &amp;quot;&amp;quot;&lt;br /&gt;
	pop ${_outvar}&lt;br /&gt;
!endif&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:User Accounts Related Functions]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
</feed>