C# 使用指定的用户名和密码运行mstsc.exe

C# 使用指定的用户名和密码运行mstsc.exe,c#,rdp,C#,Rdp,我意识到在Windows7中,不可能为同一主机保存不同的凭据,但我需要一些解决方法 我可以在代码中手动提供用户名和密码吗?是否将它们存储在temp.rdp文件中 Process rdcProcess = new Process(); rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"); rdcProcess.StartInfo.Arg

我意识到在Windows7中,不可能为同一主机保存不同的凭据,但我需要一些解决方法

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

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的连接,并且没有提示我提供密码。
感谢您的帮助。

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

如果要使用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"

记住删除“”

这是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();

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

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


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

使用命令行非常有效:

        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();

基本上是执行CMDKEY.EXE在存储的凭据存储库中创建临时凭据,然后执行MSTSC.EXE。MSTSC应该找到凭据并使用它们。您可以在C#中使用
Process.Start执行这些程序;您不需要Powershell。如果您不想将存储的凭据保留在存储库中,在执行此代码后,您可以再次调用带有参数的
/delete:TERMSRV/192.168.0.217
我仍然被提示输入密码。我的机器正在使用vista BusinessScope,但仍有人提示我输入密码。我的计算机正在使用Windows 8。它会提示我指定域--/user:MyDomain\MyUserworks。一旦mstsc完全登录到另一个系统,如果能有一个方法来确定它几乎可以正常工作,那将是非常酷的,但我仍然需要进入password@MarekBar您的域可能有一个GPO,禁止存储远程桌面连接的密码。我喜欢这个!我让它在Windows Server 2008 R2上运行。有关如何禁用证书警告的信息,请参阅。这就是Snowden获取信息的方式:)(J/K)虽然此代码片段可能是解决方案,但确实有助于提高您的帖子质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
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();
        }
    }
}
        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();