Je réalise que sous Windows 7, il n'est pas possible de sauvegarder des informations d'identification différentes 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? Stockez-les 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 de l'aide.
Si vous souhaitez utiliser Powershell, vous pouvez ajouter les informations d'identification à l'aide de
cmdkey /generic:DOMAIN/"computername or IP" /user:"username" /pass:"password"
Appelez ensuite 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 = String.Format(@"/generic:TERMSRV/{0} /user:{1} /pass:{2}",
fp.ipAddress,
(String.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 = String.Format("/f /v {0}", fp.ipAddress); // ip or name of computer to connect
rdcProcess.Start();
@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
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'accès 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'accès au seul personnel nécessaire et à un accès 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 accès à une application spécifique de ce serveur.
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 string Host { get; }
public RDPCredentials(string Host, string UserName, string 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();
}
}
}