Exécutez mstsc.exe avec le nom d’utilisateur et le mot de passe spécifiés

Je me rends compte que dans Windows 7, il n’est pas possible de sauvegarder différentes informations d’identification pour le même hôte, mais j’ai besoin d’une solution de contournement.

Puis-je fournir le nom d’utilisateur et le mot de passe manuellement dans le code? Les stocker dans un fichier .rdp temporaire?

 Process rdcProcess = new Process(); rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"); rdcProcess.StartInfo.Arguments = "/generic:TERMSRV/192.168.0.217 /user:" + "username" + " /pass:" + "password"; rdcProcess.Start(); rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\mstsc.exe"); rdcProcess.StartInfo.Arguments = "/v " + "192.168.0.217"; // ip or name of computer to connect rdcProcess.Start(); 

Le code ci-dessus établit une connexion avec .217 et je ne suis pas invité à fournir un mot de passe. Merci pour l’aide.

Si vous souhaitez utiliser Powershell, vous pouvez append les informations d’identification à l’aide de

 cmdkey /generic:DOMAIN/"computername or IP" /user:"username" /pass:"password" 

Puis appelez la connexion RDP en utilisant

 Start-Process -FilePath "$env:windir\system32\mstsc.exe" -ArgumentList "/v:computer name/IP" -Wait 

Si vous souhaitez supprimer les informations d’identification, exécutez

 cmdkey /delete:DOMAIN/"Computer name or IP" 

N’oubliez pas de supprimer “”

Ceci est une version mise à jour du message de Krzysiek.

 var rdcProcess = new Process { StartInfo = { FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"), Arguments = Ssortingng.Format(@"/generic:TERMSRV/{0} /user:{1} /pass:{2}", fp.ipAddress, (Ssortingng.IsNullOrEmpty(fp.accountDomain)) ? fp.accountUserName : fp.accountDomain + "\\" + fp.accountUserName, fp.accountPassword), WindowStyle = ProcessWindowStyle.Hidden } }; rdcProcess.Start(); rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\mstsc.exe"); rdcProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal; rdcProcess.StartInfo.Arguments = Ssortingng.Format("/f /v {0}", fp.ipAddress); // ip or name of computer to connect rdcProcess.Start(); 

En essayant de comprendre comment autoriser les utilisateurs à accéder à notre réseau, sans leur donner les clés du château, j’ai activé l’access au bureau à distance pour quelques membres de mon équipe. En réfléchissant davantage à cela, je me suis rapidement rappelé un projet il y a plusieurs années alors que je travaillais pour le ministère de la Défense. Ce projet nous a obligés à “verrouiller” l’access au seul personnel nécessaire et à un access limité aux programmes sur les serveurs. Après avoir passé un peu de temps sur la base de connaissances de Microsoft, nous avons compris que nous pouvions créer des “raccourcis” pour les employés qui établissaient la connexion RDP, les connectaient et limitaient leur access à une application spécifique de ce serveur.

 @echo off cmdkey /generic:TERMSRV/"*IP or Server Name*" /user:%username% start mstsc /v:*IP or Server Name* cmdkey /delete:TERMSRV/"*IP or Server Name*" quit 

La réponse acceptée résout le problème, mais a pour effet secondaire de laisser les informations d’identification dans le magasin d’informations d’identification des utilisateurs. J’ai fini par créer un IDisposable afin que je puisse utiliser les informations d’identification dans une instruction using.

 using (new RDPCredentials(Host, UserPrincipalName, Password)) { /*Do the RDP work here*/ } 

 internal class RDPCredentials : IDisposable { private ssortingng Host { get; } public RDPCredentials(ssortingng Host, ssortingng UserName, ssortingng Password) { var cmdkey = new Process { StartInfo = { FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"), Arguments = $@"/list", WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, RedirectStandardOutput = true } }; cmdkey.Start(); cmdkey.WaitForExit(); if (!cmdkey.StandardOutput.ReadToEnd().Contains($@"TERMSRV/{Host}")) { this.Host = Host; cmdkey = new Process { StartInfo = { FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"), Arguments = $@"/generic:TERMSRV/{Host} /user:{UserName} /pass:{Password}", WindowStyle = ProcessWindowStyle.Hidden } }; cmdkey.Start(); } } public void Dispose() { if (Host != null) { var cmdkey = new Process { StartInfo = { FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"), Arguments = $@"/delete:TERMSRV/{Host}", WindowStyle = ProcessWindowStyle.Hidden } }; cmdkey.Start(); } } }