web-dev-qa-db-ja.com

指定したユーザー名とパスワードでmstsc.exeを実行します

Windows 7では、同じホストに対して異なる資格情報を保存することはできませんが、いくつかの回避策が必要であることを認識しています。

コードでユーザー名とパスワードを手動で提供できますか?それらをtemp .rdpファイルに保存しますか?

27
Krzysiek
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との接続を開始し、パスワードの入力を求められません。手伝ってくれてありがとう。

38
Krzysiek

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"

「」を削除することを忘れないでください

36
Sam Stephenson

これは、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();
9
Spencer
@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
1
egl35720

受け入れられた答えは問題を解決しますが、ユーザーの資格情報ストアに資格情報を残すという副作用があります。 usingステートメントで資格情報を使用できるように、IDisposableを作成しました。

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();
        }
    }
}
1
Sidney

ユーザーに城への鍵を与えずに、ネットワークへのユーザーのアクセスを許可する方法を見つけようとして、チームの数人のメンバーに対してリモートデスクトップアクセスを有効にしました。これについてもっと考えてみると、数年前に国防総省で働いていたプロジェクトをすぐに思い出しました。このプロジェクトでは、必要な担当者のみへのアクセスを「ロックダウン」し、サーバー上のプログラムへのアクセスを制限する必要がありました。 MicrosoftのKnowledgeBaseにしばらく時間を費やした後、RDP接続を確立し、ログインして、そのサーバー上の特定のアプリケーションへのアクセスを制限した従業員のデスクトップ「ショートカット」を作成できることに気付きました。

1
test