Run mstsc.exe with specified username and password

前端 未结 7 1774
悲&欢浪女
悲&欢浪女 2020-12-04 16:06

I realize that in Windows 7, it is not possible to save different credentials for the same host, but I need some workaround.

Can I provide the username and password

相关标签:
7条回答
  • 2020-12-04 16:09
    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();
    

    The above code initiates a connection with .217 and I am not being prompted to provide a password. Thanks for help.

    0 讨论(0)
  • 2020-12-04 16:21

    The accepted answer solves the problem, but has the side effect of leaving the credentials in the users credential store. I wound up creating an IDisposable so I can use the credentials in a using statement.

    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 讨论(0)
  • 2020-12-04 16:21

    most of the answers are incorrect, it still request password and this because execute different processes on the same process instance.

    using command line works perfectly:

            string command = "/c cmdkey.exe /generic:" + ip 
            + " /user:" + user + " /pass:" + password + " & mstsc.exe /v " + ip;
    
            ProcessStartInfo info = new ProcessStartInfo("cmd.exe", command);
            info.WindowStyle = ProcessWindowStyle.Hidden;
            info.CreateNoWindow = true;
    
            Process proc = new Process();
            proc.StartInfo = info;
            proc.Start();
    
    0 讨论(0)
  • 2020-12-04 16:22

    While trying to figure out how to allow users into our network, without giving them the keys to the castle, I enabled Remote Desktop Access for a few members of my team. Thinking more about this, I quickly remembered a project several years ago while working for the Department of Defense. That project required us to "lock down" access to only necessary personnel and limited access to the programs on the servers. After spending some time on Microsoft's KnowledgeBase, we realized that we could create desktop "shortcuts" for those employees that made the RDP connection, logged them in and limited their access to one specific application on that server.

    0 讨论(0)
  • 2020-12-04 16:23

    This is an updated version from Krzysiek's post.

    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();
    
    0 讨论(0)
  • 2020-12-04 16:30

    If you want to use powershell you could add the credentials using

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

    Then call RDP connection using

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

    If you want to delete the credentials run

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

    Remember to remove ""

    0 讨论(0)
提交回复
热议问题