Deprecated: Creation of dynamic property Typecho\Widget\Request::$feed is deprecated in /www/wwwroot/blog.iletter.top/var/Widget/Archive.php on line 253
白荼日记 - windows 2025-12-16T10:46:00+08:00 Typecho https://blog.iletter.top/feed/atom/tag/windows/ <![CDATA[笔记本断电后自动关机python命令]]> https://blog.iletter.top/archives/503/ 2025-12-16T10:46:00+08:00 2025-12-16T10:46:00+08:00 DelLevin https://blog.iletter.top 自己的笔记本被自己改成了win server服务器,外加来电自启+小爱同学控制开关机,可以说很好了,但是笔记本却没有断电自动关机这个东西,原本想把电池扣了,换上usp的,但是有一点成本在的,果断放弃。

后来更改电源计划,99%的时候进行关机,但是盖上盖子,断开远程的时候,睡眠状态了就,不会进行关机操作。索性写了这个python代码

import sys
import win32api
import win32gui
import win32con
import pythoncom
import psutil
import threading
import time
import subprocess

SHUTDOWN_DELAY_SECONDS = 60

class PowerListenerWindow:
    def __init__(self):
        self.is_plugged_in = True # 初始假设为连接电源
        self.shutdown_timer = None
        self.last_unplugged_time = None

        wc = win32gui.WNDCLASS()
        wc.lpfnWndProc = self.wnd_proc
        wc.lpszClassName = 'MyPowerListenerClass'
        wc.hInstance = win32api.GetModuleHandle(None)
        class_atom = win32gui.RegisterClass(wc)

        # Create a hidden window
        self.hwnd = win32gui.CreateWindow(
            class_atom,
            'PowerListener',
            0, 0, 0, 0, 0,
            0, 0, wc.hInstance, None
        )

    def wnd_proc(self, hwnd, msg, wparam, lparam):
        if msg == win32con.WM_POWERBROADCAST:
            if wparam == win32con.PBT_APMPOWERSTATUSCHANGE:
                # print("[WM_POWERBROADCAST] 电源状态可能已更改 (PBT_APMPOWERSTATUSCHANGE)") # 简化日志
                self.check_and_print_status() # 调用更新后的检查函数

            elif wparam == win32con.PBT_ACPIRESUMEAUTOMATIC or wparam == win32con.PBT_ACPIRESUMESUSPEND:
                # print(f"[WM_POWERBROADCAST] 系统从睡眠/休眠恢复 (wParam={wparam})") # 简化日志
                pass # 可根据需要添加恢复逻辑

            elif wparam == win32con.PBT_APMSUSPEND:
                # print("[WM_POWERBROADCAST] 系统即将进入睡眠/休眠 (PBT_APMSUSPEND)") # 简化日志
                pass # 可根据需要添加休眠前逻辑

        return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)

    def cancel_pending_shutdown(self):
        """取消任何待定的关机操作"""
        if self.shutdown_timer and self.shutdown_timer.is_alive():
             self.shutdown_timer.cancel()
             self.shutdown_timer = None

    def schedule_shutdown(self):
        """在指定延迟后执行关机"""
        print(f"警告:设备未充电,将在 {SHUTDOWN_DELAY_SECONDS} 秒后关机!")
        self.execute_shutdown()

    def execute_shutdown(self):
        """实际执行关机操作"""
        # 再次确认是否仍然未充电,避免在检查间隙插上了电源
        try:
            battery_check = psutil.sensors_battery()
            if battery_check and not battery_check.power_plugged:
                 print("--- 执行关机 ---")
                 # 使用 subprocess 调用 Windows 关机命令
                 # /s 关机, /t 5 延迟5秒, /c 添加消息
                 subprocess.run(["shutdown", "/s", "/t", "5", "/c", "Battery low and not charging. Shutting down in 5 seconds..."], check=True)
                 # 等待一下,让关机命令生效
                 time.sleep(10)
                 sys.exit(0) # 正常退出监听器
            else:
                 print("--- 电源状态已恢复,取消关机 ---")
        except psutil.Error as e:
             print(f"查询电源状态失败: {e}")
             # 查询失败,出于安全考虑,可以选择不关机或记录日志
        except subprocess.CalledProcessError as e:
             print(f"执行关机命令失败: {e}")
        except Exception as e:
             print(f"执行关机时发生未知错误: {e}")


    def check_and_print_status(self):
        """Helper function to query and print current status and manage shutdown timer"""
        try:
            battery = psutil.sensors_battery()
            was_plugged_in = self.is_plugged_in # 记录之前的状态
            if battery:
                self.is_plugged_in = battery.power_plugged
                # 简化状态打印,仅在状态变化时提示
                # plugged_status_str = "已充电/接入电源" if self.is_plugged_in else "未在充电"
                # print(f"当前电源状态: {plugged_status_str}, 电量: {battery.percent}%")

                if not self.is_plugged_in:
                    # 检测到未充电
                    if was_plugged_in or self.shutdown_timer is None:
                        # 如果之前是充电的,或者是第一次检测到未充电且无定时器
                        print(f"提示:笔记本电脑当前未在充电! 电量: {battery.percent}%. 将在 {SHUTDOWN_DELAY_SECONDS} 秒后关机.")
                        self.cancel_pending_shutdown() # 先取消旧的(理论上不应该有)
                        # 启动新的 60 秒关机定时器
                        self.shutdown_timer = threading.Timer(SHUTDOWN_DELAY_SECONDS, self.schedule_shutdown)
                        self.shutdown_timer.start()
                    # else: 已经在倒计时中,无需重复启动

                else:
                    # 检测到已充电
                    if not was_plugged_in: # 如果之前是未充电的
                         print("提示:电源已连接,取消关机计划。")
                    # 取消任何待定的关机
                    self.cancel_pending_shutdown()

            else:
                # print("无法获取电池信息,可能不是笔记本电脑或传感器不可用。") # 简化日志
                self.is_plugged_in = True # 默认为连接(安全起见)
                self.cancel_pending_shutdown() # 取消关机

        except Exception as e:
            print(f"查询电源状态时出错: {e}")
            # 出错时也应取消关机以防万一
            self.cancel_pending_shutdown()


    def start_message_loop(self):
        print("Windows 电源监听器已启动...")
        print("请插拔电源测试功能。按 Ctrl+C 退出。")
        # 初始检查一次状态
        self.check_and_print_status()
        try:
            while True:
                pythoncom.PumpWaitingMessages()
                win32api.Sleep(5000) # 每5秒处理一次消息队列

        except KeyboardInterrupt:
            print("\n收到退出指令,正在关闭...")
        finally:
            self.cancel_pending_shutdown() # 确保退出时取消定时器
            win32gui.DestroyWindow(self.hwnd)
            print("监听器已关闭。")

# 编译
# pyinstaller --noconfirm --onefile --hidden-import=win32timezone powerOffShutDown.py
if __name__ == "__main__":
    listener = PowerListenerWindow()
    listener.start_message_loop()
]]>
<![CDATA[将bat脚本设置成windows服务]]> https://blog.iletter.top/archives/502/ 2025-12-02T13:46:29+08:00 2025-12-02T13:46:29+08:00 DelLevin https://blog.iletter.top 步骤 1: 下载 NSSM

访问 NSSM 官方网站:http://nssm.cc/download
下载适用于你系统架构(通常是 64-bit x64)的最新版本。
解压下载的 ZIP 文件。你会得到一个包含 nssm.exe 的文件夹(例如 win64 文件夹里有 nssm.exe)。

步骤 2: 将 NSSM 添加到系统 PATH

为了在任何地方都能使用 nssm 命令,建议将其路径添加到系统的环境变量 PATH 中。

打开“控制面板” -> “系统和安全” -> “系统” -> “高级系统设置”。点击“环境变量”。在“系统变量”或“用户变量”中找到 Path,选中它并点击“编辑”。点击“新建”,然后粘贴你解压出来的 nssm.exe 所在的完整目录路径(例如 D:\tools\nssm-2.24\win64)。

请务必将路径修改为你实际解压的路径。点击“确定”保存所有更改。关闭并重新打开命令提示符窗口,以使 PATH 变更生效。

步骤 3: 使用 NSSM 创建服务

以管理员身份 打开命令提示符 (CMD) 或 PowerShell。
输入以下命令来启动 NSSM 的图形安装界面:

nssm install frp_client_service

(frp_client_service 是你将要创建的服务名称,你可以根据需要修改,但不能包含空格)。

在弹出的 NSSM 配置窗口中:

Path: 浏览并选择你的 start.bat 文件路径:D:\appStable\frp-client\start.bat。

Startup directory: 自动填充为 .bat 文件所在的目录,即 D:\appStable\frp-client。请确认此目录正确。这是程序运行时的工作目录。

Arguments: 如果你的 start.bat 脚本需要额外的命令行参数,可以在这里填写。通常 .bat 文件不需要在此处添加参数。

其他选项卡(如 Details, Log on, Dependencies, Process, Shutdown, Exit actions, I/O Priority)可以根据需要进行配置,但对于大多数情况,默认设置即可。

Details: 可以给服务起个易读的显示名称(Display name),比如 "FRP Client",以及描述(Description)。
Log on: 默认是使用本地系统账户,通常足够了。

I/O Priority: 如果担心性能,可以将优先级设为 Normal。
确认所有信息无误后,点击 Install service 按钮。

步骤 4: 启动并测试服务

可以通过 NSSM GUI 来管理服务:

nssm edit frp_client_service  # 编辑服务
nssm start frp_client_service # 启动服务
nssm stop frp_client_service  # 停止服务
nssm remove frp_client_service # 删除服务

或者使用 Windows 内置的 服务管理器:

按 Win + R 键,输入 services.msc 并回车。

在服务列表中找到你刚刚创建的服务(名称是你在 NSSM 中指定的 Display name 或服务名 frp_client_service)。

右键单击该服务,选择“启动”。

检查状态是否变为“正在运行”。

步骤 5: 设置开机自启

在 Windows 的 服务管理器 (services.msc) 中,找到你的 frp_client_service 服务。

右键单击该服务,选择“属性”。

在“常规”选项卡下,将“启动类型”设置为 自动。

点击“应用”和“确定”。

现在,这个 FRP 客户端就会作为 Windows 服务运行,并且在系统开机时自动启动了。

]]>
<![CDATA[pycharm远程开发]]> https://blog.iletter.top/archives/501/ 2025-11-06T22:18:00+08:00 2025-11-06T22:18:00+08:00 DelLevin https://blog.iletter.top 首先创建新的ssh项目

2025-11-06T14:03:42.png

填写相关参数

2025-11-06T14:04:29.png

这里需要上传linux的安装包,因为下载的话一直失败无法下载成功,我们选择上传和上传路径
2025-11-06T14:05:26.png

pycharm地址:https://www.jetbrains.com/zh-cn/pycharm/download/other.html

破解文件下载地址:ja-netfilter-2025.3.0.zip

弄完之后,会让你填写远程pycharm的验证,在这之前退出一下我们需要填写编辑一下文件

vim pycharm64.vmoptions

里面填写关于破解文件的相关信息

-Xms256m
-Xmx2048m
-XX:ReservedCodeCacheSize=512m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:CICompilerCount=2
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:+IgnoreUnrecognizedVMOptions
-XX:CompileCommand=exclude,com/intellij/openapi/vfs/impl/FilePartNodeRoot,trieDescend
-ea
-Dsun.io.useCanonCaches=false
-Dsun.java2d.metal=true
-Djbr.catch.SIGABRT=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-Djdk.attach.allowAttachSelf=true
-Djdk.module.illegalAccess.silent=true
-Dkotlinx.coroutines.debug=off
-Dide.show.tips.on.startup.default.value=false
-Dsun.tools.attach.tmp.only=true
-Dawt.lock.fair=true
-javaagent:/root/ja-netfilter/ja-netfilter.jar
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED

之后再次打开pycharm远程,填写激活码

6ZLWI4KV9Y-eyJsaWNlbnNlSWQiOiI2WkxXSTRLVjlZIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvwrdjb20iLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSU0MiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSRCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTRiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNWIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQU0kiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUENXTVAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiQUlMIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUyIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiRFAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUERCIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9XSwibWV0YWRhdGEiOiIwNDIwMjUxMDI0UFBBTTAwMDAwNUEwMDAwMDBYQyIsImhhc2giOiI3NTkxODgyNy8wOjEzODU1MTE2NSIsImdyYWNlUGVyaW9kRGF5cyI6NywiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJ0cmlhbCI6ZmFsc2UsImFpQWxsb3dlZCI6dHJ1ZX0=-jEJB+XsDL603fDEvkpWiZmuv+g4j7nLQ2jwzghoDP8KuxfCXLPG6LFK4C00mUzUX23i+T9XB9hAp83icdF+YuVESTTbPPxLQVCzk2uIskO8s/g4BZacTQD5IsHVDjRmv5HWtuakqNVUzbatF+yc0ut58PfrPsnKMrp1yFBQEvw3Ch1gghbm85UsTQ4zW2C05QSQDrLSlQB4M/cZ6OTI22NtPSrfJxyfdUhVEnQQqO6uQqrqa7CX8ZuC+ZKsap4tnaXmHG4hfUlZdO7PTlZfV20n9mtJxZSftqZUgeJzreporG7C2bX1mIDlkAECzkMU5gmJzlUQ6499xz2O2Upx7Wg==-MIIETDCCAjSgAwIBAgIBETANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTI0MDkyMDEyMTEyN1oXDTI2MDkyMjEyMTEyN1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyNDA5MjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7SH/XcUoMwkDi8JJPzXWWHWFdOZdrP2Dqkz2W8iUi650cwz2vdPEd0tMzosLAj7ifkFEHUyiuEcL//q9d9Op7ZsV23lpPXX8tFMLFwugoQ9D8jDLT/XP9pp/YukWkKF5jpNbaCvsVQkDdYkArBkYvhH3aN4v9BkEsXahfgLLOPe4IG2FDJNf9R4to9V1vt+m2UVJB0zV4a/sVMKUZLgqKmKKKOKoLrE3OjBlZlb+Q0z2N5dsW0hDEVRFGmBUAbHN/mp44MMMvEIFKfoLIGpgic92P2O6uFh75PI7mcultL6yuR48ajErx8CjjQEGOSnoq/8hD+yVE+6GW2gJa2CPvAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUb5NERj05GyNerQ/Mjm9XH8HXtLIwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBALq6VfVUjmPI3N/w0RYoPGFYUieCfRO0zVvD1VYHDWsN3F9buVsdudhxEsUb8t7qZPkDKTOB6DB+apgt2ZdKwok8S0pwifwLfjHAhO3b+LUQaz/VmKQW8gTOS5kTVcpM0BY7UPF8cRBqxMsdUfm5ejYk93lBRPBAqntznDY+DNc9aXOldFiACyutB1/AIh7ikUYPbpEIPZirPdAahroVvfp2tr4BHgCrk9z0dVi0tk8AHE5t7Vk4OOaQRJzy3lST4Vv6Mc0+0z8lNa+Sc3SVL8CrRtnTAs7YpD4fpI5AFDtchNrgFalX+BZ9GLu4FDsshVI4neqV5Jd5zwWPnwRuKLxsCO/PB6wiBKzdapQBG+P9z74dQ0junol+tqxd7vUV/MFsR3VwVMTndyapIS+fMoe+ZR5g+y44R8C7fXyVE/geg+JXQKvRwS0C5UpnS5FcGk+61b0e4U7pwO20RlwhEFHLSaP61p2TaVGo/TQtT/fWmrtV+HegAv9P3X3Se+xIVtJzQsk8QrB/w52IB3FKiAKl/KRn1egbMIs4uoNAkqNZ9Ih2P1NpiQnONFmkiAgeynJ+0FPykKdJQbV3Mx44jkaHIif4aFReTsYX1WUBNu/QerZRjn4FVSHRaZPSR5Oi82Wz0Nj7IY9ocTpLnXFrqkb/Kt3S6B9s2Kol3Lr1ElYA

这一步可能会提示

This license xxxx has been suspended

可以设置一下代理就可以了

2025-11-06T14:15:15.png

]]>
<![CDATA[wireguard组网搭建windows远程桌面可用但是无法ssh]]> https://blog.iletter.top/archives/471/ 2025-10-22T15:33:00+08:00 2025-10-22T15:33:00+08:00 DelLevin https://blog.iletter.top 因为wireguard搭建的组网是public的。所以但是open ssh允许的是私有网络的。

所以在此需要改一下网络类型。

Set-NetConnectionProfile -InterfaceAlias "winServer2025" -NetworkCategory Private

winServer2025为我的配置文件名称,你可以根据你的去变更

变更完毕之后通过 Get-NetConnectionProfile 进行查看。此时在进行ssh链接即可成功。

其实还有一种方式就是直接关闭防火墙简单暴力。。。

]]>
<![CDATA[开机显示windows无法完成安装,解决方法]]> https://blog.iletter.top/archives/470/ 2025-10-21T21:41:00+08:00 2025-10-21T21:41:00+08:00 DelLevin https://blog.iletter.top 1.等待报错出现

2.按住shift+F10 进入cmd界面

3.输入regedit编辑注册表

4.找到路径 计算机\HKEY_LOCAL_MACHINE\SYSTEM\Setup

5.编辑内部数据

  • OOBEInProgress 设置为 0
  • CmdLine 设置为空,即删除里面的数据
  • SetupPhase 设置为 0
  • SetupType 设置为 0
  • SystemSetupInProgress 设置为 0

6.再次打开 cmd 窗口 输入以下命令行
net user administrator /active:yes

然后重启系统即可正常进入系统。

]]>
<![CDATA[windows server 2019 docker安装]]> https://blog.iletter.top/archives/365/ 2025-07-14T17:11:31+08:00 2025-07-14T17:11:31+08:00 DelLevin https://blog.iletter.top windows server 2019 docker安装

最近把家里的旧服务器搬到出租屋里面来了,准备当服务器用来着,二十年前的老机器了。想着用微信hook的功能,所以选择的windows server。配置好一些环境之后开始配置docker环境除了一些问题。

启用Hyper-V和Containers功能

运行管理员权限powershell
Install-WindowsFeature -Name Hyper-V,Containers -IncludeAllSubFeature -IncludeManagementTools -Verbose

配置安装源

Install-Module -Name DockerMsftProvider -Repository PSGallery -Verbose

安装Docker

运行管理员权限powershell,国内安装可能会因为网络原因失败,可以尝试手动安装,如果按照成功这下面步骤不用进行了
Install-Package -Name docker -ProviderName DockerMsftProvider -Verbose

下载文件

PS C:\Users\Administrator\Desktop> Invoke-WebRequest -UseBasicParsing -OutFile D:\docker-28.3.2.zip https://download.docker.com/win/static/stable/x86_64/docker-28.3.2.zip

文件下载地址

https://download.docker.com/win/static/stable/x86_64/

配置系统环境变量Path

注册为系统服务

dockerd --register-service -H npipe:// -H tcp://0.0.0.0:2375 --config-file "D:\Env\docker\config\daemon.json"

配置文件内容

D:\Env\docker\config\daemon.json

{
  "dns": ["114.114.114.114", "8.8.8.8"],
  "data-root":  "D:\\Env\\docker\\data",
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

其他命令

设置Docker开机启动

Set-Service -Name docker -StartupType Automatic

启动 Docker 服务

Start-Service docker

重启 Docker 服务

Restart-Service Docker -Force

停止 Docker 服务

Stop-Service Docker

docker-compose下载

https://github.com/docker/compose/releases

1.下载适用于 Windows 的 docker-compose-Windows-x86_64.exe 文件。

2.将文件重命名为 docker-compose.exe 并移动到 Docker 安装目录(如 D:\Env\docker)

ps:安装完了我才发现,windows server 2019的docker不支持linux的容器,要想弄,还要一个wsl支持,或者升级机器配置。想想还是算了,直接换ubuntu 的server版了

]]>
<![CDATA[微信hook消息接收]]> https://blog.iletter.top/archives/356/ 2025-03-09T23:36:00+08:00 2025-03-09T23:36:00+08:00 DelLevin https://blog.iletter.top 微信hook消息接收

微信版本:3.9.12.45

账号:两个微信账号,大号用来发消息,小号用来测试

工具:微信、CE修改器、x64dbg

微信版本

定位消息地址

选择微信进程

选择微信进程

大号给小号发送消息,扫描类型选择字符串,数值填写消息内容

发送消息

重复之上的步骤,不断重复,直到无法定位的时候(我这里有三个),一个个查看浏览器内存区域

请输入图片描述

找到带着wxid和xml格式的就是内存地址

请输入图片描述

请输入图片描述

x64dbg断点

记录一下当前的微信地址1B6555E11BD,关闭CE修改器,打开x64dbg,附加微信,按住alt+e选择wechatwin.dll

请输入图片描述

点进去,再内存窗口搜索刚才记录的地址

请输入图片描述

设置写入断点

请输入图片描述

此时微信大号给小号发送消息,查看堆栈信息

请输入图片描述

找到有个db的那个(这一步骤是再写入微信数据库之前定位call)

请输入图片描述

选择,右键“在反汇编中转到指定QWORD”

请输入图片描述

跳转之后,先取消上一个断点

请输入图片描述

然后针对跳转的位置,找到上一个call位置,在call处进行断点

请输入图片描述

发送消息,断点到了,查看RDI

请输入图片描述

请输入图片描述

在地址栏的第一个双击一下

请输入图片描述

这样我们可以得出

0x48 是 微信id

0x88 是 微信消息的内容

计算偏移

找到断点位置,复制文件偏移

请输入图片描述

然后打开计算器那个图标,用偏移地址+C00

请输入图片描述

得出结果250AEA7

验证结果

找到断点位置,复制地址

请输入图片描述

然后按住ALT+E,找到复制wechatwin.dll的基址

请输入图片描述

用计算器两者相减得出结果250AEA7

请输入图片描述

结果是对的,此时编写frida脚本

var wechatWin = Module.findBaseAddress("WeChatWin.dll");
if (!wechatWin) {
    console.error("WeChatWin.dll模块未找到!");
    throw new Error("模块未找到"); 
}
var hookAddress = wechatWin.add(0x250AEA7);
Interceptor.attach(hookAddress, {
    onEnter: function (args) {
        var timestamp = this.context.rdi.add(0x44).readInt();
        var wxid = this.context.rdi.add(0x48).readPointer().readUtf16String();
        var msg  = this.context.rdi.add(0x88).readPointer().readUtf16String();
        console.log("[++++] "+ timestamp +"    "+ wxid +"  :  "+msg)
    }
});

console.log("Hook已安装,等待接收消息...");

运行脚本
请输入图片描述

发送消息测试

请输入图片描述

]]>
<![CDATA[记-一次windows服务tomcat服务器ssl签发证书之路]]> https://blog.iletter.top/archives/325/ 2024-11-13T13:59:00+08:00 2024-11-13T13:59:00+08:00 DelLevin https://blog.iletter.top 操作记录:

certbot,用于申请ssl证书和自动续期
网站:https://certbot.eff.org

openssl,用于pem证书类型的转换
网站:https://slproweb.com/products/Win32OpenSSL.html

使用certbot申请ssl证书

certbot certonly --webroot -w D:\apache-tomcat-8.5.94\webapps\ROOT -d www.xxxx.com

生成路径:

Saving debug log to C:\Certbot\log\letsencrypt.log
Requesting a certificate for www.sdxyjq.com

Successfully received certificate.
Certificate is saved at: C:\Certbot\live\www.xxxx.com-0002\fullchain.pem
Key is saved at:         C:\Certbot\live\www.xxxx.com-0002\privkey.pem
This certificate expires on 2025-02-11.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

---

If you like Certbot, please consider supporting our work by:

* Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
* Donating to EFF:                    https://eff.org/donate-le

---

证书转换并导出到相应路径

openssl pkcs12 -export -out D:\apache-tomcat-8.5.94\conf\cert\www.xxxx.com.pfx  -inkey C:\Certbot\live\www.xxxx.com-0002\privkey.pem -in C:\Certbot\live\www.xxxx.com-0002\fullchain.pem -name tomcat

设置密码(默认使用原密码):xxxx

重启tomcat

D:\apache-tomcat-8.5.94\bin 路径内
关闭shutdown.bat

打开startup.bat

注意: 这里有个小tips,运行这俩bat的时候必须去那个bin路径下面运行,别整花活,什么快捷方式和命令行,这样会无法检查到那些东西的。。。这玩意只会检查当前运行目录下的东西。

自动续订脚本

创建文件renew_certificates.bat

@echo off
cd C:\Certbot
certbot renew >> C:\Users\Administrator\Desktop\续订日志.log 2>&1

配置windows任务

win+r输入taskschd.msc,打开任务并设置添加ssl自动续订的任务,在每月的1号检查并续订ssl

]]>
<![CDATA[Window10 安装软件时报错:Called RunScript when not marked in progress]]> https://blog.iletter.top/archives/170/ 2024-10-13T23:54:00+08:00 2024-10-13T23:54:00+08:00 DelLevin https://blog.iletter.top Window10 安装软件时报错:Called RunScript when not marked in progress

解决办法:

  1. 进入 C:\Windows
  2. 找到"temp"文件夹 ---- 右键“属性” --- “高级” --- “更改”
  3. 然后点击 “高级”


输入电脑当前用户的姓名,进行搜索

]]>
<![CDATA[windows搭建nginx服务并配置]]> https://blog.iletter.top/archives/174/ 2024-09-26T23:58:00+08:00 2024-09-26T23:58:00+08:00 DelLevin https://blog.iletter.top 下载直接去官网 nginx.org ,选择windows版本进行下载

下载完成后,放到服务器指定路径,并开启cmd窗口进行命令行格式的运行。

启动

start nginx

查看任务进程是否存在

tasklist /fi "imagename eq nginx.exe"

重新加载

nginx -s reload

快速停止

nginx -s stop

简单配置:

首先正常启动是80端口,如果是阿里云服务器需要去安全组放行端口。

再然后是443端口,这里如果需要用到多个的话,我建议是加一个 ‘/’ 用来区分端口例如如下配置


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }
    
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

   server {
        listen       443 ssl;
        server_name  47.121.199.144;

        ssl_certificate         C:/dev/nginx/nginx-1.26.2/nginx-1.26.2/443/certificate.crt;
        ssl_certificate_key     C:/dev/nginx/nginx-1.26.2/nginx-1.26.2/443/private.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location /8081/ {
            proxy_pass http://47.121.199.144:8081/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

其中这里的意思就是

 location /8081/ {
            proxy_pass http://47.121.199.144:8081/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

http://47.121.199.144:8081/这个网址指向https://47.121.199.144/8081/

注意:

1.在这里需要注意C:/dev/nginx/nginx-1.26.2/nginx-1.26.2/443/certificate.crt;的/ 是向右的。路径使用双反斜杠(\)或正斜杠(/)

2.在与zerossl.com交互的时候,涉及到地址验证的问题,其中需要创建.well-known文件夹,如果是简单的windows环境是无法创建的,会提示你“必须键入文件名”,这时候需要mkdir创建了,即mkdir .well-known

]]>