0

我正在尝试从 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

这似乎是问题所在,尽管我还没有接近解决它。

4

1 回答 1

0

经过进一步探索,我发现了这个问题;将此答案也留在这里,以防将来对其他人有所帮助。

需要以这种格式提供带有对象的参数以及参数(例如/username user,与 just 相对)/usernamePowerShell.AddParameter("user:","username")

此修改后的代码有效:

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();
    }   
}
于 2018-08-14T15:22:22.937 回答