前言

某天远程自己的电脑发现登不上了,错误信息如下:
在这里插入图片描述
开始也没在意,后面出现了好几次才反应过来。查看了Windows日志发现一直有人在尝试登录这台电脑,因为3389端口已经映射到了公网IP

初步解决方法

进入计算机管理->系统工具->本地用户和组选择被锁定的用户,右键属性就能看到
在这里插入图片描述
取消锁定即可

题外话

之前一直没有出现这种情况,但是我看日志信息这种情况已经出现好几天了,每隔几秒就有人尝试登陆。因为Windows日志右大小限制,也就是最多保留三四天的信息,那这种情况应该持续很长一段时间了。

之前没有发现是因为Windows11 22H2才开始开启这个策略。也就是说之前的系统即使密码尝试一直错误也不会锁定账户,具体可以看:Windows 11 22H2默认启用了密码暴力穷举保护功能

看了看我的纯数字的密码,细思极恐,吓得我马上换成了大小写数字加特殊字符的密码

预防措施

因为我自己也要远程连接电脑,防火墙直接锁死远程登陆也不太现实,因为是映射到公网的IP,用的也不是3389端口,改端口应该是没实际作用的。

查看了日志发现,日志里是有远程登陆的IP的。导出日志为txt,正则提取一下IP,接着去下重,有170个IP。想着加入防火墙的黑名单,但是Windows这防火墙也不能批量编辑,只能一个一个加。

搜了一下如何通过winapi获取日志和添加防火墙

获取日志

我搜到的有两种方式,powershell和WMI

WMI我测试了不太会用,还是powershell命令方便的多。官方文档

Get-EventLog
Get-EventLog
   [-LogName] <String>
   [-ComputerName <String[]>]
   [-Newest <Int32>]
   [-After <DateTime>]
   [-Before <DateTime>]
   [-UserName <String[]>]
   [[-InstanceId] <Int64[]>]
   [-Index <Int32[]>]
   [-EntryType <String[]>]
   [-Source <String[]>]
   [-Message <String>]
   [-AsBaseObject]
   [<CommonParameters>]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

说下这里面用的到的:

  • LogName: 日志类型, 比如安全/系统等。可以通过Get-EventLog -List查看所有的类型英文名称
    在这里插入图片描述
  • Newest: 查看最近的多少条
  • After: 在什么时间之后
  • Before: 在什么时间之前
  • Index,EntryType,Source,Message,InstanceID: 这五个都是日志的字段值
例子

Windows命令并不区分大小写,参数也是大写小写都可以。如果参数是字符串的话,不包含特殊字符的话,可以不用引号括起来。如果包含空格等特殊字符的话需要引号括起来

  • Get-EventLog -List
    查看所有日志类型
    在这里插入图片描述
  • Get-EventLog -LogName System -Newest 10
    查看最近十条系统日志
    在这里插入图片描述
  • Get-EventLog -LogName System -Source "Microsoft-Windows*" -Newest 10
    查看最近十条Source字段以Microsoft-Windows开头的系统日志
    在这里插入图片描述
  • Get-EventLog -LogName System -EntryType "Error" -Newest 10
    查看最近十条EntryType等于Error的系统日志
    在这里插入图片描述
  • Get-EventLog -LogName Security -InstanceId 4625 -Newest 10
    查看最近十条InstanceId等于4625的安全日志。InstanceId表示的是事件类型,4625就是登录失败的类型
    在这里插入图片描述
  • Get-EventLog -LogName Security -Message *登录失败* -Newest 10
    查看最近十条,Message包含登录失败的安全日志
    在这里插入图片描述
  • Get-EventLog -LogName System -Newest 1 | Select-Object -Property *
    显示属性
    Get-EventLog -LogName System -Newest 1 | Select-Object -Property EventID,Message 只显示EventID,Message字段
    在这里插入图片描述
  • $Begin = Get-Date -Date '1/17/2019 08:00:00'
    $End = Get-Date -Date '1/17/2019 17:00:00'
    Get-EventLog -LogName System -EntryType Error -After $Begin -Before $End
    这得先定义两个时间变量,再执行第三个命令
  • Get-EventLog -LogName Security -InstanceId 4625 -Newest 1 | select -ExpandProperty message
    只显示Message字段,主要是为了显示全部,不然看到的都是…
防火墙操作

官方文档

如果不清楚具体命令,可以后面跟空格+问号获取帮助信息
在这里插入图片描述
简单说下show delete和add这三个命令

show的功能基本就是下图中的两个例子了

  1. netsh advfirewall firewall show rule name="allow browser" 获取指定name的防火墙规则
  2. netsh advfirewall firewall show rule name=all dir=in type=dynamic 获取防火墙入站规则中类型为dynamic的规则。这个type类型指的是什么,我在防火墙里没看到

在这里插入图片描述

add的帮助信息比较长,这里就截了用法。示例和补充说明可以在自己电脑上看
在这里插入图片描述
介绍下字段:

  • name: 防火墙规则名称,建议唯一,且不能是all
  • dir: 指的是入站和出站规则,入站是别人访问你,出站是你访问别人。举个例子,你不想让别人访问你的某些接口就可以定义入站规则禁止端口。或者是你不想某些广告的请求发出去,你就可以定于出战规则限制某些IP向外请求
  • action:定义是允许还是禁止,这个bypass应该是界面上的那个只允许安全连接。具体可以看界面添加规则
  • program: 程序的目录,用于允许或者禁止应用联网
  • service: 指定服务的名称,如果指定any,则规则只针对服务生效
  • description:描述
  • enable:是否启用规则,默认是
  • profile:这个是指网络类型,也就是界面中的配置文件(域/专用/公用)
  • localip: 这个用来限制本机的某个网卡。比如手机有两个网,禁止其中一个
  • remoteip:这个就是用来添加远程IP的。localsubnet|dns|dhcp|wins|defaultgateway这些我也不清楚有什么用。看后面的参数类型:IPv4 | IPv6 | 地址范围 | 地址列表,这个后面说明
  • localport: 略
  • remoteport: 略
  • protocol: 一般指udp还是tcp或者是any,默认any
  • interfacetype:无线/有线/ 后面还有个ras应该是拨号吧
  • 下面的就不看了,也用不到

这里说下remoteip的规则。localip基本类似

  • ipv4:也就是指 8.8.8.8这种,还可以在后面接/24这种,具体解释看: IP 地址末尾的斜杠。通俗的讲就是下面四个对应关系
    • 10.0.0.0/24(10.0.0.1–10.0.0.254)
    • 10.0.0.0/16(10.0.0.1–10.0.255.254)
    • 10.0.0.0/8(10.0.0.1–10.255.255.254)
    • 10.0.0.0/32(10.0.0.0)
  • ipv6: 一样的用法
  • <range>: 地址范围,比如你不想写成10.0.0.0/24就可以写10.0.0.1–10.0.0.254
  • <list>: 可以写多个,用逗号分隔, 比如 8.8.8.8,10.0.0.0/24

示例
在这里插入图片描述

delete参数基本和add的一样在这里插入图片描述

编写软件自动提取IP和添加黑名单

因为登录失败的IP不止这些,我禁止了一批又出现几个新的,所以我打算写个工具自动提取IP和添加到防火墙黑名单里

这里我选择了aardio来写这个工具,理由很简单:调用powershell和cmd命令方便,容易打包成exe,没有依赖环境

https://blog.csdn.net/Qwertyuiop2016/article/details/127898862