Проблема клиента WinForms ActiveX RDP с NLA

1

Я пытаюсь сделать клиентом WinForms RDP на С# с помощью элемента управления RDP ActiveX в качестве учебного упражнения. Я могу заставить все работать, когда целевой сервер не использует аутентификацию уровня сети (NLA), но когда я пытаюсь настроить этот элемент управления на использование "EnableCredSspSupport", который, как мне кажется, необходим для NLA, я получаю следующую ошибку при запуске код:

Необработанное исключение типа "System.Windows.Forms.AxHost.InvalidActiveXStateException" произошло в AxInterop.MSTSCLib.dll

Код:

        AxMsRdpClient9NotSafeForScripting rdp;

        rdp = new AxMsRdpClient9NotSafeForScripting();

        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));

        ((System.ComponentModel.ISupportInitialize)(rdp)).BeginInit();
        rdp.Dock = System.Windows.Forms.DockStyle.Fill;
        rdp.Enabled = true;
        rdp.Location = new System.Drawing.Point(0, 0);
        rdp.Name = "rdp";
        rdp.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
        rdp.Size = new System.Drawing.Size(828, 687);
        rdp.TabIndex = 0;

        rdp.AdvancedSettings9.AuthenticationLevel = 2;
        rdp.AdvancedSettings9.EnableCredSspSupport = true;

        MainsplitContainer.Panel2.Controls.Add(rdp);

        ((System.ComponentModel.ISupportInitialize)(rdp)).EndInit();

        rdp.Server = "XXX.XXX.XXX.XXX";
        rdp.Connect();

Многие из этого кода искажены из следующих источников, но обучение коду обычно стоит на плечах гигантов, верно !?

http://msdn.microsoft.com/en-us/library/aa383022(VS.85).aspx https://searchcode.com/codesearch/view/3716390/

... И еще несколько источников, на которые у меня нет репутации (первый пост!)

Какие-нибудь идеи, чтобы помочь мне на моем пути?

Благодарю!

.... Aaaand рабочий код:

            AxMSTSCLib.AxMsRdpClient8NotSafeForScripting _RDPClient;
        _RDPClient = new AxMSTSCLib.AxMsRdpClient8NotSafeForScripting();

        MainsplitContainer.Panel2.Controls.Add(_RDPClient);

        ((System.ComponentModel.ISupportInitialize)(_RDPClient)).BeginInit();
        _RDPClient.Dock = System.Windows.Forms.DockStyle.Fill;
        _RDPClient.Enabled = true;
        _RDPClient.Location = new System.Drawing.Point(0, 0);
        _RDPClient.Name = "axMsTscAxNotSafeForScripting1";
        _RDPClient.OcxState = ((System.Windows.Forms.AxHost.State)(_RDPClient.OcxState));
        _RDPClient.Size = new System.Drawing.Size(579, 608);
        _RDPClient.TabIndex = 0;
        _RDPClient.AdvancedSettings8.EnableCredSspSupport = true;
        ((System.ComponentModel.ISupportInitialize)(_RDPClient)).EndInit();

        _RDPClient.OnDisconnected += new IMsTscAxEvents_OnDisconnectedEventHandler(axMsTscAx_OnDisconnected);


        _RDPClient.Server = IP;
        _RDPClient.Connect();
  • 0
    Раннее задание свойств AxHost - это хорошо, но вы не можете трогать свойства компонента RDP, пока он не будет создан. Это происходит в типичной ленивой манере .NET, в самый последний момент. Переместите назначения в обработчик события Load формы.
  • 0
    Спасибо за ответ Soner! Я новичок в C #, поэтому не совсем уверен, что понимаю различия между свойствами AxHost и свойствами компонента RDP. Для теста я переместил все вышеперечисленное в обработчик событий Form1_Load. Я больше не получаю ошибки, но я также не получаю компонент RDP, загруженный в панель.
Показать ещё 5 комментариев
Теги:
activex
rdp

1 ответ

1

Использование:

CType(rdp, System.ComponentModel.ISupportInitialize).EndInit()
rdp.CreateControl()

Найдите свой эквивалент в С#

Ещё вопросы

Сообщество Overcoder
Наверх
Меню