基于DPAPI+RDP技术实现本地打开远程程序,并映射到本地机器桌面上

news/2024/10/3 12:40:04
本教程使用工具所使用的环境说明:
启动器开发工具:VS2022
启动器所用客户端技术:.NET 8 + WPF
启动器其他技术:DPAPI
启动器发布的可执行程序,系统要求:Windows 7以及以上,X64
如果需要本程序,可以在网盘获取。网盘地址:
链接: https://pan.baidu.com/s/1QPstE5-1zPK-qOp8GQ90ew?pwd=6666 提取码: 6666

 

 
接下来是该工具的具体使用教程。
先对远程服务器上面的注册表进行设置。路径如下:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
如下图所示,目前里面没啥东西。
0
 
可以通过当前工具进行设置,在服务器上面打开RemoteShadowApp程序,然后点击设置注册表,即可看到注册表被自动创建成功了。这样可以直接快速设置注册表。
0
当然,如果不想在服务器上面运行,也可以手动自己设置一下。自己创建一个注册表,创建DWORD键值对,名称是 fAllowUnlistedRemotePrograms 对应的值设为1。如果觉得麻烦,那就用我上面的工具直接设置,效果也是一样的。
0
 
0
 
在本机机器上面,就可以通过远程访问目标服务器的程序了。操作如下:
例如我要打开远程桌面上的Notepad++程序
0
我需要获取服务器的IP、登陆的用户名、密码、以及NotePad++的启动程序的绝对路径,例如如下图所示。我没做记住信息功能,所以大家也可以自己创建一个记事本之类的,存储你的远程程序信息,方便粘贴进去填写。都输入完毕以后,点击 【打开远程程序】 按钮
0
 
注意事项:如果远程服务器有360等软件,可能会限制你的权限,例如一直卡在这个界面
 
0
此刻你需要点开 显示详细信息,可以看到有一个登陆按钮,点击登陆即可。这个只有部分远程服务器会出现,如果本机没有一些限制设置或者安全软件,这一步不会出现。仅在有出现这个现象的时候才需要这样操作。
0
打开的远程的notepad++程序,效果如图所示。
0
接着我们打开远程服务器,看下现象。具体如图所示效果。
0
 
支持打开多个远程程序,例如,我现在打开一个以前自己写的控制台程序服务,地址如下
0
在刚才的程序里面,更改启动的路径为上面的控制台服务路径,然后启动。可以看到启动成功了。并且和上一个notepad程序可以共存。
0
同样,服务器上面也并不存在控制台程序的页面,但是存在进程。控制台程序也是占用服务器资源,而不会占用本地资源。
0
如果当前没啥需要,就可以退出启动器,退出启动器对已经打开的远程程序没有任何影响。启动器只是用来提供远程程序作用,没有其他功能。
0
 
启动器核心功能,主要是DPAPI加密功能。DPAPI(数据保护应用程序编程接口)是微软提供的一个用于帮助保护数据安全的API,它可以简化在Windows平台上的数据加密过程。DPAPI 提供了一个系统级别的加密服务,其特点是不需要应用程序自行处理加密密钥的存储和保护。DPAPI主要用于保护敏感信息,如密码、密钥和其他个人或系统数据。
如下所示代码,我在Wesky.Net.Opentools开源项目上也有集成该功能。此处我在本程序内直接使用来加密。必须加密以后的密码,才能被远程服务器识别。
0
 
下面是DPAPI具体的加密和解密过程:
/// <summary> /// 加密数据 /// </summary> /// <param name="dataToEncrypt"></param> /// <returns></returns> public static string EncryptData(string dataToEncrypt) { try { byte[] secret = Encoding.Unicode.GetBytes(dataToEncrypt); byte[] encryptedSecret = ProtectedData.Protect(secret, additionalEntropy, DataProtectionScope.LocalMachine); string res = string.Empty; foreach (byte b in encryptedSecret) { res += b.ToString("X2"); } return res; } catch (Exception ex) { Console.WriteLine("加密过程中出现异常: " + ex.Message); return null; } } /// <summary> /// 解密数据 /// </summary> /// <param name="dataToDecrypt"></param> /// <returns></returns> public static string DecryptData(string hexEncryptedData) { try { byte[] dataToDecrypt = ConvertHexStringToByteArray(hexEncryptedData); byte[] decryptedData = ProtectedData.Unprotect(dataToDecrypt, null, DataProtectionScope.LocalMachine); return Encoding.Default.GetString(decryptedData); } catch (Exception ex) { Console.WriteLine("解密过程中出现异常: " + ex.Message); return null; } }
 
设置注册表的地方,也是很简单的一个写死的代码,供参考
// 指定注册表键的路径 string registryPath = @"SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"; // 根据需要修改路径 string valueName = "fAllowUnlistedRemotePrograms"; // 注册表项名称 try { // 创建或打开指定的注册表键 using (RegistryKey key = Registry.LocalMachine.CreateSubKey(registryPath)) { if (key != null) { // 设置值为 DWORD32 类型,并赋值为 1 key.SetValue(valueName, 1, RegistryValueKind.DWord); MessageBox.Show("注册表键已创建并赋值成功。"); } else { MessageBox.Show("无法创建注册表。"); } } } catch (UnauthorizedAccessException) { MessageBox.Show("您没有权限设置注册表,请以管理员身份运行程序。"); } catch (Exception ex) { MessageBox.Show($"设置注册表发生错误: {ex.Message}"); }
 
 
本教程使用工具所使用的环境说明:
启动器开发工具:VS2022
启动器所用客户端技术:.NET 8 + WPF
启动器其他技术:DPAPI
启动器发布的可执行程序,系统要求:Windows 7以及以上,X64
如果需要本程序,可以在网盘获取。网盘地址:
通过网盘分享的文件:RemoteShadowApp.7z 链接: https://pan.baidu.com/s/1QPstE5-1zPK-qOp8GQ90ew?pwd=6666 提取码: 6666
 
接下来是该工具的具体使用教程。
先对远程服务器上面的注册表进行设置。路径如下:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
如下图所示,目前里面没啥东西。
0
 
可以通过当前工具进行设置,在服务器上面打开RemoteShadowApp程序,然后点击设置注册表,即可看到注册表被自动创建成功了。这样可以直接快速设置注册表。
0
当然,如果不想在服务器上面运行,也可以手动自己设置一下。自己创建一个注册表,创建DWORD键值对,名称是 fAllowUnlistedRemotePrograms 对应的值设为1。如果觉得麻烦,那就用我上面的工具直接设置,效果也是一样的。
0
 
0
 
在本机机器上面,就可以通过远程访问目标服务器的程序了。操作如下:
例如我要打开远程桌面上的Notepad++程序
0
我需要获取服务器的IP、登陆的用户名、密码、以及NotePad++的启动程序的绝对路径,例如如下图所示。我没做记住信息功能,所以大家也可以自己创建一个记事本之类的,存储你的远程程序信息,方便粘贴进去填写。都输入完毕以后,点击 【打开远程程序】 按钮
0
 
注意事项:如果远程服务器有360等软件,可能会限制你的权限,例如一直卡在这个界面
 
0
此刻你需要点开 显示详细信息,可以看到有一个登陆按钮,点击登陆即可。这个只有部分远程服务器会出现,如果本机没有一些限制设置或者安全软件,这一步不会出现。仅在有出现这个现象的时候才需要这样操作。
0
打开的远程的notepad++程序,效果如图所示。
0
接着我们打开远程服务器,看下现象。具体如图所示效果。
0
 
支持打开多个远程程序,例如,我现在打开一个以前自己写的控制台程序服务,地址如下
0
在刚才的程序里面,更改启动的路径为上面的控制台服务路径,然后启动。可以看到启动成功了。并且和上一个notepad程序可以共存。
0
同样,服务器上面也并不存在控制台程序的页面,但是存在进程。控制台程序也是占用服务器资源,而不会占用本地资源。
0
如果当前没啥需要,就可以退出启动器,退出启动器对已经打开的远程程序没有任何影响。启动器只是用来提供远程程序作用,没有其他功能。
0
 
启动器核心功能,主要是DPAPI加密功能。DPAPI(数据保护应用程序编程接口)是微软提供的一个用于帮助保护数据安全的API,它可以简化在Windows平台上的数据加密过程。DPAPI 提供了一个系统级别的加密服务,其特点是不需要应用程序自行处理加密密钥的存储和保护。DPAPI主要用于保护敏感信息,如密码、密钥和其他个人或系统数据。
如下所示代码,我在Wesky.Net.Opentools开源项目上也有集成该功能。此处我在本程序内直接使用来加密。必须加密以后的密码,才能被远程服务器识别。
0
 
下面是DPAPI具体的加密和解密过程:
 /// <summary>/// 加密数据/// </summary>/// <param name="dataToEncrypt"></param>/// <returns></returns>public static string EncryptData(string dataToEncrypt){try{byte[] secret = Encoding.Unicode.GetBytes(dataToEncrypt);byte[] encryptedSecret = ProtectedData.Protect(secret, additionalEntropy, DataProtectionScope.LocalMachine);string res = string.Empty;foreach (byte b in encryptedSecret){res += b.ToString("X2");}return res;}catch (Exception ex){Console.WriteLine("加密过程中出现异常: " + ex.Message);return null;}}/// <summary>/// 解密数据/// </summary>/// <param name="dataToDecrypt"></param>/// <returns></returns>public static string DecryptData(string hexEncryptedData){try{byte[] dataToDecrypt = ConvertHexStringToByteArray(hexEncryptedData);byte[] decryptedData = ProtectedData.Unprotect(dataToDecrypt, null, DataProtectionScope.LocalMachine);return Encoding.Default.GetString(decryptedData);}catch (Exception ex){Console.WriteLine("解密过程中出现异常: " + ex.Message);return null;}}

 

设置注册表的地方,也是很简单的一个写死的代码,供参考
 // 指定注册表键的路径string registryPath = @"SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"; // 根据需要修改路径string valueName = "fAllowUnlistedRemotePrograms"; // 注册表项名称try{// 创建或打开指定的注册表键using (RegistryKey key = Registry.LocalMachine.CreateSubKey(registryPath)){if (key != null){// 设置值为 DWORD32 类型,并赋值为 1key.SetValue(valueName, 1, RegistryValueKind.DWord);MessageBox.Show("注册表键已创建并赋值成功。");}else{MessageBox.Show("无法创建注册表。");}}}catch (UnauthorizedAccessException){MessageBox.Show("您没有权限设置注册表,请以管理员身份运行程序。");}catch (Exception ex){MessageBox.Show($"设置注册表发生错误: {ex.Message}");}

后记:本工具打开的远程程序,支持局域网、外网,只要你可以通过远程桌面访问的服务器或者电脑,都可以通过该方式进行启动。

如果以上内容对你有帮助,欢迎点赞、在看、转发和留言。感谢大家的支持。也欢迎关注公众号:【Dotnet Dancer】

 

 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67335.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

wx推送

推送消息到wx基本代码 注意:import requests APPTOEKN = "AT_xxxxxxxxxxxxxxxxxxxxxxxxxx" UIDS = ["UID_xxxxxxxxxxxxxxxxxxxxx",]def send_message(msg,summary="test"):"""微信公众号推送发送消息:param msg: 要发送的内容:pa…

修改el-menu 样式

el-menu-item 修改el-menu项的高度 el-sub-menu 修改el-menu的下拉高度

矿山电子封条智能监管系统

矿山电子封条智能监管系统通过YOLOv7网络模型技术,矿山电子封条智能监管系统在通过在煤矿关键地点已经安装的摄像机,对矿井人数变化、生产作业状态、出入井人员等情况实时监测分析,发现煤矿人员作业及状态异常动态及时告警,自动将报警信息推送给后台系统,对矿山场景下人员…

高级语言程序设计第2次作业

打这个时忘了打return 0;运算时把/打成了打这个时没碰到问题因为忘了上下限是啥,所以随便打了一个比较大的数字p notation 不会打电脑警告是看了书才知道是\a无 一开始把浮点数换成了整数回答书上的问题: 系统处理整数上溢时,会从头再进行运算;若为浮点数上溢,则会进行中…

SCoRe: 通过强化学习教导大语言模型进行自我纠错

大语言模型(LLMs)在推理任务中,如数学问题求解和编程,已经展现出了优秀的性能。尽管它们能力强大,但在实现能够通过计算和交互来改进其回答的算法方面仍然面临挑战。现有的自我纠错方法要么依赖于提示工程,要么需要使用额外的模型进行微调,但这些方法都有局限性,往往无法产生有…

黑神话像素版(怀旧服)

包含电脑端(是个电脑就能玩,不需要配置),手机端(是个手机就能玩),此版本为黑神话像素版本,真正的免费游戏。包含电脑端(是个电脑就能玩,不需要配置),手机端(是个手机就能玩),此版本为黑神话像素版本,真正的免费游戏。 免费下载地址:https://pan.quark.cn/s/b4…

o1 式开源推理链项目 g1:可基于 Llama 3.2-90b 模型

g1 简介g1 是一个开源项目,利用 Llama 3.1 70b 模型在 Groq 硬件上实现类似 OpenAI o1 的推理链能力。项目通过精心设计的提示策略引导语言模型进行逐步推理,解决了传统语言模型在逻辑推理方面的不足。 工作原理利用动态推理链,逐步引导 Llama 3.1 模型完成复杂逻辑问题 模型…

Xcode11上新创建项目build fail

在mac上新装Xcode11,新创建了一个工程,点击运行一直build fail,并且没有显示报错。 点击xcode左侧边栏最右边的Show the Report navigator,显示报表导航器,如下图报错信息为Showing Recent Issues Couldnt create workspace arena folder /Users/hyt/Library/Developer/Xc…