我正在尝试从 C# 启动 MSTSC / RDP 会话。由于各种原因,我决定调用 Powershell 来执行此操作,部分原因是我知道 powershell 命令有效,尽管我不反对尝试其他方法来启动会话。我启用了 RDSH,并且很高兴能够在这台机器上启动多个 RDP 会话。
在 Powershell 中运行以下命令会完全按照我的预期启动 RDP 会话:
cmdkey /generic:TERMSRV/localhost /user:username /pass:password; mstsc /v:localhost
尝试使用下面的代码和 System.Management.Automation.dll 将其转换为 C# 但是失败并出现错误:
指定的连接文件无效 (True)
请注意,这是远程桌面连接错误,而不是 powershell 或 C# 错误。
我正在使用的代码是:
void StartRDP(string username, string password)
{
using (PowerShell PowerShellInstance = PowerShell.Create())
{
// create cached credential to use for remote session
PowerShellInstance.AddCommand("cmdkey");
PowerShellInstance.AddParameter("/generic:TERMSRV/localhost");
PowerShellInstance.AddParameter("/user:" + username);
PowerShellInstance.AddParameter("/pass:" + password);
// append mstsc command
PowerShellInstance.AddStatement();
// start remote desktop connection to localhost
PowerShellInstance.AddCommand("mstsc");
PowerShellInstance.AddParameter("/v:localhost");
// invoke command, creating credential and starting mstsc
PowerShellInstance.Invoke();
}
}
这被称为使用:
StartRDP(username, password);
我还使用具有相同结果的硬编码变量对其进行了测试。非常感谢任何建议!
编辑: 检查了系统上缓存的凭据后,我可以看到此方法将“True”附加到所有参数的末尾...查看直接在 Powershell 中创建的凭据与在 C# 中创建的凭据之间的区别:
电源外壳:
目标:LegacyGeneric:target=TERMSRV/localhost
类型:通用
用户:用户名
C#:
目标:LegacyGeneric:target=TERMSRV/localhost True
类型:通用
用户:用户名 True
这似乎是问题所在,尽管我还没有接近解决它。