小隐的博客

人生在世,笑饮一生
随笔 - 304, 文章 - 0, 评论 - 349, 阅读 - 50万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 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

rtx应用和开发

Posted on   隐客  阅读(279)  评论(0编辑  收藏  举报

因为公司内部网络做一定隔离,所以用rtx进行内部通讯,有个需求是对部分人的发送文件权限进行限制,但截图不限制

根据rtx server  sdk的帮助文档看了一下,做了一个简单的rtx app

 

原理是,对需要处理的部分人的信息进行拦截,只要带附件两个字的,都拦截掉,在官方的代码上进行了简单修改(把拦截进行了白名单制,就是放行的才可以通过)

 

 

唯一要注意的是,代码需要用32位进行编译

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using RTXSAPILib;
using System.Runtime.InteropServices;
using System.IO;
 
namespace IMWatch
{
    public partial class Form1 : Form
    {
        RTXSAPILib.RTXSAPIRootObj RootObj;  //声明一个根对象
        RTXSAPILib.RTXSAPIObj ApiObj;       //声明一个应用对象
 
  
        RTXSAPILib.RTXSAPIDeptManager DeptManagerObj;       //声明一个部门管理对象
        List<string> users;
 
 
 
        public delegate void  ADDText(string RevContent);
        ADDText myDelegate;
 
        public Form1()
        {
            InitializeComponent();
            RootObj = new RTXSAPIRootObj();     //创建根对象
            ApiObj = RootObj.CreateAPIObj();    //通过根对象创建应用对象
 
            DeptManagerObj = RootObj.DeptManager;    //通过根对象创建部门管理对象
 
 
            ApiObj.OnRecvMessage += new _IRTXSAPIObjEvents_OnRecvMessageEventHandler(ApiObj_OnRecvMessage); //订阅一个事件,当收到客户端发过来的消息时触发该事件
 
             myDelegate = new ADDText(ADDTextMethod);
        }
 
        private void ADDTextMethod(string RevContent)
        {
            txtResult.Text = RevContent;
        }
 
        private void ApiObj_OnRecvMessage(RTXSAPILib.RTXSAPIMessage Message) //接收到插件发来的消息触发该事件
        {
            string RevContent;
            try
            {
                RevContent = Message.Sender + "发送:" + Message.Content + "到:" + Message.Receivers; //显示数据
 
                txtResult.BeginInvoke(myDelegate, RevContent);
            }
            catch (COMException xe)
            {
                MessageBox.Show(xe.Message);
            }
 
        }
 
        private void btnRegApp_Click(object sender, EventArgs e)
        {
            txtFilterSender.Text = getwhitename();
 
 
            ApiObj.ServerIP = txtServerIP.Text;    //设置服务器IP,,必填参数
            ApiObj.ServerPort = Convert.ToInt16(txtServerPort.Text);    //设置服务器端口,,必填参数
            ApiObj.AppGUID = txtAppGuid.Text;      //设置应用GUID,,必填参数
            ApiObj.AppName = txtAppName.Text;      //设置应用名称,,必填参数
 
 
            if (txtFilterAction.Text == "distill")
            {
                ApiObj.AppAction = RTXSAPI_APP_ACTION.AA_DISTILL;
            }
            else if (txtFilterAction.Text == "copy")        // 当过滤动作为AA_DISTILL时,ConServer把消息拷贝给应用后删除原来的消息。
            {
                ApiObj.AppAction = RTXSAPI_APP_ACTION.AA_COPY; //设置过滤动作,当过滤动作为AA_COPY时,ConServer把消息拷贝一份给应用,但不会删除原来的消息。
            }
            else
            {
                MessageBox.Show("输入有误,请重新输入");
 
            }
 
            ApiObj.FilterAppName = txtFilterApp.Text  ;   // 表示过滤所有应用,必填参数
            ApiObj.FilterRequestType = txtFilterRequestTy.Text; // 过滤消息类型,必填参数
            ApiObj.FilterResponseType =txtFilterResponseType.Text  ; // 无回复消息类型,必填参数
            ApiObj.FilterSender = "anyone";//txtFilterSender.Text  ;    //过滤所有发送人的该类消息,必填参数
            ApiObj.FilterReceiver = txtFilterReceiver.Text  ; //过滤所有接收人的该类消息,必填参数
            ApiObj.FilterReceiverState = txtReceiverState.Text ; // 关注所有状态,必填参数
            ApiObj.FilterKey = txtFilterKey .Text ;
 
 
            try
            {
 
 
                btnRegApp.Enabled = false;
                btnStopApp.Enabled = true;
 
 
                users = new List<string>();
                getDept("");
 
                //设置白名单
                string[] x = txtFilterSender.Text.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = users.Count - 1; i >= 0; i--)
                {
                     
                    for (int y = 0; y < x.Length; y++)
                    {
                        if (users[i] == x[y])
                        {
                            users.RemoveAt(i);
                            break;
                        }
                    }
                }
                ApiObj.FilterSender = "anyone";
                if (users.Count > 0)
                {
                    ApiObj.FilterSender= string.Join("|", users.ToArray());
                }
 
 
                ApiObj.RegisterApp();   //注册应用
                MessageBox.Show("注册成功");
                btnStartApp_Click(null, null);
 
            }
            catch (COMException xe)
            {
                MessageBox.Show(xe.Message);
            }
 
        }
        private string getwhitename()
        {
            string fp = @"whitename.txt";
            if (!File.Exists(fp))
            {
                MessageBox.Show("没有找到白名单文件,将全部不能发送文件");
                return "anyone";
            }
            string f = File.ReadAllText(fp,Encoding.Default);
 
            if (f == "")
                f = "anyone";
            f= f.Replace("\r\n","|");
            f = f.Replace("||", "|");
            while (f.Substring(f.Length-1,1)=="|" )
            {
                f = f.Substring(0, f.Length - 1);
            }
            return f;
        }
        private void getDept(string dept)
        {
            try
            {
                string txtChileDepts = DeptManagerObj.GetChildDepts(dept); //'查看某个部门的子部门
                string[] t = txtChileDepts.Split(new string[] { "\"" }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 1; i < t.Length; i += 2)
                {
                    Console.WriteLine("部门名称:" + t[i]);
                    getUser(t[i]);
 
                    getDept(t[i]);
                }
 
                //MessageBox.Show(txtChileDepts);
            }
            catch (COMException ex)
            {
                MessageBox.Show(ex.Message);
            }
 
        }
        private void getUser(string dept)
        {
            try
            {
                string deptUsers = DeptManagerObj.GetDeptUsers(dept); //查看部门下的用户列表\
 
                string[] t = deptUsers.Split(new string[] { "\"" }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 1; i < t.Length; i += 2)
                {
                    Console.WriteLine("人员名称:" + t[i]);
 
                    users.Add(t[i]);
                }
 
            }
            catch (COMException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void btnStartApp_Click(object sender, EventArgs e)
        {
            try
            {
                ApiObj.StartApp("", 4);     //启动应用
                MessageBox.Show("启动成功");
            }
            catch (COMException xe)
            {
                MessageBox.Show(xe.Message);
            }
        }
 
        private void btnStopApp_Click(object sender, EventArgs e)
        {
            try
            {
                ApiObj.StopApp();   //停止应用
                MessageBox.Show("停止成功");
                btnUnregApp_Click(null, null);
                btnStopApp.Enabled = false;
                btnRegApp.Enabled = true;
            }
            catch (COMException xe)
            {
                MessageBox.Show(xe.Message);
            }
        }
 
        private void btnUnregApp_Click(object sender, EventArgs e)
        {
            try
            {
                ApiObj.ServerIP = txtServerIP.Text;    //设置服务器IP,,必填参数
                ApiObj.ServerPort = Convert.ToInt16(txtServerPort.Text);    //设置服务器端口,,必填参数
                ApiObj.AppGUID = txtAppGuid.Text;      //设置应用GUID,,必填参数
                ApiObj.AppName = txtAppName.Text;      //设置应用名称,,必填参数
                ApiObj.UnRegisterApp();     //注销应用
                MessageBox.Show("注销成功");
            }
            catch (COMException xe)
            {
                MessageBox.Show(xe.Message);
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            txtFilterSender.Text = getwhitename();
        }
    }
}

  

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
QQ交流
点击右上角即可分享
微信分享提示