Запустить mstsc.exe с указанным именем пользователя и паролем

Я понимаю, что в Windows 7 невозможно сохранить разные учетные данные для одного и того же хоста, но мне нужно некоторое обходное решение.

Могу ли я указать имя пользователя и пароль вручную в коде? Хранить их в файле temp.rdp?

Ответ 1

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();

Приведенный выше код инициирует соединение с .217, и мне не будет предложено указать пароль. Спасибо за помощь.

Ответ 2

Если вы хотите использовать powershell, вы можете добавить учетные данные, используя

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

Затем вызовите RDP-соединение, используя

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

Если вы хотите удалить учетные данные

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

Не забудьте удалить ""

Ответ 3

Это обновленная версия из сообщения 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();

Ответ 4

При попытке выяснить, как разрешить пользователям в нашей сети, не предоставляя им ключи к замку, я включил Remote Desktop Access для нескольких членов моей команды. Подумав об этом, я быстро вспомнил о проекте несколько лет назад, работая в Министерстве обороны. Этот проект потребовал от нас "заблокировать" доступ только к персоналу и ограниченному доступу к программам на серверах. Проведя некоторое время в Microsoft KnowledgeBase, мы поняли, что можем создавать "ярлыки" для рабочего стола для тех сотрудников, которые сделали RDP-соединение, зарегистрировали их и ограничили доступ к одному конкретному приложению на этом сервере.

Ответ 5

@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

Ответ 6

Принятый ответ решает проблему, но имеет побочный эффект оставления учетных данных в хранилище учетных данных пользователей. Я закончил создание IDisposable, поэтому я могу использовать учетные данные в инструкции 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 = [email protected]"/list",
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = false,
                RedirectStandardOutput = true
            }
        };
        cmdkey.Start();
        cmdkey.WaitForExit();
        if (!cmdkey.StandardOutput.ReadToEnd().Contains([email protected]"TERMSRV/{Host}"))
        {
            this.Host = Host;
            cmdkey = new Process
            {
                StartInfo =
            {
                FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
                Arguments = [email protected]"/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 = [email protected]"/delete:TERMSRV/{Host}",
                WindowStyle = ProcessWindowStyle.Hidden
            }
            };
            cmdkey.Start();
        }
    }
}

Ответ 7

большинство ответов неверны, все равно запрашивается пароль, и это потому, что разные процессы выполняются на одном и том же экземпляре процесса.

использование командной строки работает отлично:

        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();