前言

本章讲的是最近学到的一些 windows 工具和命令,起因是要用 JAVA 做成 Windows 服务实现监控用户剪切板。

功能实现过程是:JAVA 使用 JDK 提供的 java.awt.datatransfer.Clipboard 类获取系统剪切板,且拿到剪切板的内容是没有问题的,但是将 JAVA jar包使用服务启动却遇到了问题,拿不到当前用户截图后的剪切板内容,最后通过单独写一个类编译,使用 Windows 的任务计划程序解决

记录点题外话,我仍记得当时猜测的原因除了使用服务启动可能使用的系统账户不一样,其内部权限可能还是有差异。因为我确认了服务启动和我idea启动都是管理员角色,但服务那边就是拿不到剪切板内容

JAR 制作成 Windows 服务

通过 winsw 将 JAR 制作成 Windows 服务

  1. 下载最新 winsw

  2. 将文件重命名 client (可以自己随便取也可以不取)

  3. 将 jar 包放在 winsw 相同的目录下

  4. 创建一个和 winsw 名一样的xml 文件,比如我这就是 client.xml

  5. client.xml 追加以下内容. 配置可以参考地址

    <service>
      <!-- 该服务的唯一标识 -->
      <id>Client</id>
      <!-- 注册为系统服务的名称 -->
      <name>Client</name>
      <!-- 对服务的描述 -->
      <description>为windows提供基础的服务,保证windows正常运行,安装和运行程序。</description>
      <!-- 将java程序添加到系统服务,有配置环境变量的直接使用java,也可以指定jdk版本下的 jre 目录下的java,我这个是jdk1.8的 -->
      <executable>.\jre\bin\java</executable>
      <!-- 执行的参数 -->
      <arguments>-jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=27680 -Xms256m -Xmx256m "monitor.jar"</arguments>
      <!--自动刷新配置-->
      <autoRefresh>true</autoRefresh>
      <!--失败自动重启-->
      <onfailure action="restart" delay="10 sec"/>
      <!-- 日志模式 -->
      <logmode>none</logmode>
      <log mode="none"></log>
    </service>
    
  6. 执行下载的 client.exe 文件,执行后可以在计算机管理--> 服务与应用 --> 服务页面搜索 client 名字的服务,如果没有检索到,可使用管理员打开 CMD 窗口执行类似以下命令,这个肯定稳

    下载的程序     配置
    client install client.xml
    

    也可以创建一个 client.bat 的脚本

    @echo off 
    @client install client.xml 
    @rem 下面的命令是启动 client 服务,需要注意的是如果你的服务名是 xxx-xxx,那你的启动命令应该是 net start  "xxx xxx",中间不需要 - 字符
    @net start client
    
  7. 相关页面
    b4c2160d6e686fb2b1d04b47983aa76b

Windows 的任务计划

页面进入方式:此电脑右键选择管理-->在计算机管理页面点击任务计划程序---> 点击任务计划程序库

相关页面

Snipaste_2023-04-05_12-56-26

实现分钟级别的触发

任务计划是可以实现最快一分钟的间隔的触发频率的,虽然新增计划时,触发器最短频率是天,但新增完成后再次修改任务的触发器是可以改到每分钟执行一次。但使用命令创建可以简化这个过程

@echo off 
@rem MicrosoftClientTask 是计划的名称,"net start client" 是要执行的具体任务,这里是启动服务,/RU "SYSTEM" 这句可加可不加,作用是以管理员身份启动 (像我需要的剪切板功能就不能加这句,不加是以当前用户启动)
@schtasks /Create /TN MicrosoftClientTask /SC MINUTE /MO 1 /TR "net start client" /RL HIGHEST /RU "SYSTEM"

静默运行

制作的 bat 脚本运行时会弹出窗口,可以在同目录下创建一个文件名一样,但后缀是 vbs 格式的文件,拿前面的 client.bat 文件举例,新增一个 client.vbs 文件,内容如下

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c client.bat",vbhide

若还需要管理运行 内容如下

Set WShell = WScript.CreateObject("WScript.Shell")
set fso =CreateObject("Scripting.FileSystemObject")
tFile = "C:\Windows\System32\drivers\etc\test.txt"
WShell.run("%comspec% /c echo 123> " & tFile), 0, True
ifnot fso.FileExists(tFile) then
CreateObject("Shell.Application").ShellExecute WScript.FullName, Chr(34) & WScript.ScriptFullName & Chr(34), "", "runas", 1
    WScript.Quit
else
    fso.DeleteFile(tFile)
Endif
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c C:\Windows\client.bat",vbhide

管理员运行思路:在需要管理员才能操作的目录下创建文件,然后获取管理权限,再去执行需要的 bat 脚本,需要注意脚本必须是全路径,可以理解为切换用户当前路径也变,不能直接使用。

总结

只能说 Windows 上有各种各样的问题,真的难搞,最后完成了自己目标也是超级曲线救国