8

Desidero che l'applicazione Web MVC3 acceda a% APPDATA% (ad esempio C:\Users\MyUsername\AppData\Roaming su Windows 7) perché memorizzo lì i file di configurazione. Pertanto, ho creato un pool di applicazioni in IIS con l'identità dell'utente "MyUsername", creato il profilo di quell'utente accedendo all'account e attivato l'opzione "Carica profilo utente" (era comunque true per impostazione predefinita). La rappresentazione è disattivata.Il pool di applicazioni IIS 7.5 utilizza% APPDATA% errato per l'utente personalizzato come identità

ora ho il problema che% appdata% (in C#):

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

decide di c:\windows\system32\inetsrv invece di C:\Users\MyUsername\AppData\Roaming.

UPDATE: Più precisamente, il codice C# sopra restituisce una stringa vuota, in modo che Path.GetFullPath(Path.Combine(appdataDir, "MyAppName")) antepone il percorso corrente al mio nome dell'applicazione, con conseguente c:\windows\system32\inetsrv\MyAppName.

so che ho fatto questo lavoro prima con la stessa applicazione web su un computer Windows Server 2008 R2, e ora sto ricevendo questo problema con la stessa versione principale 7.5 di IIS sul mio Windows 7.
ho usato la stessa procedura di prima: creato un nuovo utente, connesso come tale utente per creare il profilo e le directory APPDATA, quindi aggiunto il pool di applicazioni con questa identità e infine aggiunto l'applicazione Web a questo pool.

Qualche idea?

+0

È il vostro pool di applicazioni configurato come modalità integrata Classic o? – Kev

+0

@Kev: modalità integrata. – AndiDog

+0

Ho lo stesso problema. Ciò che è particolarmente strano è che il percorso per Environment.SpecialFolder.UserProfile funziona bene, e se io costruisco il percorso della cartella AppData da lì, funziona. – Jason

risposta

0

Sto vivendo lo stesso problema. Hai per caso installato la versione beta di Visual Studio 11? L'ho fatto di recente e ho notato un paio di differenze nel modo in cui i file dll compatibili con la 4.0 funzionano con il nostro codice. Sto ancora cercando di rintracciare il problema per certo, ma non avevo questo problema prima.

Edit:

Dopo aver confrontato le fonti decompilati da 4.0 e 4.5 per GetFolderPath (e correlati), ci sono differenze. Se sono la fonte del problema ... Non ne sono ancora sicuro.

Modifica 2: Ecco le modifiche rilevanti. Sto lavorando per provare entrambi a vedere se ottengo risultati diversi. [Code rimosso]

Edit 3:

ora ho provato a chiamare SHGetFolderPath direttamente, che è ciò che il .NET Framework finisce per fare, comunque. Restituisce E_ACCESSDENIED (-2147024891/0x80070005). Non so cosa sia cambiato dove lo sto ottenendo in alcuni casi specifici, ma non in altri.

Edit 4:

Dal momento che stai ricevendo una stringa vuota, si può decidere di cambiare il codice per utilizzare SHGetFolderPath modo da poter ottenere la HResult e almeno sapere che cosa esattamente sta succedendo.

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

No, ho installato Visual Studio 2010 e nessun altro beta. Quali differenze ci sono? – AndiDog

+0

Sto anche ricevendo 0x80070005 (E_ACCESSDENIED). Cercherò di indagare di più. – AndiDog

0

Il problema riguarda le impostazioni IIS. La risposta è qui: Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) returns String.Empty

+0

Ho caricato il profilo utente e ho lo stesso problema (penso che questo problema si verifichi solo su Windows 7). – AndiDog

+0

In base a ciò che hai descritto nella domanda originale, hai creato le cartelle del profilo, ma non hai eseguito il passaggio necessario per caricare il profilo per IIS. Se hai fatto quel passo, aggiungilo alla tua descrizione. Se non hai letto il link che ho dato e segui le istruzioni. – grahamesd

+0

Ho detto nella mia domanda che avevo questa opzione attivata, quindi questa soluzione non sembra funzionare per me, mi dispiace. Deve avere qualcosa a che fare con Windows 7. Quando avrò tempo, proverò su Windows 8 (non sulla variante del server) e vedrò cosa succede. – AndiDog

14

Apri il tuo %WINDIR%\System32\inetsrv\config\applicationHost.config e cerca <applicationPoolDefaults>. Sotto <processModel>, assicurati di non avere setProfileEnvironment="false". Se lo fai, impostalo su true.

+0

Il valore è ''. – AndiDog

+0

Impostalo su '' –

+2

Questa risposta è quella che ha risolto il problema per me. –

0

Ho riscontrato lo stesso problema di recente.Come menzionato da Amit, il problema è che il profilo utente non è caricato. L'impostazione è per tutti i pool di applicazioni e si trova in applicationHost.config (in genere C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config). Se aggiorni gli elementi applicationPoolDefaults come segue, funzionerà;

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

Abbiamo provato questo con IIS 7.5, e portato fino alla produzione senza problemi.

È possibile automatizzare questo se si desidera;

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

o se si preferisce PowerShell

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

Spero che questo aiuti