【问题标题】:Run mstsc.exe with specified username and password使用指定的用户名和密码运行 mstsc.exe
【发布时间】:2012-07-02 15:36:34
【问题描述】:

我意识到在 Windows 7 中,无法为同一主机保存不同的凭据,但我需要一些解决方法。

我可以在代码中手动提供用户名和密码吗?将它们存储在临时 .rdp 文件中?

【问题讨论】:

  • 基本上这个想法是执行 CMDKEY.EXE 在存储的凭据存储库中创建您的临时凭据,然后执行 MSTSC.EXE。 MSTSC 应该找到凭据并使用它们。您可以使用 Process.Start 在 C# 中执行这些程序;你不需要 Powershell。

标签: c# rdp


【解决方案1】:
Process rdcProcess = new Process();
rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe");
rdcProcess.StartInfo.Arguments = "/generic:TERMSRV/192.168.0.217 /user:" + "username" +  " /pass:" + "password";
rdcProcess.Start();

rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\mstsc.exe");
rdcProcess.StartInfo.Arguments = "/v " + "192.168.0.217"; // ip or name of computer to connect
rdcProcess.Start();

上面的代码启动了与 .217 的连接,并且没有提示我提供密码。 感谢您的帮助。

【讨论】:

  • 如果您不想将存储的凭据保存在存储库中,则可以在此代码之后再次调用cmdkey.exe,并使用参数/delete:TERMSRV/192.168.0.217
  • 我仍然被提示输入密码。我的机器正在使用 vista 业务
  • 我仍然被提示输入密码。我的机器使用的是 Windows 8。
  • 它提示我,直到我指定域 -- /user:MyDomain\MyUser
  • Process 类继承自实现 IDisposable 的 Component 类,因此您应该在启动流程实例后对其进行处置。
【解决方案2】:

如果您想使用 powershell,您可以使用添加凭据

cmdkey /generic:DOMAIN/"computername or IP" /user:"username" /pass:"password"

然后调用 RDP 连接使用

Start-Process -FilePath "$env:windir\system32\mstsc.exe" -ArgumentList "/v:computer name/IP" -Wait

如果你想删除凭据运行

cmdkey /delete:DOMAIN/"Computer name or IP"

记得去掉“”

【讨论】:

【解决方案3】:

这是 Krzysiek 帖子的更新版本。

var rdcProcess = new Process
    {
        StartInfo =
            {
                FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
                Arguments = String.Format(@"/generic:TERMSRV/{0} /user:{1} /pass:{2}", 
                            fp.ipAddress,
                            (String.IsNullOrEmpty(fp.accountDomain)) ? fp.accountUserName : fp.accountDomain + "\\" + fp.accountUserName,
                            fp.accountPassword),
                            WindowStyle = ProcessWindowStyle.Hidden                                
            }
    };
rdcProcess.Start();
rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\mstsc.exe");
rdcProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
rdcProcess.StartInfo.Arguments = String.Format("/f /v {0}", fp.ipAddress); // ip or name of computer to connect
rdcProcess.Start();

【讨论】:

  • 几乎成功了,但我仍然需要输入密码
  • @MarekBar 您的域可能有一个 GPO 禁止存储远程桌面连接的密码。
【解决方案4】:

在试图弄清楚如何允许用户进入我们的网络,而不给他们城堡的钥匙时,我为我的团队中的一些成员启用了远程桌面访问。想到这里,我很快想起了几年前在国防部工作时的一个项目。该项目要求我们“锁定”仅对必要人员的访问权限,并限制对服务器上程序的访问权限。在 Microsoft 的知识库上花费了一些时间后,我们意识到我们可以为那些建立 RDP 连接、登录并限制他们访问该服务器上特定应用程序的员工创建桌面“快捷方式”。

【讨论】:

  • 斯诺登是这样得到信息的吗 :) (J/K)
【解决方案5】:
@echo off

cmdkey /generic:TERMSRV/"*IP or Server Name*" /user:%username%

start mstsc /v:*IP or Server Name*

cmdkey /delete:TERMSRV/"*IP or Server Name*"

quit

【讨论】:

  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案6】:

接受的答案解决了问题,但具有将凭据留在用户凭据存储中的副作用。我最终创建了一个 IDisposable,因此我可以在 using 语句中使用凭据。

using (new RDPCredentials(Host, UserPrincipalName, Password))
{
    /*Do the RDP work here*/
}

internal class RDPCredentials : IDisposable
{
    private string Host { get; }

    public RDPCredentials(string Host, string UserName, string Password)
    {
        var cmdkey = new Process
        {
            StartInfo =
            {
                FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
                Arguments = $@"/list",
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = false,
                RedirectStandardOutput = true
            }
        };
        cmdkey.Start();
        cmdkey.WaitForExit();
        if (!cmdkey.StandardOutput.ReadToEnd().Contains($@"TERMSRV/{Host}"))
        {
            this.Host = Host;
            cmdkey = new Process
            {
                StartInfo =
            {
                FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
                Arguments = $@"/generic:TERMSRV/{Host} /user:{UserName} /pass:{Password}",
                WindowStyle = ProcessWindowStyle.Hidden
            }
            };
            cmdkey.Start();
        }
    }

    public void Dispose()
    {
        if (Host != null)
        {
            var cmdkey = new Process
            {
                StartInfo =
            {
                FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
                Arguments = $@"/delete:TERMSRV/{Host}",
                WindowStyle = ProcessWindowStyle.Hidden
            }
            };
            cmdkey.Start();
        }
    }
}

【讨论】:

    【解决方案7】:

    大多数答案都不正确,它仍然要求密码,这是因为在同一个流程实例上执行不同的流程。

    使用命令行完美运行:

            string command = "/c cmdkey.exe /generic:" + ip 
            + " /user:" + user + " /pass:" + password + " & mstsc.exe /v " + ip;
    
            ProcessStartInfo info = new ProcessStartInfo("cmd.exe", command);
            info.WindowStyle = ProcessWindowStyle.Hidden;
            info.CreateNoWindow = true;
    
            Process proc = new Process();
            proc.StartInfo = info;
            proc.Start();
    

    【讨论】:

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