2016-06-07 54 views
6

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

enter image description here

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:

  1. Desktop remoto deve essere in esecuzione su una versione di Windows ovvero Vista o più recente
  2. 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; 
     } 
    } 
} 
+0

Non dovresti provare questa domanda su un altro sito StackExchange, che è più su seucrity? –

+0

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. –

+0

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 ... –

risposta

1

Prima di tutto, si ha realmente bisogno per assicurarsi che l'ambiente di prova utilizza l'ultimo aggiornamento per RDP , soprattutto se si tratta di Windows 7, è sufficiente eseguire Windows Update.

Avanti, concentrarsi su questa linea:

ocx.EnableCredSspSupport = True 

Si sta permettendo un supporto di sicurezzafornitore. Io non sono un esperto in materia, ma probabilmente c'è un detto di routine interna:

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

A questo punto la finestra di dialogo, che chiede le credenziali è spuntato. Non penso che tu possa influenzare questo comportamento, ma, per fortuna, puoi influenzare il fatto che il provider si svolga nella foto o meno. Quindi imposta questo a False e guarda cosa succede.

+0

Windows e altri prodotti Microsoft sono stati completamente aggiornati.'EnableCredSspSupport = true' è la linea che abilita il supporto NLA. Senza questo non è possibile connettersi a istanze desktop remote 'più recenti' che eseguono NLA - si rifiuta semplicemente di connettersi. Se esiste un altro modo per abilitare il supporto NLA sul client senza utilizzare questa linea, allora sono tutto orecchie. –

+0

@JoeyJoeJoeJrShabadoo: Infatti. Ma hai detto che puoi influenzare le impostazioni del server, giusto? Puoi fare un tentativo, solo per isolare il problema ... Disabilitare NLA sul lato server. –

+0

Per favore, leggi tutta la mia domanda. Ho già detto che il codice funziona alla grande quando disattivo NLA sul server. Il mio problema è che voglio supportare entrambi i tipi di connessioni desktop remote e sto cercando di far funzionare il lato NLA ora. Innesca già l'accesso non riuscito come voglio ma il problema è che questo codice è destinato ad essere eseguito senza sorveglianza e il popup delle credenziali mi sta facendo casino. –