因为公司内部网络做一定隔离,所以用rtx进行内部通讯,有个需求是对部分人的发送文件权限进行限制,但截图不限制
根据rtx server sdk的帮助文档看了一下,做了一个简单的rtx app
原理是,对需要处理的部分人的信息进行拦截,只要带附件两个字的,都拦截掉,在官方的代码上进行了简单修改(把拦截进行了白名单制,就是放行的才可以通过)
唯一要注意的是,代码需要用32位进行编译
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(); } } }