首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年10月03日 11:32
 
本教程使用工具所使用的环境说明:
启动器开发工具: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 类型,并赋值为 1
             key.SetValue(valueName, 1, RegistryValueKind.DWord);
             MessageBox.Show("注册表键已创建并赋值成功。");
         }
         else
         {
             MessageBox.Show("无法创建注册表。");
         }
     }
 }
 catch (UnauthorizedAccessException)
 {
     MessageBox.Show("您没有权限设置注册表,请以管理员身份运行程序。");
 }
 catch (Exception ex)
 {
     MessageBox.Show($"设置注册表发生错误: {ex.Message}");
 }

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

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

 

 
 
From:https://www.cnblogs.com/weskynet/p/18445584
本文地址: http://shuzixingkong.net/article/2451
0评论
提交 加载更多评论
其他文章 C++函数指针详解
本文详细介绍了C/C++中的普通函数和类的成员函数的指针。结合C++代码示例讲解了函数指针作为其他函数的输入、返回值以及typedef如何提高代码可读性的实用技巧。对于类的成员函数(方法)指针,则分为静态和非静态两种情况。最后总结了普通函数、类的非静态成员函数、类的静态成员函数的声明、赋值和定义的C
全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串
在Python中,字符编码是将字符映射为字节的过程,而字节序列(bytes)则是存储这些字节的实际数据结构,字节序列和可变字节字符串的主要区别在于其可变性和用途,bytearray是可变的字节序列,允许修改其内容。
全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串 全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串 全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串
Nuxt.js 应用中的 app:redirected 钩子详解
title: Nuxt.js 应用中的 app:redirected 钩子详解 date: 2024/10/3 updated: 2024/10/3 author: cmdragon excerpt: app:redirected 是 Nuxt.js 中的一个钩子,主要用于处理服务器端渲染(SSR)
Nuxt.js 应用中的 app:redirected 钩子详解 Nuxt.js 应用中的 app:redirected 钩子详解
Linux_动态库与静态库(其一)
1.动态库和静态库的定义 动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾。 静态库(.a):静态库是将一组目标文件(.o文件)打包成一个单一的归档文件。在编译时,链接器会将所需的目标文件代码复制到最终生成的
Linux_动态库与静态库(其一) Linux_动态库与静态库(其一) Linux_动态库与静态库(其一)
Linux_权限理解(详细PLUS)
1.用户 Linux下有两种用户:超级用户(root)和普通用户; 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情 超级用户的命令提示符是&quot;#&quot;,普通用户的命令提示符是&quot;$&quot; 超级用户: 普通用户: 2.用户切换 用
Linux_权限理解(详细PLUS) Linux_权限理解(详细PLUS) Linux_权限理解(详细PLUS)
SpringBoot项目使用yml文件链接数据库异常
SpringBoot使用properties连接数据库时没有出现问题 SpringBoot使用yml连接数据库时出现:Unable to connect to Redis 并在报错信息中出现: 发现是用户或者密码出现问题 通过查询知道yml是区分数据类型的,所以如果用户名或者密码是数字的话,就要注意
SpringBoot项目使用yml文件链接数据库异常 SpringBoot项目使用yml文件链接数据库异常 SpringBoot项目使用yml文件链接数据库异常
国庆快乐!附ssh实战
小伙伴们,有一段时间没更新了,目前在中科院软件所实习,在这里我祝大家国庆快乐! 今天这一期带来ssh命令的实战教程,ssh在工作当中遇到的非常多,因为总是需要登服务器,而且玩法也有不少,这是我常用的几个玩法。 1、Windows直接连接虚拟机启动的Linux。 ssh user@IPV4 2、从Li
国庆快乐!附ssh实战 国庆快乐!附ssh实战 国庆快乐!附ssh实战
安卓Android虚拟机分享及使用
不知道大家伙在安装安卓虚拟机时被各式各样的问题折磨过没,我在安装安卓虚拟机时,遇到的问题简直就像长江之水源源不断,就算是最后安装好了也会因为各式各样的原因无法进入启动桌面。 当我发现这个可以直接导入到电脑一键开启运行的虚拟机时,今天我必须分享给大家!话不多说安排! 这个可以直接导入到vmware或者
安卓Android虚拟机分享及使用 安卓Android虚拟机分享及使用 安卓Android虚拟机分享及使用