7

「Microsoft Terminal Services Control Type Library」を使用して、リモート デスクトップ サーバーへの接続を確立しています。ネットワーク レベル認証 (NLA) を使用するリモート デスクトップ サーバーに接続するときに、適切なユーザー名とパスワードの組み合わせを提供できない場合に表示される「Windows セキュリティ」プロンプトを防止または抑制する方法を探しています。ウィンドウは次のようになります。

ここに画像の説明を入力

現時点でオンラインで見つけることができるすべての設定の組み合わせについて読んで試しましたが、どれも成功していません。これは私がstackoverlowで見つけたいくつかの質問で、この正確な問題について話し、おそらく解決されたと思われますが、答えは私にとってはうまくいきません:

AxMsRdpClient9 ログイン ダイアログを閉じる

AxMsRdpClient6NotSafeForScripting AllowPromptingForCredentials

ばかげているように聞こえるかもしれませんが、私の最終的な目標は、rdp サーバーへの接続を試み、意図的に無効なユーザー名/パスワードを入力し、失敗したときに切断することです。実際に何かを接続したり表示したりすることは気にしません。問題がある場合は、別のアプリが後で使用するリモート サーバーのイベント ログで失敗したログオン試行をトリガーするためにこれを行っています。

以下のコードは、すでにイベント ログでログオン試行の失敗をトリガーしていますが、この失敗したログオン ボックスがクライアント マシンに表示されるのを止める方法が見つかりません。開いた。リモート デスクトップ サーバーが任意のバージョンのリモート デスクトップを実行しているコンピューターからの接続を許可するように構成されている場合 (安全性の低いオプション)、ポップアップ プロンプトは明らかに NLA が提供する追加のセキュリティの一部であるため、同じ問題は発生しません。

このコントロールのさまざまな設定の組み合わせをすでに試したので、頭が回転します。上記の他のスタックオーバーフローの質問の1つをモデルにした1つの例を次に示します。

Public Class Form1
    Dim WithEvents oRemote As AxMSTSCLib.AxMsRdpClient6NotSafeForScripting

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        oRemote = New AxMSTSCLib.AxMsRdpClient6NotSafeForScripting
        CType(oRemote, System.ComponentModel.ISupportInitialize).BeginInit()
        oRemote.Dock = System.Windows.Forms.DockStyle.Fill
        oRemote.Enabled = True
        oRemote.Name = "OfficeWin7"
        Me.Controls.Add(oRemote)
        CType(oRemote, System.ComponentModel.ISupportInitialize).EndInit()
        oRemote.CreateControl()
        oRemote.Size = New System.Drawing.Size(800, 600)

        oRemote.Server = "IPADDRESS"
        oRemote.UserName = "TestAccount"
        oRemote.AdvancedSettings7.ClearTextPassword = "WrongPassword"

        Dim ocx As MSTSCLib.IMsRdpClientNonScriptable4 = oRemote.GetOcx()

        ocx.EnableCredSspSupport = True
        ocx.AllowCredentialSaving = False
        ocx.PromptForCredentials = False
        ocx.PromptForCredsOnClient = False

        oRemote.Connect()
    End Sub

    Private Sub oRemote_OnAuthenticationWarningDismissed(sender As Object, e As EventArgs) Handles oRemote.OnAuthenticationWarningDismissed
        MessageBox.Show("The credentials popup is now closing")
    End Sub

    Private Sub oRemote_OnAuthenticationWarningDisplayed(sender As Object, e As EventArgs) Handles oRemote.OnAuthenticationWarningDisplayed
        MessageBox.Show("The credentials popup is about to be shown")
    End Sub
End Class

おそらく、このポップアップを防ぐべき行ですが、その値がまたはocx.PromptForCredentials = Falseに設定されている場合、違いはないようです。実際に機能する可能性のあるプロパティ名からほぼ推測できますが、繰り返しますが、その値を何に設定しても違いはありません。いつも同じポップアップが表示されます。TrueFalseocx.PromptForCredsOnClient

この時点で、何が間違っているのかわかりませんが、これを機能させるには、ベースAxMsRdpClient6NotSafeForScriptingオブジェクトを別のものとしてインスタンス化する必要があるか、フォームにドロップしたときにコントロールが使用するデフォルトのタイプでAxMsRdpClient9NotSafeForScriptingさえあると直感的にわかりますAxMsTscAxNotSafeForScripting. しかし、私はすでにこれらの設定の組み合わせをたくさん試しましたが、誰かが状況に光を当てることができることを望んでいます.

また、.Net を使用してリモート デスクトップ サーバーに接続する別の方法がMicrosoft Terminal Services Control Type Libraryあれば、それを使用する必要がないことにも言及する必要があります。それらが存在する場合、それらを見つけるのはあまり運がありませんでしたが、検索で何かを見逃した場合はお知らせください.

編集:自分のサーバーが私のサーバーと同じか似たように設定されていることを確認するには、満たす必要がある要件が 2 つだけあります。

  1. リモート デスクトップは、Vista 以降のバージョンの Windows で実行する必要があります
  2. NLA を使用するには、リモート デスクトップを設定する必要があります。Win7 では、正確なオプション テキストは次のとおりです。

その時点で、接続しようとしたときにサーバーがログインの失敗をログに記録し、資格情報ボックス (またはその他のポップアップ) がクライアント側に表示されない限り、コードでどのオプションを変更してもかまいません。

このコードが必要とする適切な参照を追加する最も簡単な方法は、COM タブから「Microsoft ターミナル サービス コントロール」をツールボックスに追加し、「Microsoft RDP クライアント コントロール」をフォームにドロップすることです。詳細はこちら: http://s.codeproject.com/Articles/43705/Remote-Desktop-using-C-NET

この質問をより一般的にする場合に備えて、C#の同じコードを次に示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private AxMSTSCLib.AxMsRdpClient6NotSafeForScripting withEventsField_oRemote;
        public AxMSTSCLib.AxMsRdpClient6NotSafeForScripting oRemote {
            get { return withEventsField_oRemote; }
            set {
                if (withEventsField_oRemote != null) {
                    withEventsField_oRemote.OnAuthenticationWarningDismissed -= oRemote_OnAuthenticationWarningDismissed;
                    withEventsField_oRemote.OnAuthenticationWarningDisplayed -= oRemote_OnAuthenticationWarningDisplayed;
                }
                withEventsField_oRemote = value;
                if (withEventsField_oRemote != null) {
                    withEventsField_oRemote.OnAuthenticationWarningDismissed += oRemote_OnAuthenticationWarningDismissed;
                    withEventsField_oRemote.OnAuthenticationWarningDisplayed += oRemote_OnAuthenticationWarningDisplayed;
                }
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            oRemote = new AxMSTSCLib.AxMsRdpClient6NotSafeForScripting();
            ((System.ComponentModel.ISupportInitialize)oRemote).BeginInit();
            oRemote.Dock = System.Windows.Forms.DockStyle.Fill;
            oRemote.Enabled = true;
            oRemote.Name = "OfficeWin7";
            this.Controls.Add(oRemote);
            ((System.ComponentModel.ISupportInitialize)oRemote).EndInit();
            oRemote.CreateControl();
            oRemote.Size = new System.Drawing.Size(800, 600);

            oRemote.Server = "IPADDRESS";
            oRemote.UserName = "TestAccount";
            oRemote.AdvancedSettings7.ClearTextPassword = "WrongPassword";

            MSTSCLib.IMsRdpClientNonScriptable4 ocx = (MSTSCLib.IMsRdpClientNonScriptable4)oRemote.GetOcx();

            ocx.EnableCredSspSupport = true;
            ocx.AllowCredentialSaving = false;
            ocx.PromptForCredentials = false;
            ocx.PromptForCredsOnClient = false;

            oRemote.Connect();
        }

        private void oRemote_OnAuthenticationWarningDismissed(object sender, EventArgs e)
        {
            MessageBox.Show("The credentials popup is now closing");
        }

        private void oRemote_OnAuthenticationWarningDisplayed(object sender, EventArgs e)
        {
            MessageBox.Show("The credentials popup is about to be shown");
        }
        public Form1()
        {
            Load += Form1_Load;
        }
    }
}
4

1 に答える 1

1

まず、テスト環境で RDP の最新の更新プログラムが使用されていることを確認する必要があります。特に Windows 7 の場合は、Windows Update を実行するだけです。

次に、次の行に注目してください。

    ocx.EnableCredSspSupport = True

セキュリティ サポートプロバイダを有効にしています。私はこの問題の専門家ではありませんが、おそらく次のような内部ルーチンがあります。

Load locally stored credentials; if there aren't such - ask the user then crypt, hash, bla-bla, and store them locally, in order to use them next time

この時点で、資格情報を求めるダイアログが表示されます。この動作に影響を与えることはできないと思いますが、幸いなことに、プロバイダーが画像に表示されるかどうかに影響を与えることができます。これを に設定してFalse、何が起こるか見てみましょう。

于 2016-06-14T15:38:54.747 に答える