「Microsoft Terminal Services Control Type Library」を使用して、リモート デスクトップ サーバーへの接続を確立しています。ネットワーク レベル認証 (NLA) を使用するリモート デスクトップ サーバーに接続するときに、適切なユーザー名とパスワードの組み合わせを提供できない場合に表示される「Windows セキュリティ」プロンプトを防止または抑制する方法を探しています。ウィンドウは次のようになります。
現時点でオンラインで見つけることができるすべての設定の組み合わせについて読んで試しましたが、どれも成功していません。これは私がstackoverlowで見つけたいくつかの質問で、この正確な問題について話し、おそらく解決されたと思われますが、答えは私にとってはうまくいきません:
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
に設定されている場合、違いはないようです。実際に機能する可能性のあるプロパティ名からほぼ推測できますが、繰り返しますが、その値を何に設定しても違いはありません。いつも同じポップアップが表示されます。True
False
ocx.PromptForCredsOnClient
この時点で、何が間違っているのかわかりませんが、これを機能させるには、ベースAxMsRdpClient6NotSafeForScripting
オブジェクトを別のものとしてインスタンス化する必要があるか、フォームにドロップしたときにコントロールが使用するデフォルトのタイプでAxMsRdpClient9NotSafeForScripting
さえあると直感的にわかりますAxMsTscAxNotSafeForScripting
. しかし、私はすでにこれらの設定の組み合わせをたくさん試しましたが、誰かが状況に光を当てることができることを望んでいます.
また、.Net を使用してリモート デスクトップ サーバーに接続する別の方法がMicrosoft Terminal Services Control Type Library
あれば、それを使用する必要がないことにも言及する必要があります。それらが存在する場合、それらを見つけるのはあまり運がありませんでしたが、検索で何かを見逃した場合はお知らせください.
編集:自分のサーバーが私のサーバーと同じか似たように設定されていることを確認するには、満たす必要がある要件が 2 つだけあります。
- リモート デスクトップは、Vista 以降のバージョンの Windows で実行する必要があります
- 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;
}
}
}