|
38 | 38 | #include <errno.h>
|
39 | 39 | #include <shlobj.h>
|
40 | 40 | #include <Userenv.h>
|
| 41 | +#include <sddl.h> |
41 | 42 |
|
42 | 43 | #include "win32auth.h"
|
43 | 44 | #include "homedirhelp.h"
|
@@ -128,87 +129,46 @@ int GetDomainFromToken ( HANDLE *hAccessToken, UCHAR *domain, DWORD dwSize)
|
128 | 129 |
|
129 | 130 | char *GetHomeDirFromToken(char *userName, HANDLE token)
|
130 | 131 | {
|
131 |
| - UCHAR domain[200]; |
132 |
| - wchar_t pw_buf[MAX_PATH] = { L'\0' }; |
133 |
| - PWSTR tmp; |
134 |
| - |
135 |
| - debug("-> GetHomeDirFromToken()..."); |
136 |
| - |
137 |
| - PROFILEINFO profileInfo; |
138 |
| - |
139 |
| - // find the server name of the domain controller which created this token |
140 |
| - GetDomainFromToken ( &token, domain, sizeof(domain)); |
141 |
| - //if (MultiByteToWideChar(CP_UTF8, 0, domain, -1, domainW, sizeof(domainW)) == 0) |
142 |
| - //{ |
143 |
| - //debug("DomainServerName encoding conversion failure"); |
144 |
| - //return NULL; |
145 |
| - //} |
146 |
| - |
147 |
| - profileInfo.dwFlags = PI_NOUI; |
148 |
| - profileInfo.lpProfilePath = NULL; |
149 |
| - profileInfo.lpUserName = userName; |
150 |
| - profileInfo.lpDefaultPath = NULL; |
151 |
| - profileInfo.lpServerName = domain; |
152 |
| - profileInfo.lpPolicyPath = NULL; |
153 |
| - profileInfo.hProfile = NULL; |
154 |
| - profileInfo.dwSize = sizeof(profileInfo); |
155 |
| - |
156 |
| - /* |
157 |
| - * And retrieve homedir from profile. |
158 |
| - */ |
159 |
| - |
160 |
| - if (SUCCEEDED(SHGetKnownFolderPath(&FOLDERID_Documents, 0, token, &tmp))) |
161 |
| - { |
162 |
| - wcscpy_s(pw_homedir, MAX_PATH, tmp); |
163 |
| - CoTaskMemFree(tmp); |
164 |
| - } else |
165 |
| - { |
166 |
| - debug("SHGetKnownFolderPath on FOLDERID_Documents failed"); |
167 |
| - GetWindowsDirectoryW(pw_homedir, MAX_PATH); |
168 |
| - } |
169 |
| - |
170 |
| - // update APPDATA user's env variable |
171 |
| - if (SUCCEEDED(SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, token, &tmp))) |
172 |
| - { |
173 |
| - SetEnvironmentVariableW(L"APPDATA", tmp); |
174 |
| - CoTaskMemFree(tmp); |
175 |
| - } |
176 |
| - |
177 |
| - // update LOCALAPPDATA user's env variable |
178 |
| - if (SUCCEEDED(SHGetKnownFolderPath(&FOLDERID_LocalAppData, 0, token, &tmp))) |
179 |
| - { |
180 |
| - SetEnvironmentVariableW(L"LOCALAPPDATA", tmp); |
181 |
| - CoTaskMemFree(tmp); |
182 |
| - } |
183 |
| - |
184 |
| - debug("<- GetHomeDirFromToken()..."); |
185 |
| - |
186 |
| - return pw_homedir; |
187 |
| -} |
188 |
| - |
189 |
| - |
190 |
| -wchar_t *GetHomeDir(char *userName) |
191 |
| -{ |
192 |
| - /* |
193 |
| - * Get home directory path (if this fails, the user is invalid, bail) |
194 |
| - */ |
195 |
| - |
196 |
| - wchar_t *homeDir = NULL; |
197 |
| - |
198 |
| - homeDir = gethomedir_w(userName, NULL); |
199 |
| - |
200 |
| - if (homeDir == NULL || homeDir[0] == L'\0') |
201 |
| - { |
202 |
| - return NULL; |
203 |
| - } |
204 |
| - |
205 |
| - debug3("GetHomeDir: homedir [%ls]", homeDir); |
206 |
| - |
207 |
| - wcsncpy(pw_homedir, homeDir, sizeof(pw_homedir)); |
| 132 | + UCHAR InfoBuffer[1000]; |
| 133 | + PTOKEN_USER pTokenUser = (PTOKEN_USER)InfoBuffer; |
| 134 | + DWORD dwInfoBufferSize, tmp_len; |
| 135 | + LPWSTR sid_str = NULL; |
| 136 | + wchar_t reg_path[MAX_PATH]; |
| 137 | + HKEY reg_key = 0; |
| 138 | + |
| 139 | + /* set home dir to Windows if any of below fair*/ |
| 140 | + GetWindowsDirectoryW(pw_homedir, MAX_PATH); |
| 141 | + |
| 142 | + tmp_len = MAX_PATH; |
| 143 | + if (GetTokenInformation(token, TokenUser, InfoBuffer, |
| 144 | + 1000, &dwInfoBufferSize) == FALSE || |
| 145 | + ConvertSidToStringSidW(pTokenUser->User.Sid, &sid_str) == FALSE || |
| 146 | + swprintf(reg_path, MAX_PATH, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\%ls", sid_str) == MAX_PATH || |
| 147 | + RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_path, 0, STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_WOW64_64KEY, ®_key) != 0 || |
| 148 | + RegQueryValueExW(reg_key, L"ProfileImagePath", 0, NULL, pw_homedir, &tmp_len) != 0 ){ |
| 149 | + /* one of the above failed */ |
| 150 | + debug("cannot retirve profile path - perhaps user profile is not created yet"); |
| 151 | + } |
208 | 152 |
|
209 |
| - free(homeDir); |
210 |
| - |
211 |
| - return pw_homedir; |
| 153 | + if (sid_str) |
| 154 | + LocalFree(sid_str); |
| 155 | + |
| 156 | + if (reg_key) |
| 157 | + RegCloseKey(reg_key); |
| 158 | + |
| 159 | + /* TODO - populate APPDATA, LOCALADPPDATA, TEMP, etc */ |
| 160 | + SetEnvironmentVariableW(L"LOCALAPPDATA", L""); |
| 161 | + SetEnvironmentVariableW(L"APPDATA", L""); |
| 162 | + SetEnvironmentVariableW(L"TEMP", L""); |
| 163 | + SetEnvironmentVariableW(L"TMP", L""); |
| 164 | + SetEnvironmentVariableW(L"USERDNSDOMAIN", L""); |
| 165 | + SetEnvironmentVariableW(L"USERDOMAIN", L""); |
| 166 | + SetEnvironmentVariableW(L"USERDOMAIN_ROAMINGPROFILE", L""); |
| 167 | + SetEnvironmentVariableW(L"USERPROFILE", L""); |
| 168 | + |
| 169 | + debug("<- GetHomeDirFromToken()..."); |
| 170 | + |
| 171 | + return pw_homedir; |
212 | 172 | }
|
213 | 173 |
|
214 | 174 | /*
|
|
0 commit comments