从C使用powershell启动MSTSC#

从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 尝试使用下面的代

我正在尝试从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(用户名、密码)

我也用硬编码的变量测试了它,得到了相同的结果。非常感谢任何建议

编辑: 检查了系统上缓存的凭据后,我可以看到此方法在所有参数的末尾追加了“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。