2010-03-23 11 views
11

Background: Ho una domanda che deve leggere i file su un'unità di rete (Z :)Accesso a un file su un'unità di rete

Questa grande opera nel mio dominio ufficio, ma non funziona su sito (in un dominio diverso). Per quanto posso dire, gli utenti del dominio e le unità di rete sono impostati allo stesso modo, tuttavia non ho accesso agli utenti ecc. Nel dominio dei clienti.

Quando non sono riuscito ad accedere all'unità di rete, ho pensato di aver bisogno di un token per un utente. Questo è come mi impersionate l'utente:

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

...

const string userName = "USER"; 
const string pass = "PASS"; 
const string domainName = "VALIDDOMAIN.local" //tried with valid domain name and with null, same result 
const int LOGON32_PROVIDER_DEFAULT = 0; 
const int LOGON32_LOGON_INTERACTIVE = 2; 

IntPtr tokenHandle = new IntPtr(0); 

bool returnValue = LogonUser(userName, domainName, pass, 
      LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, 
      ref tokenHandle); 

if (!returnValue) 
    throw new Exception("Logon failed."); 

WindowsImpersonationContext impersonatedUser = null; 
try 
{ 
    WindowsIdentity wid = new WindowsIdentity(tokenHandle); 
    impersonatedUser = wid.Impersonate(); 

} 
finally 
{ 
    if (impersonatedUser != null) impersonatedUser.Undo(); 
} 

Ora qui è la parte interessante/strano. Nella mia rete l'applicazione può già accedere all'unità di rete e, se provo a impersonare l'utente attivo (esattamente lo stesso utente, incluso lo stesso dominio), non sarà in grado di accedere all'unità di rete.

Questo mi lascia impotente poiché ora non ho idea di cosa funzioni e cosa no e, cosa più importante, funzionerà sul sito?

Cosa mi manca?

EDIT: Ho dimenticato di scrivere questo mentre inizialmente ponevo la domanda: ho provato ad inserire un nome di dominio valido e non ha funzionato, quindi dopo ho provato ad inserire null per ottenere lo stesso nome utente che vorrei senza questo codice (poiché funziona di default nel nostro dominio). Questo non ha aiutato, ed è così che domain = null; finito in questa domanda.

+3

Scommetto che i ragazzi di Superuser discutono il contrario (poiché questo ha il codice). – Codesleuth

+0

Perché non si concede all'account che esegue questo codice l'accesso in lettura all'unità? Quindi il tuo codice diventa questo: 'File.ReadAllBytes (filePath);' – ChaosPandion

+0

Ho fatto una domanda simile una volta; potresti trovarlo utile: http://stackoverflow.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials – Randolpho

risposta

6

Alcuni pensieri:

  • non utilizzare percorsi di unità logiche per accedere alle risorse di rete dal codice. Utilizza sempre percorsi UNC (ad esempio \\SERVER\Share\Filename.ext).
  • Abilita il controllo degli eventi di accesso/disconnessione dalla politica di sicurezza locale in modo che quando si richiama il metodo Impersonate, è possibile tenere traccia dell'insuccesso/successo in grande dettaglio
  • Si consiglia di creare un account nel proprio dominio che ha lo stesso nome utente e password di un account nell'altro dominio. Autentica il tuo dominio e l'autenticazione pass-through ti darà accesso alla condivisione di rete sull'altro dominio.
+0

Verificherà il percorso UNC. Tuttavia, sento che mi hai frainteso riguardo ai domini. Ci sono due domini separati nell'ambiente di test e uno sul sito che non comunica mai l'uno con l'altro. Su entrambi i lati l'utente si trova nel dominio a cui sta tentando di accedere. –

+0

Inoltre, non sono sicuro al 100% di avere il percorso UNC: gli amministratori di sistema dei clienti hanno impostato un utente di dominio in modo da poter disporre di un'unità di rete mappata. Posso ancora UNC per accedervi? –

0

Questo potrebbe sembrare stupido ma hai tentato di cambiare il modo in cui stai accedendo all'unità? Forse installa qualche forma di gestore virtuale che ti permette di visualizzare le informazioni sul disco. SSH per esempio?

Problemi correlati