web-dev-qa-db-fra.com

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

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? 

27
Krzysiek
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.

37
Krzysiek

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 ""

36
Sam Stephenson

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();
9
Spencer
@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
1
egl35720

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.

1
test

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