小隐的博客

人生在世,笑饮一生
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

rtx应用和开发

Posted on 2020-11-27 18:49  隐客  阅读(268)  评论(0编辑  收藏  举报

因为公司内部网络做一定隔离,所以用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();
        }
    }
}

  

 

QQ交流