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.
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
Vous devez vous connecter pour publier un commentaire.
prendre un coup d'oeil sur Une petite Classe C# pour usurper l'identité d'un Utilisateur projet de code de l'article. Il met en œuvre une IDisposable classe (qui libère le jeton d'authentification après son utilisation). Je l'ai vu .NET code qui fuit à cause de ne pas relâcher l'usurpation de l'identité des jetons.
Vous pouvez emprunter l'identité d'un utilisateur que pour un bloc de code qui va accéder à la ressource réseau, vous devez accéder à un autre compte d'utilisateur. Votre code ressemblera à
J'espère que cela aide.
OriginalL'auteur CARLOS LOTH
Vous devez d'abord obtenir le jeton d'utilisateur que vous souhaitez démarrer l'application, vous pouvez le faire à l'aide de WTSQueryUserToken. Si l'utilisateur n'est pas encore connecté, vous pouvez utiliser LogonUser API Win32 pour obtenir un nouveau dans une nouvelle session. Pour obtenir toutes les séances sur votre ordinateur, vous pouvez utiliser WTSEnumerateSessions.
Puis une fois que vous avez le jeton que vous pouvez utiliser CreateProcessAsUser ou d'autre ImpersonateLoggedOnUser Api Win32.
Assurez-vous d'appeler
CloseHandle
sur les poignées de vous obtenir, ils sont particulièrement mauvais fuites pour ce type de travail.Idem ils sont particulièrement mauvais fuites de trop. J'ai ajouté un commentaire à ce sujet.
Arent les deux CreateProcessAsUser et ImpersonateLoggedOnUser utilisé pour créer un nouveau thread avec les informations d'identification différentes? Comment puis-je obtenir WNetAddConnections2 à exécuter dans ce nouveau processus?
CreateProcessAsUser crée un nouveau processus que l'utilisateur spécifié. ImpersonateLoggedOnUser exécute le code dans le même processus et thread. WNetAddConnections2 est pour quelque chose de totalement différent, authentifier avec un réseau local de la machine ou d'autres ressources.
Donc, ce que je veux, c'est mon WNetAddConnections2 fonction à appeler à l'aide ImpersonateLoggedOnUser ?
OriginalL'auteur Brian R. Bondy
Je ne suis pas sûr que c'est une façon de le faire sans la création d'un nouveau processus, ImpersonateLoggedOnUser ne fonctionnent qu'à partir d'un service, et je ne veux pas fournir d'informations d'identification.
corrigez-moi si je me trompe
Si l'utilisateur a des privilèges d'administrateur, puis le processus principal est élevée avec le manifeste, dans ce 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 lancer une nouvelle
C'est de cette façon vous n'en proc 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