本教程使用工具所使用的环境说明:
启动器开发工具: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
如下图所示,目前里面没啥东西。
 
可以通过当前工具进行设置,在服务器上面打开RemoteShadowApp程序,然后点击设置注册表,即可看到注册表被自动创建成功了。这样可以直接快速设置注册表。
当然,如果不想在服务器上面运行,也可以手动自己设置一下。自己创建一个注册表,创建DWORD键值对,名称是 fAllowUnlistedRemotePrograms 对应的值设为1。如果觉得麻烦,那就用我上面的工具直接设置,效果也是一样的。
 
 
在本机机器上面,就可以通过远程访问目标服务器的程序了。操作如下:
例如我要打开远程桌面上的Notepad++程序
我需要获取服务器的IP、登陆的用户名、密码、以及NotePad++的启动程序的绝对路径,例如如下图所示。我没做记住信息功能,所以大家也可以自己创建一个记事本之类的,存储你的远程程序信息,方便粘贴进去填写。都输入完毕以后,点击 【打开远程程序】 按钮
 
注意事项:如果远程服务器有360等软件,可能会限制你的权限,例如一直卡在这个界面
 
此刻你需要点开 显示详细信息,可以看到有一个登陆按钮,点击登陆即可。这个只有部分远程服务器会出现,如果本机没有一些限制设置或者安全软件,这一步不会出现。仅在有出现这个现象的时候才需要这样操作。
打开的远程的notepad++程序,效果如图所示。
接着我们打开远程服务器,看下现象。具体如图所示效果。
 
支持打开多个远程程序,例如,我现在打开一个以前自己写的控制台程序服务,地址如下
在刚才的程序里面,更改启动的路径为上面的控制台服务路径,然后启动。可以看到启动成功了。并且和上一个notepad程序可以共存。
同样,服务器上面也并不存在控制台程序的页面,但是存在进程。控制台程序也是占用服务器资源,而不会占用本地资源。
如果当前没啥需要,就可以退出启动器,退出启动器对已经打开的远程程序没有任何影响。启动器只是用来提供远程程序作用,没有其他功能。
 
启动器核心功能,主要是DPAPI加密功能。DPAPI(数据保护应用程序编程接口)是微软提供的一个用于帮助保护数据安全的API,它可以简化在Windows平台上的数据加密过程。DPAPI 提供了一个系统级别的加密服务,其特点是不需要应用程序自行处理加密密钥的存储和保护。DPAPI主要用于保护敏感信息,如密码、密钥和其他个人或系统数据。
如下所示代码,我在Wesky.Net.Opentools开源项目上也有集成该功能。此处我在本程序内直接使用来加密。必须加密以后的密码,才能被远程服务器识别。
 
下面是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
如下图所示,目前里面没啥东西。
 
可以通过当前工具进行设置,在服务器上面打开RemoteShadowApp程序,然后点击设置注册表,即可看到注册表被自动创建成功了。这样可以直接快速设置注册表。
当然,如果不想在服务器上面运行,也可以手动自己设置一下。自己创建一个注册表,创建DWORD键值对,名称是 fAllowUnlistedRemotePrograms 对应的值设为1。如果觉得麻烦,那就用我上面的工具直接设置,效果也是一样的。
 
 
在本机机器上面,就可以通过远程访问目标服务器的程序了。操作如下:
例如我要打开远程桌面上的Notepad++程序
我需要获取服务器的IP、登陆的用户名、密码、以及NotePad++的启动程序的绝对路径,例如如下图所示。我没做记住信息功能,所以大家也可以自己创建一个记事本之类的,存储你的远程程序信息,方便粘贴进去填写。都输入完毕以后,点击 【打开远程程序】 按钮
 
注意事项:如果远程服务器有360等软件,可能会限制你的权限,例如一直卡在这个界面
 
此刻你需要点开 显示详细信息,可以看到有一个登陆按钮,点击登陆即可。这个只有部分远程服务器会出现,如果本机没有一些限制设置或者安全软件,这一步不会出现。仅在有出现这个现象的时候才需要这样操作。
打开的远程的notepad++程序,效果如图所示。
接着我们打开远程服务器,看下现象。具体如图所示效果。
 
支持打开多个远程程序,例如,我现在打开一个以前自己写的控制台程序服务,地址如下
在刚才的程序里面,更改启动的路径为上面的控制台服务路径,然后启动。可以看到启动成功了。并且和上一个notepad程序可以共存。
同样,服务器上面也并不存在控制台程序的页面,但是存在进程。控制台程序也是占用服务器资源,而不会占用本地资源。
如果当前没啥需要,就可以退出启动器,退出启动器对已经打开的远程程序没有任何影响。启动器只是用来提供远程程序作用,没有其他功能。
 
启动器核心功能,主要是DPAPI加密功能。DPAPI(数据保护应用程序编程接口)是微软提供的一个用于帮助保护数据安全的API,它可以简化在Windows平台上的数据加密过程。DPAPI 提供了一个系统级别的加密服务,其特点是不需要应用程序自行处理加密密钥的存储和保护。DPAPI主要用于保护敏感信息,如密码、密钥和其他个人或系统数据。
如下所示代码,我在Wesky.Net.Opentools开源项目上也有集成该功能。此处我在本程序内直接使用来加密。必须加密以后的密码,才能被远程服务器识别。
 
下面是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】

 
 

基于DPAPI+RDP技术实现本地打开远程程序,并映射到本地机器桌面上的更多相关文章

  1. C#通过rdp账密直接打开远程桌面

    思路是首先新建一个vbs脚本,再创建一个bat脚本,再创建rdp文件,运行顺序是vbs->bat->rdp.rdp文件里面包含远程电脑的账密和其它信息,这样就可以不用再输入账密,而在程序里 ...

  2. 〖Linux〗使用ssh登录远程主机,并在本地打开远程图形界面

    1. 修改/etc/ssh/sshd_config文件,设置允许TCP转发和X11转发 AllowTcpForwarding yes X11Forwarding yes 2. 登录无图形远程主机,并允 ...

  3. git删除本地及远程分支

    1. 删除本地分支: git branch -d branchName 2. 删除远程分支: // 方法一:将删除的本地分支推到远程(要删除的远程分支在本地有映射) git push origin : ...

  4. emacs使用本地emacs server模式打开远程文件

    使用emacs的用户都知道,一般要打开远程机器上的文件要使用TrampMode模式,调用方式例如以下: C-x C-f /remotehost:filename RET (or /method:use ...

  5. 基于CORBA/WEB技术构建三层体系结构的应用

    1 问题提出 在应用系统开发过程中,CLIENT/SERVER体系结构得到了广泛的应用 .其特点是,应用程序逻辑通常分布在客户和服务器两端,客户端发出数据资源访问请求,服务器端将结果返回客户端.但CL ...

  6. Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 【转载自freebuf.com】

    零.绪论: 1.鸣谢freebuf的文章,主要是学习这个漏洞,文章地址: Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 2.在shadon上找了多个该漏洞尝试复现失败(评论 ...

  7. 本地Windows远程桌面连接阿里云Ubuntu服务器

    本地Windows远程桌面连接阿里云Ubuntu 16.04服务器: 1.目的:希望通过本地的Windows远程桌面连接到阿里云的Ubuntu服务器,通过远程桌面图形界面的方式操作服务器. 2.条件: ...

  8. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  9. iOS 打开本地 其他应用程序(URL Types)

    iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...

  10. Microsoft Azure Web Sites应用与实践【2】—— 通过本地IIS 远程管理Microsoft Azure Web Site

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

随机推荐

  1. vue页面加载慢,chunk-vendors.js文件太大

    今天拉取合并了同事的代码后页面加载速度变得非常慢,经过排查发现是因为加载的chunk-vendors.js太大 58m 28s就很离谱 经过同事指导加上百度终于找到解决办法,配置compression ...

  2. 灵巧手 —— 智能仿生手 —— 人形机器人(humanoid)

    产品主页: https://www.brainco.cn/#/product/brain-robotics 国内销售的一款产品,美国华人生产的,灵巧度非常高的一款仿生手产品.

  3. Dolphinscheduler不重启加载Oracle驱动

    转载自刘茫茫看山 问题背景 某天我们的租户反馈数据库连接缺少必要的驱动,我们通过日志查看确实是缺少部分数据库的驱动,因为DolphinScheduler默认只带了Oracle和MySQL的驱动,并且需 ...

  4. 后端开发学习敏捷需求-->干系人分析与识别

    干系人分析与识别 5W1H 干系人分析与识别 1. 干系人是什么 直接或者间接影响专题,以及被专题影响的人和组织,用户也是属于干系人,是产品直接或者间接的使用者 又叫利益相关者,指积极参与专题或者在专 ...

  5. VideoGeneration

    Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets 主要贡献:设计了一套数据清洗策略来清洗大 ...

  6. LeetCode216.组合总和lll

    4.组合总和lll(LeetCode216) 题目叙述: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 .该列 ...

  7. 代码随想录Day15

    110.平衡二叉树 (优先掌握递归) 给定一个二叉树,判断它是否是 平衡二叉树 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1. 示例 1: 输入:root = [3,9,20,null, ...

  8. 微服务全链路跟踪:jaeger增加tag参数

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  9. [天线原理及设计>基本原理] 3. 辐射方向图或天线方向图

    <Antenna_Theory_Analysis_and_Design_3rd_Constantine_A._Balanis.pdf> 3. 辐射方向图或天线方向图 天线辐射方向图或天线方 ...

  10. esp32挂esphome

    esp32挂esphome 使用docker创建容器 docker run -d --name='esphome' \ --restart=always \ -p 6052:6052 \ -e TZ= ...