D'exécuter du code dans un autre contexte

J'ai une application avec un manifeste qui doit être exécuté en tant qu'administrateur, mais une partie de l'application est de mapper un lecteur à l'aide de WNetAddConnection2 qui, je crois, nécessite, pour être exécuté dans le contexte utilisateur normal en raison d'informations d'identification etc. Est-il un moyen pour exécuter ce morceau de code dans le contexte utilisateur normal, sans la création d'un processus distinct.

MODIFIER

D'après les commentaires que j'ai reçu à ce jour, mais il ne marche pas. Je m'attendais pas à tant que je n'ai pas vraiment comprendre comment je dois l'utiliser. Peut-être mieux si j'ouvre une nouvelle question?

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();
    }
}

MODIFIER

Si l'utilisateur a des privilèges d'administrateur, puis le processus principal est élevée avec le manifeste, dans le code qui est élevée je veux exécuter une commande dans les utilisateurs non-élévation de l'espace, comme cela semble avoir différentes variables d'environnement etc. Je crois que une fois qu'un thread est démarré qu'il ne peut pas le changement lui-même, il doit en lancer une nouvelle.

La façon d'obtenir de l'utilisateur actuel jeton d'authentification est par le biais de WindowsIdentity.GetCurrent().Jeton. Cependant, je pense que dans votre cas, il sera de retour le jeton de l'utilisateur administrateur (en tant que votre demande est en cours d'exécution en tant qu'administrateur).
C'est une usurpation d'identité. Très pratique package nuget et la poste pour obtenir le même à travers LogonUser() appel de p/invoke.

OriginalL'auteur Charles Gargent | 2010-06-04