【发布时间】:2018-08-14 23:22:22
【问题描述】:
我正在尝试从 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# 中创建的凭据之间的区别:
Powershell:
目标:LegacyGeneric:target=TERMSRV/localhost
类型:通用
用户:用户名
C#:
目标:LegacyGeneric:target=TERMSRV/localhost True
类型:通用
用户:用户名真
这似乎是问题所在,虽然我还没有解决它。
【问题讨论】:
-
如果您将
mstsc命令添加为cmdkey 的更多参数会怎样?PowerShellInstance.AddParameter("; mstsc /v:localhost") -
@Theo 谢谢,但这样做根本不会导致任何活动:我认为是因为 System.Management.Automation 不再调用 mstsc。
标签: c# powershell remote-desktop mstsc system.management