Запустите mstsc.exe с указанным именем пользователя и паролем
Я понимаю, что в Windows 7 невозможно сохранить разные учетные данные для одного и того же хоста, но мне нужен обходной путь.
Могу ли я указать имя пользователя и пароль вручную в коде? Сохранить их в файле временного.rdp?
6 ответов
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, и мне не предлагается вводить пароль. Спасибо за помощь.
Если вы хотите использовать 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"
Не забудьте удалить ""
Это обновленная версия из сообщения Кшишека.
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();
Большинство ответов неверны, он по-прежнему запрашивает пароль, и это потому, что в одном экземпляре процесса выполняются разные процессы.
использование командной строки отлично работает:
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();
Пытаясь выяснить, как разрешить пользователям входить в нашу сеть, не давая им ключи от замка, я включил удаленный доступ к рабочему столу для нескольких членов моей команды. Размышляя больше об этом, я быстро вспомнил проект несколько лет назад, работая в Министерстве обороны. Этот проект потребовал от нас "заблокировать" доступ только к необходимому персоналу и ограниченный доступ к программам на серверах. Потратив некоторое время на базу знаний Microsoft, мы поняли, что можем создать "ярлыки" на рабочем столе для тех сотрудников, которые установили соединение RDP, вошли в систему и ограничили доступ к одному конкретному приложению на этом сервере.
@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
Принятый ответ решает проблему, но побочным эффектом является сохранение учетных данных в хранилище учетных данных пользователей. Я закончил создание IDisposable, чтобы я мог использовать учетные данные в операторе использования.
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();
}
}
}