Ho un'app con un manifest che richiede l'esecuzione come amministratore, ma una parte dell'app consiste nel mappare un'unità utilizzando WNetAddConnection2 che, a mio avviso, richiede l'esecuzione nel normale contesto utente a causa delle credenziali ecc. Esiste un modo per eseguire questo bit di codice nel normale contesto utente senza creare un processo separato.Esegui codice in un altro contesto utente
EDIT
Dai commenti che ho ottenuto fino a questo punto, ma pretende molto lavoro. Mi aspettavo di non farlo perché non capisco davvero come dovrei usarlo. Forse è meglio se apro una nuova domanda?
class Program
{
[DllImport("advapi32.DLL")]
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
[DllImport("advapi32.DLL")]
public static extern bool RevertToSelf();
static void Main(string[] args)
{
IntPtr phToken = IntPtr.Zero;
ImpersonateLoggedOnUser(phToken);
MapDrives();
RevertToSelf();
}
}
EDIT
Se l'utente corrente dispone dei privilegi di amministratore, allora il processo principale è elevata con il manifesto, nel codice, che è elevata voglio correre un comando negli utenti non elevati spazio poiché questo sembra avere diverse variabili d'ambiente, ecc. Credo che una volta avviato un thread non può cambiare da solo, è necessario eseguirne uno nuovo.
Il modo per ottenere il token di autenticazione dell'utente corrente è attraverso WindowsIdentity.GetCurrent(). Token. Tuttavia, penso che nel tuo caso restituirà il token dell'utente amministratore (dato che l'applicazione è in esecuzione come amministratore). –
Questa è la rappresentazione. Un [pacchetto nuget] molto utile (https://www.nuget.org/packages/SimpleImpersonation/2.0.0) e [il post correlato] (https://stackoverflow.com/a/7250145/465053) per raggiungere il stesso tramite 'LogonUser()' p/invoca la chiamata. – RBT