2013-06-14 13 views
7

Przyjrzałem się metodzie Environment.GetFolderPath i wyliczeniu System.Environment.SpecialFolder, ale nie widziałem niczego, co zwróciłoby ścieżkę folder Default Users.Jak uzyskać folder Default Users (np. C: users Default)

Czy ktoś może mi powiedzieć, jak uzyskać programowo domyślny folder (lub nawet lepiej domyślną ścieżkę do folderu AppData lokalnego użytkownika np. C: \ users \ Default \ AppData \ Local), ponieważ potrzebuję skopiować niektóre pliki do tego folderu ?

Dziękuję

Odpowiedz

6

Istnieje wiele artykułów w internecie, które opisują, jak zmienić domyślną ścieżkę użytkownika:

http://support.microsoft.com/kb/214636

http://www.nextofwindows.com/how-to-change-user-profile-default-location-in-windows-7/

Wszyscy twierdzą, że obecna ścieżka Domyślny profil jest przechowywany w następujących lokalizacja rejestru:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 

np. % SystemDrive% \ Users \ default

I znalazłem tę stronę, aby uzyskać dysku systemowym: How to get current windows directory e.g. C:\ in C#

Path.GetPathRoot(Environment.SystemDirectory) 

Więc mam zamiar użyć. Dzięki za pomoc.

UPDATE

Właśnie próbowałem poniższy kod i zwraca c: \ Users \ default. Nie ma więc potrzeby zastępowania tekstem% SystemDrive% przechowywanym w kluczu rejestru. Zastępuje go automatycznie.

using (RegistryKey profileListKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList")) 
{ 
    string defaultPath = profileListKey.GetValue("Default").ToString(); 
} 
3

urywek z LINQPad (język C# Program), który wyświetla 'C: \ Users \ default \ Pulpit':

void Main() 
{ 
    GetFolderPath(Environment.SpecialFolder.Desktop).Dump(); 
} 

// Define other methods and classes here 
[DllImport("shfolder.dll", CharSet=CharSet.Auto)] 
internal static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, int hToken, int dwFlags, StringBuilder lpszPath); 

public static string GetFolderPath(Environment.SpecialFolder folder) 
{ 
    if (!Enum.IsDefined(typeof(Environment.SpecialFolder), folder)) 
    { 
     throw new Exception("Crap"); 
    } 
    StringBuilder lpszPath = new StringBuilder(260); 

    SHGetFolderPath(IntPtr.Zero, (int) folder, -1, 0, lpszPath); 
    string path = lpszPath.ToString(); 
    new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path).Demand(); 
    return path; 
} 

EDIT: Miałem następujące importu w LINQPad

System.Runtime.InteropServices 
System.Globalization 
System.Security.Permissions 

użyłem reflektor patrzeć Environment.GetFolderPath a potem przyjrzał się SHGetFolderPath że specifies przekazując -1 jako hToken masz defaul t Użytkownik zamiast tego.

+2

SHGetFolderPath - „Przypisywanie hToken parametru Wartość -1 wskazuje domyślnego użytkownika Umożliwia to klientom SHGetFolderPath znaleźć lokalizacje folderu (na przykład folderu Pulpit) dla domyślnego użytkownika domyślnego profilu podręcznik użytkownika.. jest duplikowany po utworzeniu nowego konta użytkownika i zawiera specjalne foldery, takie jak Moje dokumenty i komputer. Wszelkie elementy dodane do folderu Domyślny użytkownik pojawiają się również na każdym nowym koncie użytkownika. " - http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx –

+0

Nie polecałbym teraz używania p/Invoke. – JoanComasFdz

+0

@JoanComasFdz, więc jak poleciłbyś je zamiast tego? –

0

Nie można, ponieważ dostęp do tego folderu jest zabroniony, ten folder jest używany wyłącznie przez firmę Microsoft. Z pewnością Środowisko lub jakakolwiek inna klasa nie zapewni Ci takiej funkcjonalności. Można to zrobić tylko za pomocą hakowania?

+0

Uprawnienia są zależne od kontekstu, w którym działa aplikacja. Administrator może z pewnością uzyskać dostęp do folderu. –

Powiązane problemy