Impersonate different user on current HttpContext |
Visite: 6291 |
mercoledì 20 settembre 2006 |
Page not translated!
I'm sorry but the text of this page doesn't have translation at this time.
Il quesito è semplice: perché se effettuo una verifica sull'esistenza di un file
condiviso mi viene sempre restituito
False?
Proviamo
a rappresentare l'errore:
FileInfo file = new FileInfo(@"\\\\192.168.1.1\\C\\fileTest1.txt");
Response.Write(file.Exists.ToString());
Indicando informazioni corrette sul percorso remoto del file, quello che vedremo a video eseguendo la nostra pagina Web, sarà sempre
False.
Il motivo è semplice come il quesito: nel momento in cui cerchiamo di interrogare
il FileSystem del computer remoto, l'applicativo .NET ci logga come utente predefinito
per le pagine .ASPX (ASPNET o NETWORK SERVICE a seconda del sistema utilizzato -
WinXP/2000 o Win2003) che, ovviamente, non possiede i permessi necessari anche solo
per avere informazioni sul file.
Per ovviare al problema possiamo impersonare un altro utente (con le credenziali
di uno esistente sulla macchina remota) ed eseguire il contesto attivo della chiamata
HTTP mediante queste credenziali.
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", "abc") ) {
FileInfo file = new FileInfo(@"\\\\192.168.1.1\\C\\fileTest1.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);
Agendo in questo modo e richiamando il metodo
ImpersonateUserOnContext prima della chiamata al FileSystem avremo una
risposta sicura sull'esistenza o meno del file remoto (assicuratevi che il file
remoto esista effettivamente, poi provate prima con credenziali corrette poi con
altre non corrette per vedere se il risultato cambia).
Clicca qui per scaricare l'esempio di questo articolo
|
Un buon Articolo...
|
| Scritto da Ciro D'Aloia - venerdì 14 novembre 2008 alle ore 15.13 |
|
Ciao!!
Sto cercando di usare questo codice per impersonare un utente di un altro dominio...mi spiego:
devo creare un task schedulato su una macchina remoto che si trova sotto un altro dominio.
Il Task me lo crea ma non setta la password e quindi il task non può partire.
Sto tentando di usare questo codice ma non si logga mai come un altro utente
es: impersonateUserOnContext("docdomain","admin","pwd");
ma niente il metodo restituisce sempre false!
Devo cambiare qualcosa nel web.config? O la sintassi del dominio è sbagliata?
Grazie per ogni suggerimento
|
| Scritto da Massimiliano P. - martedì 13 ottobre 2009 alle ore 12.49 |
Scrivi nuovo commento