我意识到在Windows 7中,无法为同一主机保存不同的凭据,但我需要一些解决方法。
我可以在代码中手动提供用户名和密码吗?将它们存储在临时.rdp文件中?
答案 0 :(得分:37)
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的连接,并且未提示我提供密码。 谢谢你的帮助。
答案 1 :(得分:36)
如果您想使用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"
请记得删除""
答案 2 :(得分:9)
这是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();
答案 3 :(得分:1)
在尝试弄清楚如何允许用户进入我们的网络时,在没有给他们城堡的钥匙的情况下,我为我的团队的一些成员启用了远程桌面访问。考虑到这一点,我几年前在为国防部工作时很快就想起了一个项目。该项目要求我们“锁定”仅访问必要人员和限制访问服务器上的程序。在Microsoft的KnowledgeBase上花了一些时间之后,我们意识到我们可以为那些建立RDP连接的员工创建桌面“快捷方式”,登录并限制他们访问该服务器上的一个特定应用程序。
答案 4 :(得分:1)
@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
答案 5 :(得分:0)
已接受的答案可以解决问题,但会产生将凭据留在用户凭据存储中的副作用。我最终创建了一个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 = $@"/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();
}
}
}
答案 6 :(得分:0)
大多数答案不正确,它仍然要求输入密码,这是因为在同一个流程实例上执行不同的流程。
使用命令行非常有效:
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();