公司使用打印系统记录每一个部门的打印量并计算费用(租赁打印机),域内计算机很好办,使用登陆账户就好了,但是非域内计算机就麻烦了,整个配置步骤过多,对来宾打印用户并不友好,虽然用的可能不多,但是体验真不好,所以想到了用AutoIT脚本的方式简化安装配置过程。
脚本写完后在理想的环境下安装一般没有太大问题,但存在一定的几率失败,因为没有太抠细节,也没怎么做错误验证,有些操作脚本没法做,或者做起来太麻烦,投入产出比不合实际。由于是第一次使用AutoIT写脚本,这里记录一些关键点用来回顾。
脚本流程如下:
- 检测本地系统语言和版本
- 检测与服务器之间的连接
- 建立本地与打印服务器的连接(服务器需验证)
- 添加远程打印机到本地
- 打开打印机设置选项
- 使用AutoIT窗口管理模拟人为操作配置打印账户
- 断开与服务器的连接
把这些操作换成手工操作,步骤超过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