Windows远程登录提醒

ruike
2023-09-21 / 0 评论 / 4 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年01月11日,已超过541天没有更新,若内容或图片失效,请留言反馈。
由于RDP远程桌面功能非常方便,但又存在较高风险,只能通过提高安全防护,避免造成损失。
本文记录一种邮件提醒远程登陆的方法和过程。
工作原理:
1.利用windows的计划任务功能,当远程登陆的时候,调用指定的程序;
2.此处调用的是python脚本,利用python来完成发送邮件的功能;
3.在python脚本中调用一个EXE小程序来获取登陆信息(用户名,客户端名称等信息)
————————————————
原文链接:https://blog.csdn.net/qq446252221/article/details/112810295

一、获取远程登陆信息

第一步:
写一个EXE小工具,获取远程登陆信息
使用C语言编写,通过win32底层API读取客户端信息;
并把信息打印到标准输出以便后面python读取。
这个方法不能获取到准确的客户端IP地址,这里的IP地址其实是内网地址。
暂时还没有找到如何获取客户端公网IP的办法。
完整的C语言源码如下(只支持Windows Vista及以上系统版本):

#include <stdio.h>
#include <Windows.h>
#include <wtsapi32.h>
 
#pragma comment(lib, "wtsapi32.lib")
 
static const char *af_str[]=
{
"AF_UNSPEC",
"AF_UNIX",
"AF_INET",
"AF_IMPLINK",
"AF_PUP",
"AF_CHAOS",
"AF_IPX",
"AF_NS",
"AF_ISO",
"AF_OSI",
"AF_ECMA",
"AF_DATAKIT",
"AF_CCITT",
"AF_SNA",
"AF_DECnet",
"AF_DLI",
"AF_LAT",
"AF_HYLINK",
"AF_APPLETALK",
"AF_NETBIOS",
"AF_VOICEVIEW",
"AF_FIREFOX",
"AF_UNKNOWN1",
"AF_BAN",
};
 
void main(void)
{
    DWORD cbReturned; 
    PWTSCLIENTA pData;
    if(WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientInfo, (LPSTR*)&pData, &cbReturned))
    {
        printf("UserName:%s\r\n", pData->UserName);
        printf("ClientName:%s\r\n", pData->ClientName);
        printf("ClientBuildNumber:%d\r\n", pData->ClientBuildNumber);
        printf("ClientAddressFamily:%s\r\n", af_str[pData->ClientAddressFamily]);
        printf("ClientAddress(raw):%d.%d.%d.%d\r\n", pData->ClientAddress[0],pData->ClientAddress[1],pData->ClientAddress[2],pData->ClientAddress[3]);
        printf("ClientAddress(str):%ls\r\n", pData->ClientAddress);
        WTSFreeMemory(pData);
        return;
    }
    printf("WTSQuerySessionInformationA Failed!\r\n");
    printf("Error:%08X\r\n", GetLastError());
    //system("pause");
}

二、发送提醒

第二步:
写一个python脚本,调用上面的小工具,并读取输出,然后发送通知,这里使用了企微的群机器人

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_

# @Author : Ruike
# @Time : 2023/9/21 16:35
# @File : rdp_notice.py
# @Project :获取RDP登陆信息,并发企微提醒

import subprocess
import requests
import datetime
import re

# 设备名称
DEVICE = "xxxx"
# 企微机器人KEY
KEY = "xxxxxx"
# 指定EXE小工具的路径
RDPINFO_EXEPATH = "rdp_info.exe"


# 获取登陆信息
def get_login_info():
    out = subprocess.check_output(RDPINFO_EXEPATH, timeout=3)
    context = out.decode("utf8")
    if 'Error:' not in context:
        key_list = ('登录用户', '设备名称', '设备序号', '地址系列', '设备IP(raw)', '设备IP(str)')
        datas = re.findall(r":(.*?)\n", context)
        data_len = len(datas)
        if len(key_list) == data_len:
            context = ''
            for i in range(data_len):
                context += "%s: %s\n" % (key_list[i], datas[i])
        else:
            # 如果匹配不上,直接使用替换法
            keys = {
                'UserName': '登录用户', 'ClientName': '设备名称', 'ClientBuildNumber': '设备序号',
                'ClientAddressFamily': '地址系列', 'ClientAddress(raw)': '设备IP(raw)',
                'ClientAddress(str)': '设备IP(str)'
            }
            for k, v in keys.items():
                context = context.replace(k, v)
    else:
        # 如果有异常或其它情况,直接原数据返回
        pass

    return context

# 企业微信机器人
def send_groupbot(key, content):
    bot_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s" % key
    datas = {
        "msgtype": "text",
        "text": {
            "content": content,
        }
    }
    req = requests.post(bot_url, json=datas, auth=('Content-Type', 'application/json'))
    return req.text


# 程序入口
if __name__ == '__main__':

    time_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    info_str = get_login_info()

    msg = "%s被登陆提醒\n%s\n登录时间:%s" % (DEVICE, info_str, time_str)
    send_groupbot(KEY, msg)

三、配置触发

在windows计划任务里面添加任务,当远程登陆时调用我们的python脚本。
1.打开“计算机管理”,找到"任务计划程序",点击“创建任务”
2.名称随便写,比如“远程登陆提醒”
3.设置“触发器”,如下图所示,选择“当连接到用户会话时”,“远程计算机的连接”

触发器

执行条件

记得需要将exe和py文件放在同个目录

最后点击“确定”,计划任务就添加好了。

四、微信通知

企微可以做微信插件通知,登录企微后台-我的企业-微信插件,按照提示关注即可。
微信端可以自己看到的消息类型是text和图文消息。

0

评论 (0)

取消