2011-10-06 27 views
5

Ho alcuni problemi nella scrittura su un'unità di rete mappata (P :) in Windows 7 dal mio programma Delphi. Quando provo, ad esempio, ForceDirectories('P:\test\folder'), ottengo un errore (percorso non trovato).Perché il mio programma non riconosce i percorsi UNC mappati?

ho provato a digitare nel percorso UNC nel codice (ForceDirectories('\\computername\share\test\folder')) e che funziona. Tuttavia, ExpandUNCFileName('P:\') non sembra funzionare; restituisce 'P: \'. Su Windows XP, ExpandUNCFileName('P:\') restituisce il percorso UNC.

Come si ottiene il percorso UNC in Delphi su Windows 7 o altrimenti si scrive su un'unità di rete mappata?

Con ulteriori indagini, è come se mi manca un qualche tipo di inizializzazione in Windows. Ho un'altra applicazione (app2) che utilizza uno TcxShellComboBox (un componente DevExpress). Dopo aver navigato in P: in questa combobox, in app2, le chiamate a ExpandUNCFileName funzionano correttamente nella prima applicazione. Lo stesso con FileExists su file in P:, restituisce False prima di passare a P: in app2, restituisce true dopo e fino al riavvio del computer.

+0

È questo, per caso, un servizio? Il comportamento che descrivi non ha nulla a che fare con Delphi e si verifica perché la mappatura dell'unità non è configurata per il processo. –

+0

Verificare di avere la lettera dell'unità mappata alla condivisione.Sono stato in grado di riprodurre il problema solo se la lettera dell'unità non è stata mappata (Delphi 7, 2007 XE). – crefird

+0

Non è un servizio, è un'applicazione per moduli VCL. – MGH

risposta

10

Secondo Microsoft KB Article, se Controllo account utente è abilitato e se si esegue il mapping di un'unità di rete da Esplora risorse (non elevato), i programmi elevati non avranno accesso a tale unità. Citazione:

Se un utente è connesso a Windows Vista o di Windows 7, e se Controllo account utente è abilitato, un programma che utilizza l'accesso filtrato dell'utente token e un programma che utilizza token di accesso di amministratore dell'utente può funzionare allo stesso tempo. Poiché LSA ha creato i token di accesso durante due sessioni di accesso separate, i token di accesso contengono ID di accesso separati.

Quando le condivisioni di rete sono mappate, vengono collegate alla sessione di accesso corrente per il token di accesso al processo corrente. Ciò significa che, se un utente utilizza il prompt dei comandi (Cmd.exe) insieme al token di accesso filtrato per mappare una condivisione di rete, la condivisione di rete non viene mappata per i processi eseguiti con il token di accesso amministratore completo.

Dato che nei commenti è stato eseguito Delphi "Come amministratore" (elevato), questo è il tuo problema.

Solutions:

  1. non vengono eseguiti Delphi elevati se non è necessario. Se hai bisogno di un'elevazione nel tuo software, separalo in due parti (elevata e non elevata) e accedi alla rete mappata dalla prima parte. Quindi accedere all'altra parte utilizzando un oggetto COM elevato o semplicemente eseguendo un file eseguibile separato.

  2. un'unità di rete da un prompt di rete elevata, quindi l'unità di rete mappata sarà disponibile per l'utente con privilegi elevati:

    a. Aprire prompt dei comandi con privilegi elevati (eseguire "cmd.exe" come amministratore)

    b. Type net use p: \\computername\share\test\folder

+2

se scegli la seconda soluzione, dovrai mapparla una seconda volta dal tuo utente normale (senza elevazione) se di solito ne hai bisogno ... – Whiler

Problemi correlati