|
26 | 26 |
|
27 | 27 |
|
28 | 28 | #if TARGET_OS_WIN32
|
| 29 | +#include <lm.h> |
29 | 30 | #include <shellapi.h>
|
30 | 31 | #include <shlobj.h>
|
31 | 32 | #include <WinIoCtl.h>
|
@@ -577,15 +578,42 @@ CF_EXPORT CFURLRef CFCopyHomeDirectoryURLForUser(CFStringRef uName) {
|
577 | 578 | return result;
|
578 | 579 | }
|
579 | 580 | #elif TARGET_OS_WIN32
|
580 |
| - // This code can only get the directory for the current user |
581 |
| - CFStringRef userName = uName ? CFCopyUserName() : NULL; |
582 |
| - if (uName && !CFEqual(uName, userName)) { |
583 |
| - CFLog(kCFLogLevelError, CFSTR("CFCopyHomeDirectoryURLForUser(): Unable to get home directory for other user")); |
584 |
| - if (userName) CFRelease(userName); |
585 |
| - return NULL; |
586 |
| - } |
587 |
| - if (userName) CFRelease(userName); |
588 |
| - return CFCopyHomeDirectoryURL(); |
| 581 | + if (uName == NULL) |
| 582 | + return CFCopyHomeDirectoryURL(); |
| 583 | + |
| 584 | + CFStringRef home = NULL; |
| 585 | + LPUSER_INFO_1 pBuffer = NULL; |
| 586 | + DWORD dwEntriesRead = 0; |
| 587 | + DWORD dwEntries = 0; |
| 588 | + DWORD dwToken = 0; |
| 589 | + NTSTATUS nStatus; |
| 590 | + do { |
| 591 | + nStatus = NetUserEnum(NULL, 1, FILTER_NORMAL_ACCOUNT, (LPBYTE*)&pBuffer, |
| 592 | + MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwEntries, |
| 593 | + &dwToken); |
| 594 | + if (nStatus == NERR_Success || nStatus == ERROR_MORE_DATA) { |
| 595 | + for (unsigned uiEntry = 0; !home && uiEntry < dwEntriesRead; ++uiEntry) { |
| 596 | + CFStringRef name = |
| 597 | + CFStringCreateWithCStringNoCopy(kCFAllocatorSystemDefault, |
| 598 | + pBuffer[uiEntry].usri1_name, |
| 599 | + kCFStringEncodingUTF16, |
| 600 | + kCFAllocatorNull); |
| 601 | + |
| 602 | + if (CFEqual(uName, name)) |
| 603 | + home = pBuffer[uiEntry].usri1_home_dir |
| 604 | + ? CFStringCreateWithCString(kCFAllocatorSystemDefault, |
| 605 | + pBuffer[uiEntry].usri1_home_dir, |
| 606 | + kCFStringEncodingUTF16) |
| 607 | + : CFSTR(""); |
| 608 | + |
| 609 | + CFRelease(name); |
| 610 | + } |
| 611 | + } |
| 612 | + NetApiBufferFree(pBuffer); |
| 613 | + pBuffer = NULL; |
| 614 | + } while (nStatus == ERROR_MORE_DATA); |
| 615 | + |
| 616 | + return home; |
589 | 617 | #else
|
590 | 618 | #error Dont know how to compute users home directories on this platform
|
591 | 619 | #endif
|
|
0 commit comments