[C#]Problema Permessi Windows7 per Applicazione BACKUP

venerdì 13 aprile 2012 - 09.41
Tag Elenco Tags  C#

HardTekCrash Profilo | Newbie

Chiedo scusa per aver riaperto il thread,ma mi sono accorto di averlo aperto in una sezione non appropriata al mio problema,vi riporto quanto scritto nell'altro:


Salve a tutti, sono un nuovo utente di questo (fantastico) Forum :)
Vengo dalla provincia di Milano.
Arriviamo al dunque,
lavoro con alcune multinazionali nel settore IT,ora con una di queste abbiamo impostato tutti gli utenti che utilizzano Win7 come PowerUser con accessi limitati.
Ovviamente ogni computer ha un account di amministratore locale,le quali credenziali sono conosciute solamente da noi amministratori di rete.
Il problema è questo,mi serve un programma che effettui i Backup quando abbiamo da fare un Rollout,quindi sto scrivendo questa applicazione su misura per noi.
Dal momento che però gli utenti non sono Amministratori,non credo di riuscire a copiare i files interessati dal PC al HardDisk esterno (che noi forniamo).
Avevo visto qualcosa su internet,un codice per avviare delle applicazioni utilizzando un altro account (impostato nel codice) e funziona alla perfezione,ma dal momento che voglio effettuare una copia di files su un HardDisk esterno,come faccio se gli utenti non sono amministratori?
C'è un modo per eseguire la copia utilizzando l'account da amministratore (pre-impostato nel codice)?
Non so se mi sono spiegato bene,in caso contrario chiedo scusa.
Spero riusciate ad aiutarmi ad eliminare questo grattacapo che ormai mi perseguita da giorni.
Nel frattempo,vi saluto tutti e vi ringrazio anticipatamente

massimo.missaglia Profilo | Newbie

Ciao,
Potresti impersonare l'oggetto .Net WindowsIdentity che consente di rappresentare un utente utilizzando il token di un account Windows.

Importi i namespace:

using System.Runtime.InteropServices;
using Sysegm.Security.Principal;

puoi utilizzare il codice:

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto,SetLastError = true)]
private extern static int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);

private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 4;
private const int LOGON32_PROVIDER_DEFAULT = 0;
private static WindowsImpersonationContext _CtxImpersonation;

public bool ImpersonateUser(String UserLogon, String UserPassword, String Domain)
{
IntPtr ptrToken = IntPtr.Zero;
IntPtr ptrTokenDuplicate = IntPtr.Zero;
if (LogonUser(UserLogon, Domain, UserPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref ptrToken) != 0)
{
if (DuplicateToken(ptrToken, 2, ref ptrTokenDuplicate) != 0)
{
WindowsIdentity UserIdentity = new WindowsIdentity(ptrTokenDuplicate);
_CtxImpersonation = UserIdentity.Impersonate();
if (null != UserIdentity) return true;
}
}
return false;
}

public void UnImpersonate()
{
_CtxImpersonation.Undo();
}



http://www.massimomissaglia.com/Pages/Articles.aspx?Tag=Windows%2bForm&Pid=9&Title=Impersonare+un+utente

Massimo Missaglia
-------------------------------
www.MassimoMissaglia.com

HardTekCrash Profilo | Newbie

Grazie mille Massimo,sei stato gentilissimo!!
Proverò il codice e ti farò sapere ;-)
Grazie ancora,nel frattempo accetto ulteriori suggerimenti.
Saluti a tutti!

pieroalampi Profilo | Expert

ciao scusa se intervengo ma se ti è stato utile dovresti accettare il post a massimo.missaglia per chiuderlo
in ogni caso puoi partire da qui:
http://msdn.microsoft.com/it-it/library/system.serviceprocess.serviceprocessinstaller.account.aspx

------------------------------------------------------
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA
------------------------------------------------------

HardTekCrash Profilo | Newbie

Ciao Piero,si ho visto la funzione "Accetta" solo che come dicevo,appena ho 2 minuti lo provo.
Stamattina avrei da lavorare al progetto,quindi proverò il codice e vi darò la possibilità di chiuderlo in caso funzionasse.
Grazie ancora.

HardTekCrash Profilo | Newbie

Grazie mille Massimo,ho provato il codice e funziona alla grande!!
Solo un'ultima informazione:
Io ho inserito il codice per la copia dei file in questa parte del codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
è giusto così,o sto facendo una cavolata?
Grazie ancora

massimo.missaglia Profilo | Newbie

All'interno del codice chiami la funzione di Impersonificazione, poi fai le operazioni che devi fare con l'utente "emulato", quindi ritorni con l'utente originale.

In pratica se inserisci il codice che ti ho postato in una classe lo puoi riutilizzarle ovunque nel tuo progetto :

protected void Page_Load(object sender, EventArgs e)
{
/* "Emulo" l'utene "Utente1" avente password "pa$$w0rd" del mio dominio "Contoso" */
Impersonate("Utente1","pa$$w0rd", "Contoso");

...
Elenco delle operazioni da svolgere come "Contoso\Utente1"
...

/* Ritorno all'utente "originale" */
UnImpersonate();
}
Massimo Missaglia
-------------------------------
www.MassimoMissaglia.com

HardTekCrash Profilo | Newbie

In realtà inizalmente avevo provato così però non mi funzionava,ho appena scoperto che stavo utilizzando un account del computer bloccato
Grazie ancora Massimo,sei stato veramente gentilissimo!
Mi hai risolto un grosso problema!
Ti auguro buona giornata
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5