Sto utilizzando la 'Libreria dei tipi di controllo di Microsoft Terminal Services' per stabilire una connessione a un server desktop remoto. Sto cercando un modo per prevenire o sopprimere il prompt 'Sicurezza Windows' che viene visualizzato quando non si riesce a fornire una combinazione nome utente/password corretta quando ci si connette a un server desktop remoto che utilizza l'autenticazione a livello di rete (NLA). La finestra simile a questa:Previene la finestra di tentativo di accesso non riuscito dopo il mancato invio di credenziali appropriate a un server desktop remoto utilizzando l'autenticazione a livello di rete
Ho letto e provato ogni combinazione di impostazioni che posso trovare on-line in questo momento e nessuno di loro abbia avuto successo. Qui ci sono un paio di domande che ho trovato su stackoverlow che parlare di questo problema esatto e presumibilmente ottenere è risolto, ma le risposte non stanno lavorando per me:
AxMsRdpClient9 Dismiss login dialog
AxMsRdpClient6NotSafeForScripting AllowPromptingForCredentials
Può sembrare ridicolo, ma il mio obiettivo finale è solo quello di tentare la connessione a un server rdp e di inserire intenzionalmente un nome utente/password non valido e quindi disconnettersi quando fallisce. Non mi interessa davvero connettere o mostrare nulla. Se è importante, lo faccio nel tentativo di attivare un tentativo di accesso non riuscito nei registri eventi sul server remoto che verrà utilizzato da un'altra app in un secondo momento.
Il codice riportato di seguito genera già un tentativo di accesso non riuscito nei registri eventi ma non riesco a trovare un modo per interrompere questa casella di accesso non riuscita da far apparire sul computer client e preferirei non ricorrere agli hack che tentano di chiudere il finestra dopo che è aperta. Quando il server desktop remoto è configurato per consentire le connessioni da computer che eseguono qualsiasi versione di desktop remoto (opzione meno sicura), non ho lo stesso problema dato che il prompt popup fa ovviamente parte della sicurezza extra offerta da NLA.
Ho già provato così tante diverse combinazioni di impostazioni per questo controllo che la mia testa sta girando. Ecco un esempio che è modellato dopo una delle altre domande StackOverflow di cui sopra:
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
Presumibilmente è la linea ocx.PromptForCredentials = False
che dovrebbe impedire questo pop-up, ma non sembra fare la differenza se questo valore è impostato su True
o False
. Direi quasi per scontato che con il nome della proprietà ocx.PromptForCredsOnClient
potrebbe effettivamente funzionare, ma, ancora una volta, non fa differenza su ciò a cui imposto quel valore. Ho sempre lo stesso popup.
A questo punto non ho idea di quello che sto facendo male, ma il mio istinto mi dice che per ottenere questo lavoro ho bisogno di istanziare l'AxMsRdpClient6NotSafeForScripting
oggetto di base come qualcos'altro come AxMsRdpClient9NotSafeForScripting
o anche AxMsTscAxNotSafeForScripting
che è di tipo il default gli usi di controllo quando lo lascio su un modulo. Ho già provato un sacco di queste combinazioni di impostazioni e spero che qualcuno possa far luce sulla situazione.
Vorrei anche menzionare che sono aperto a metodi alternativi di connessione a un server desktop remoto utilizzando. Net che non implicano l'utilizzo di Microsoft Terminal Services Control Type Library
se ce ne sono. Non ho avuto molta fortuna a trovarli se esistono, ma per favore fammi sapere se ho perso qualcosa nella mia ricerca.
Edit: Per assicurarsi che il proprio server è installato lo stesso o simile al mio ci sono solo due requisiti che devono essere soddisfatti:
- Desktop remoto deve essere in esecuzione su una versione di Windows ovvero Vista o più recente
- Il desktop remoto deve essere impostato per utilizzare NLA. In Win7 il testo dell'opzione esatta è: 'Permetti connessioni solo da computer che eseguono Desktop remoto con Autenticazione a livello di rete (più sicuro)'
A quel punto non mi interessa quali opzioni si modificano nel codice finchè il server registra un accesso non riuscito quando si tenta di connettersi e la casella delle credenziali (o qualsiasi altro popup) non viene mai visualizzata sul lato client.
Sembra che il modo più semplice per aggiungere i riferimenti appropriati necessari a questo codice sia aggiungere il "controllo Servizi terminal Microsoft" dalla scheda COM alla casella degli strumenti e quindi rilasciare un "Controllo client RDP Microsoft" in un modulo. Maggiori informazioni qui: http://s.codeproject.com/Articles/43705/Remote-Desktop-using-C-NET
Ecco lo stesso codice in C# in caso che rende questa domanda più popolare:
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;
}
}
}
Non dovresti provare questa domanda su un altro sito StackExchange, che è più su seucrity? –
Ha fatto una ricerca rapida e non vedo molti altri esempi di questo tipo di codice su un altro sito stack. Almeno qui ci sono un certo numero di esempi ma la maggior parte non tocca il mio particolare problema. Sono aperto a suggerimenti su dove altrimenti postare questo però perché il mio progetto è in attesa fino a quando non posso risolvere questo. –
Forse ho sbagliato, ma potrebbe valere la pena provare su [Errore server] (http://serverfault.com/). Ora forse ci sarai fuori tema ma non sai mai come credo che la tua domanda si trovi tra SO e Server Fault ... –