从C使用powershell启动MSTSC#
我正在尝试从C#启动MSTSC/RDP会话。出于各种原因,我决定调用Powershell来执行此操作,部分原因是我知道Powershell命令可以工作,尽管我并不反对尝试其他方法来启动会话。我已经启用了RDSH,并且很高兴能够在这台机器上启动多个RDP会话 在Powershell中运行以下命令将完全按照预期启动RDP会话:从C使用powershell启动MSTSC#,c#,powershell,remote-desktop,mstsc,system.management,C#,Powershell,Remote Desktop,Mstsc,System.management,我正在尝试从C#启动MSTSC/RDP会话。出于各种原因,我决定调用Powershell来执行此操作,部分原因是我知道Powershell命令可以工作,尽管我并不反对尝试其他方法来启动会话。我已经启用了RDSH,并且很高兴能够在这台机器上启动多个RDP会话 在Powershell中运行以下命令将完全按照预期启动RDP会话: cmdkey/generic:TERMSRV/localhost/user:username/pass:password;mstsc/v:localhost 尝试使用下面的代
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(用户名、密码)代码>
我也用硬编码的变量测试了它,得到了相同的结果。非常感谢任何建议
编辑:
检查了系统上缓存的凭据后,我可以看到此方法在所有参数的末尾追加了“True”。。。请参阅直接在Powershell中创建的凭据与在C#中创建的凭据之间的区别:
Powershell:
Target:LegacyGeneric:Target=TERMSRV/localhost
类型:通用
用户:用户名
C#:
Target:LegacyGeneric:Target=TERMSRV/localhost True
类型:通用
用户:用户名True
这似乎就是问题所在,尽管我还没有接近解决它。在进一步探讨这一点后,我已经确定了问题所在;把这个答案也留在这里,以防将来对其他人有所帮助
带有对象的参数以及参数(例如,/username user
,而不仅仅是/username
)需要以这种格式提供PowerShell.AddParameter(“用户:,“用户名”)
经修订的守则适用于:
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();
}
}
如果添加mstsc
命令作为cmdkey的更多参数,会怎么样PowerShellInstance.AddParameter(“;mstsc/v:localhost”)
@Theo谢谢,但这样做根本不会导致任何活动:我假设是因为System.Management.Automation不再调用mstsc。