8

Chcę, aby moja aplikacja internetowa MVC3 miała dostęp do% APPDATA% (na przykład C:\Users\MyUsername\AppData\Roaming w systemie Windows 7), ponieważ przechowuję tam pliki konfiguracyjne. Dlatego utworzyłem pulę aplikacji w IIS z tożsamością użytkownika "MyUsername", utworzyłem profil tego użytkownika logując się na konto i włączyłem opcję "Załaduj profil użytkownika" (i tak było prawdą domyślnie). Podszywanie się jest wyłączone.Pula aplikacji IIS 7.5 używa nieprawidłowego% APPDATA% dla niestandardowego użytkownika jako tożsamości

Teraz mam problem, że% appdata% (w C#):

appdataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

postanawia c:\windows\system32\inetsrv zamiast C:\Users\MyUsername\AppData\Roaming.

UPDATE: Dokładniej, powyższy kod C# zwraca pusty ciąg, tak że Path.GetFullPath(Path.Combine(appdataDir, "MyAppName")) poprzedza bieżącą ścieżkę do mojego nazwa aplikacji, w wyniku c:\windows\system32\inetsrv\MyAppName.

wiem Zrobiłem tę pracę, zanim z tej samej aplikacji internetowej na komputerze z systemem Windows Server 2008 R2, a teraz dostaję ten problem z tej samej wersji głównej 7.5 IIS na moim Windows 7.
użyłem taka sama procedura jak poprzednio: Utworzono nowego użytkownika, zalogowałem się jako ten użytkownik, aby utworzyć profil i katalogi APPDATA, a następnie dodałem pula aplikacji o tej tożsamości i ostatecznie dodałem aplikację internetową do tej puli.

Wszelkie pomysły?

+0

Czy Twój pula aplikacji skonfigurowane jako Classic lub trybu zintegrowanego? – Kev

+0

@Kev: tryb zintegrowany. – AndiDog

+0

Mam ten sam problem. Szczególnie dziwne jest to, że ścieżka do Environment.SpecialFolder.UserProfile działa dobrze, a jeśli utworzę ścieżkę do folderu AppData, to działa. – Jason

Odpowiedz

0

Mam ten sam problem. Czy przypadkiem zainstalowałeś wersję beta Visual Studio 11? Zrobiłem to niedawno i zauważyłem kilka różnic w sposobie kompatybilności plików .dll 4.0 z tym kodem. Nadal próbuję wyśledzić problem na pewno, ale wcześniej nie miałem tego problemu.

Edit:

Po porównaniu dekompilowana źródeł od 4,0 do 4,5 dla GetFolderPath (i pokrewne), istnieją różnice. Czy są źródłem problemu ... Nie jestem jeszcze pewien.

Edytuj 2: Oto odpowiednie zmiany. Pracuję nad próbą obu, aby zobaczyć, czy dostaję różne wyniki. [Code usunięte]

Edit 3:

mam teraz próbował nazywając funkcję SHGetFolderPath bezpośrednio, co jest, co kończy .NET Framework się robi, tak. Zwraca E_ACCESSDENIED (-2147024891/0x80070005). Nie wiem, co zmieniło się w niektórych przypadkach, ale nie w innych.

Edycja 4:

Ponieważ dostajesz pusty ciąg, może chcesz przełączyć swój kod w użyciu funkcję SHGetFolderPath, dzięki czemu można uzyskać hresult i przynajmniej wiem, co dokładnie się dzieje.

void Main() { 
    Console.WriteLine(GetFolderPath(Environment.SpecialFolder.ApplicationData)); 
} 

[System.Runtime.InteropServices.DllImport("shell32.dll")] 
static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, uint dwFlags, StringBuilder pszPath); 

private string GetFolderPath(Environment.SpecialFolder folder) { 
    var path = new StringBuilder(260); 
    var hresult = SHGetFolderPath(IntPtr.Zero, (int) folder, IntPtr.Zero, 0, path); 
    Console.WriteLine(hresult.ToString("X")); 

    return ((object) path).ToString(); 
} 
+1

Nie, mam zainstalowane Visual Studio 2010 i żadne inne. Jakie są różnice? – AndiDog

+0

Otrzymuję również 0x80070005 (E_ACCESSDENIED). Postaram się zbadać więcej. – AndiDog

0
+0

Mam załadowany profil użytkownika i pojawia się ten sam problem (myślę, że ten problem występuje tylko w systemie Windows 7). – AndiDog

+0

Na podstawie tego, co opisano w oryginalnym pytaniu, utworzyłeś foldery profilu, ale nie wykonałeś kroku koniecznego do załadowania profilu dla usług IIS. Jeśli zrobiłeś ten krok, dodaj go do swojego opisu. Jeśli nie, przeczytaj link, który podałem i postępuj zgodnie z instrukcjami. – grahamesd

+0

Powiedziałem na moje pytanie, że mam włączoną opcję, więc to rozwiązanie nie działa dla mnie, przepraszam. Musi mieć coś wspólnego z Windows 7. Kiedy będę miał czas, spróbuję w systemie Windows 8 (nie w wariancie serwera) i zobaczę, co się stanie. – AndiDog

14

Otwórz swoją %WINDIR%\System32\inetsrv\config\applicationHost.config i poszukaj <applicationPoolDefaults>. Pod numerem <processModel> upewnij się, że nie masz setProfileEnvironment="false". Jeśli tak, ustaw go na true.

+0

Wartość to ''. – AndiDog

+0

Ustaw go na '' –

+2

Ta odpowiedź rozwiązała problem. –

0

Doświadczyłem ostatnio tego samego problemu.Jak wspomniał Amit, problem polega na tym, że profil użytkownika nie został załadowany. Ustawienie dotyczy wszystkich pul aplikacji i znajduje się w pliku applicationHost.config (zazwyczaj C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config). Jeśli zaktualizujesz elementy applicationPoolDefaults w następujący sposób, będzie działać;

<applicationPoolDefaults managedRuntimeVersion="v4.0"> 
    <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" /> 
</applicationPoolDefaults> 

Próbowaliśmy tego z IIS 7.5, i przejdziemy do produkcji bez problemu.

Możesz zautomatyzować to, jeśli chcesz;

appcmd set config -section:system.applicationHost/applicationPools /applicationPoolDefaults.processModel.setProfileEnvironment:"true" /commit:apphost 

lub jeśli wolisz powershell

Set-WebConfigurationProperty "/system.applicationHost/applicationPools/applicationPoolDefaults/processModel" -PSPath IIS:\ -Name "setProfileEnvironment" -Value "true" 

nadzieję, że to pomaga

Powiązane problemy