由于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)