Visualizzazione dei risultati da 1 a 5 su 5

Discussione: FileInfo

  1. #1
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848

    FileInfo

    Ciao a tutti,
    ho il seguente pezzetto di codice che dovrebbe verificare la presenza di un file in una cartella condivisa di un pc remoto:

    bool presente;
    string Percorso = @"\\10.1.8.15\CDG\";
    FileInfo f1 = new FileInfo(Percorso + @"File1.txt");

    if (f1.Exists)
    { presente = true; }
    else
    {lblError.Text += "Manca il file di flusso " + f1.ToString();}

    non riesco a capire però perchè mi dice sempre che il file non esiste, quando so per certo che tale file è presente (nella cartella C:\CDG della macchina 10.1.8.15).

    Cosa c'è di sbagliato in questo codice?

    Grazie

  2. #2
    Non funziona perché quando vai a cercare quel file condiviso ti "logghi" come utente locale della macchina (se sei su IIS allora ti logghi sulla macchina in remoto come utente ASPNET o NETWORK SERVICE a seconda del sistema che usi).

    Per "bypassare" il problema allora, devi validare il context attivo della richiesta come altro utente. Tempo fa avevo già avuto un problema simile, l'avevo risolto riutilizzando del codice trovato in rete:

    codice:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    
    public partial class paginaProva : System.Web.UI.Page
    {
        private enum LogonTypes : uint
        {
            Interactive = 2,
            Network = 3,
            Batch = 4,
            Service = 5,
            NetworkCleartext = 8
        }
    
        private enum LogonProviders : uint
        {
            Default = 0
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if ( ImpersonateUserOnContext("", "Administrator", "a") ) {
                FileInfo file = new FileInfo(@"\\10.1.8.15\CDG\File1.txt");
                Response.Write(file.Exists.ToString());
            }
        }
    
        public static bool ImpersonateUserOnContext(string domain, string username, string password)
        {
            bool r = false;
            IntPtr token;
            bool logged = LogonUser(
                username,
                domain,
                password,
                LogonTypes.Interactive,
                LogonProviders.Default,
                out token);
            if (logged)
            {
                ImpersonateLoggedOnUser(token);
                CloseHandle(token);
                r = true;
            }
            return r;
        }
    
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(
            string domain,
            string username,
            string password,
            LogonTypes logonType,
            LogonProviders logonProvider,
            out IntPtr token);
    
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool ImpersonateLoggedOnUser(IntPtr handle);
    
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr handle);
    }
    Prova ad eseguire questo file.. prova con la password giusta e poi con una sbagliata. Vedrai che ti verrà segnalato true/false a seconda dei casi.

    Fammi sapere!


  3. #3
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    Eventualmente se dicessi ai sistemisti di aggiungere gli utenti ASPNET e Network Service sull'altra macchina, poi dovrebbe funzionare ugualmente?
    Cmq appena riesco proprio il tuo script, e ti faccio sapere.

  4. #4
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    Sto testando il tuo scritp.
    L'unica cosa che ho modificato è la parte:


    if (ImpersonateUserOnContext("", "BUCAPGE", "xxxxx"))

    mettendo username (BUCAPGE) e password che uso per connettermi alla macchina tramite il Remote Desktop, ma purtroppo ancora non vede il file.

  5. #5
    Si scusa.. nn ti avevo avvisato che lo stesso utente deve esistere sulla macchina da cui esegui l'applicativo .NET.
    Se nella macchina di destinazione esiste l'utente BUCAPGE, allora quest'ultimo deve esistere anche sulla macchina locale dove esegui le pagine .NET con la stessa password.
    Questo perché la classe in questione si logga sulla macchina in locale e poi invia queste info alla macchina remota. Se non esiste l'utente in locale, viene negata l'autorizzazione al login e quindi cerchi di richiamare il file con le credenziali di default.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.