VC++利用微软mstscax.dll控件集成远程桌面

利用微软mstscax.dll控件集成远程桌面
 
 
1.新建基于MFC的对话框程序,在对话框资源上右键,选择【Insert ActiveX Control...】菜单,然后在弹出的界面中选择“Microsoft RDP Client Contorl”。
 
 
2.在新添加的控件上点击右键选择【Add Variable...】,为该控件绑定一个变量,本例子中为m_RemoteDesktopControl。
 
 
 
3.打开Class Wizard,选择右上角【Add Class】按钮的下拉部分,在弹出的下拉列表中选择【MFC Class From TypeLib...】,然后在类库列表中选择Microsoft Terminal Service Client Control Type Library,然后在左下侧接口列表中选择IMsRdpClientAdvanceSettings6,添加到右侧生成类列表中。
 
4.打开CMsRdpClientAdvancedSettings6类头文件,注释掉#import "C:\\Windows\\SysWOW64\\mstscax.dll" no_namespace这句代码。
 
连接代码:
CMsRdpClientAdvancedSettings6 m_MsRdpClientAdvancedSettings(m_RemoteDesktopControl.get_AdvancedSettings());
	m_RemoteDesktopControl.put_Server(_T("10.176.36.181"));
	m_RemoteDesktopControl.put_UserName(_T("Leen"));
	m_RemoteDesktopControl.put_DesktopHeight(800);
	m_RemoteDesktopControl.put_DesktopWidth(1200);
	m_RemoteDesktopControl.put_ColorDepth(32);
	m_MsRdpClientAdvancedSettings.put_Compress(1);
	m_MsRdpClientAdvancedSettings.put_BitmapPeristence(1);
	m_MsRdpClientAdvancedSettings.put_ClearTextPassword(_T("******"));
	m_MsRdpClientAdvancedSettings.put_singleConnectionTimeout(20);
	m_RemoteDesktopControl.put_ConnectingText(_T("Loading..."));
	m_RemoteDesktopControl.Connect();
 
如果连接时没反应或者弹出如下对话框:

m_MsRdpClientAdvancedSettings.put_AuthenticationLevel(2);

这句代码是提升网络身份验证用的,在 IMsRdpClientAdvancedSettings4之后追加了AuthenticationLevel属性,Win10采用的身份认证级别比较高,因此将访问端提升至更高级别即可连接。

 

在身份认证级别一致的情况下,假如采用证书认证,可能出现被访问端证书安装不正确的情况,会弹出以下对话框:

1.如果不想让对话框再次弹出,可以勾选“Don't ask me again...”复选框;
2.如果一次也不想看到该对话框出现,采用以下的方案:

在注册表对应路径修改如下:

Action: Create
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Microsoft\Terminal Server Client
Value name: AuthenticationLevelOverride
Value Type: REG_DWORD
Value data: 00000000
Hexadecimal

代码修改注册表的方式如下,此处不用生成子项,所以注释生成子项的代码(此处有生成子项的代码做对比,便于区分子项和子键):

HKEY hKey = NULL;
 DWORD dw = 0;
 TCHAR * subKey = _T("Software\\Microsoft\\Terminal Server Client");
 long resulte = RegOpenKeyEx(HKEY_CURRENT_USER, subKey, 0, KEY_ALL_ACCESS, &hKey);

//1.生成子项
 //resulte = RegCreateKeyEx(hKey, _T("AuthenticationLevelOverride"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw);

//2.设定子键
 resulte = RegSetValueEx (hKey, _T("AuthenticationLevelOverride"), 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD));
 if (resulte != ERROR_SUCCESS)
 {
  AfxMessageBox("Operation register failed!");
 }

 

posted on   wu.g.q  阅读(2333)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示