【问题标题】:Starting MSTSC using powershell from C#从 C# 使用 powershell 启动 MSTSC
【发布时间】: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


【解决方案1】:

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

需要以PowerShell.AddParameter("user:","username")这种格式提供带有对象的参数以及参数(例如/username 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();
    }   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多