[记录] 使用AutoIT脚本自动添加远程打印机并配置验证账户

公司使用打印系统记录每一个部门的打印量并计算费用(租赁打印机),域内计算机很好办,使用登陆账户就好了,但是非域内计算机就麻烦了,整个配置步骤过多,对来宾打印用户并不友好,虽然用的可能不多,但是体验真不好,所以想到了用AutoIT脚本的方式简化安装配置过程。

脚本写完后在理想的环境下安装一般没有太大问题,但存在一定的几率失败,因为没有太抠细节,也没怎么做错误验证,有些操作脚本没法做,或者做起来太麻烦,投入产出比不合实际。由于是第一次使用AutoIT写脚本,这里记录一些关键点用来回顾。

脚本流程如下:

  1. 检测本地系统语言和版本
  2. 检测与服务器之间的连接
  3. 建立本地与打印服务器的连接(服务器需验证)
  4. 添加远程打印机到本地
  5. 打开打印机设置选项
  6. 使用AutoIT窗口管理模拟人为操作配置打印账户
  7. 断开与服务器的连接

把这些操作换成手工操作,步骤超过15步,而且涉及到两个账户密码,让终端用户来设置可不会那么顺利

Windwos系统本身特性对脚本的影响

  • 系统语言不同,窗口的标题自然不同,AutoIT会用到窗口的标题进行窗口识别,需要设置变量进行处理,同时需要提供不同语言的GUI界面
  • 系统版本不同,系统内置应用的标题也会不同,同样需要单独设置。比如PowerShell窗口,用绝对路径启动,在Win7下窗口标题显示绝对路径,但在Win10下显示”Windows PowerShell”

AutoIT内置了宏来获取系统信息,比如语言 @OSLang, 系统版本@OSVersion

使用Windows系统本身的功能

对AutoIT并不算熟悉,只是借这次机会终于浏览了一遍官方的手册,不在乎手段,只看结果,用了本来就会的一点Windows技能

  • 建立带验证的连接,第一个想到的就是 IPC$ 通道 net use \\PrinterServer\IPC$ /user:Username Password ,挻好用的
  • 断开连接:net use /delete \\PrinterServer\IPC$
  • 连接安装远程打印机,一开始用的是printui,但是存一些问题,尤其是会有额外的安装窗口弹出,对AutoIT来说,每多一个窗口就多一道复杂性,所以找来了Powershell命令,拿过来用了,也挻好用。。。
    • 添加打印机:(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection(“\\Printerserver\Printer”)
    • 删除打印机:(New-Object -ComObject WScript.Network).RemovePrinterConnection(“\\Printerserver\Printer”)
  • 打开打印机首选项,还是用到了PrintUI,运行 rundll32 printui.dll,PrintUIEntry /e /n ” \\Printerserver\Printer”

AutoIT窗口管理的一些坑

使用AutoIT创建GUI获取打印账户密码还是简单的,只要有编程基础就不会出什么问题。按需查阅官方文档就够了,问题出现在窗口管理这里。

  • 首先是窗口是否按预期的那样出现,用WinWait(),指定超时时间,我没有做超时后没出现该怎么做,只是把超时调的长点,不想做…
  • 必须用到WinWAitClose(), 操作窗口是需要时间的,必需等操作完了生效了才能进行下一步(这里的实例指当前操作窗口被关闭),尤其是运行慢的电脑,超时调长点没错,这点很重要,因为是用脚本操纵其它程序窗口,需要等待,除非用API获取被操作程序的状态😂
  • 窗口控件的ID是会“变“的,准确来说是在我这个实例中,使用PrintUI打开的打印首选项和手工点开的打印首选项窗口里面的控件ID是不一样的,可能因为获取到的是远程机器上的选项而不是本地的
  • 在最终版前,不要隐藏窗口,出了问题调试起来麻烦

其它要记的

AutoIT中怎么运行Powershell命令

  • $PSEXE = “C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -command “
  • $PSCmd = ’ (New-Object -ComObject WScript.Network).RemovePrinterConnection(“\\Printerserver\Printer”) ‘
  • Run( $PSEXE & $PSCmd)

字符串中有引号怎么处理

可以像上面一样,内部用双引号,外部用单引号,事实上我反过来也是可以的,尤其注意的是在用 & 连接变量的时候别搞错了,在什么地方需要放引号弄清楚

参考&相关链接

  • PrintUIEntry: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/rundll32-printui
  • Powershell 使用打印机:https://docs.microsoft.com/zh-cn/powershell/scripting/samples/working-with-printers?view=powershell-6
  • AutoIT中文手册:https://www.jb51.net/shouce/autoit3/
  • AutoIT官网:https://www.autoitscript.com/site/autoit/
  • GuiHub: https://github.com/yywr/InstallGuestPrintByAutoitscript

Leave a Reply

Your email address will not be published. Required fields are marked *