2017年7月5日 星期三

AutoIt 執行外部程式進階應用

在前一篇AutoIt 執行外部程式 中介紹了AutoIt執行外部程式的方式,這篇再補充進階的應用,可以強化整個程式執行的方便性,在這一篇AutoIt 執行外部程式 中我們呼叫了外部程式pspasswd.exe,這個程式必須同時放在程式可以存取的地方,但是如果我們在企業中要佈署這個程式時有時侯這支工具程式不一定會放在每一台電腦中,可行的做法如下:
  • 將AutoIt編譯過的程式與pspasswd.exe 放在一起以壓縮軟體打包在一起後進行佈署
  • 將pspasswd.exe 程式事先佈署於每一台電腦以便AutoIt進行呼叫使用
其實AutoIt提供了一個Function 可以將檔案包含在編譯Au3檔案後的執行檔中,透過這個方式可以將所需要的檔案包在單一執行檔中點選執行時就可以將檔案解壓出來,這對執行外部程式有很大的幫助,也可以確保執行的程式放置的位置。
以下是執行將檔案Include 到AutoIt程式碼的Function,使用上也非常簡單,將要Include 的檔案設定為Source,執行程式後解壓的檔案為dest,這裡比較重要的是dest 的位置必須指定已存在的路徑,否則會失敗。

FileInstall ( "source", "dest" [, flag = 0] )

下面這段程式就是在此次範例的程式碼,檔案的原始路徑及程式執行後解壓的路徑,只要設定好即可將檔案Include 進來。

FileInstall("c:\temp\pspasswd.exe", @ScriptDir & "\pspasswd.exe")

編譯過程中有幾點必須注意的,當把其它程式或檔案Include 後會造成單一執行檔案的空間變大,因此在編譯時可以設定壓縮率,就和一般的壓縮軟體一樣,壓縮率高執行過程會比較慢,相對可以節省比較大的空間,反之在犧牲空間下可以加快執行的速度,另外可以勾選以UPX 壓縮方式可大幅縮小檔案容量與磁碟空間,加速網路下載。

image

範例:



#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=3
#AutoIt3Wrapper_UseUpx=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/07/05
Script Function: Script Demo
Description :呼叫外部程式的進階運用
Notes:http://pentiumto.blogspot.tw/


#ce ----------------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)



FileInstall("c:\temp\pspasswd.exe", @ScriptDir & "\pspasswd.exe")


Dim $sNewPassword = "NewPassword"


_ExecReset()


Func _ExecReset()


RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd" , "EulaAccepted", "REG_DWORD", "1")

Sleep(1000)

RunWait(@ComSpec & " /c " & "pspasswd.exe \\" & @ComputerName & " administrator " & $sNewPassword,@ScriptDir,@SW_HIDE)


EndFunc


2017年7月4日 星期二

AutoIt Windows GUI 程式開發(一)

完成安裝AutoIt 編輯程式後同時會安裝許多的好用工具,其中一個就是GUI設定工具,但是奇怪的時安裝完成後會不會建立執行連結到程式集中,所以必須自行點選到程式的安裝路徑。
若安裝過程中沒有特別選擇其它的路徑,他將會在C:\Program Files\AutoIt3\SciTE\Koda\FD.exe
執行程式後即可進行GUI的設計,程式啟動後分為5個區域,每個區域都可獨立搬動。
image
上方下拉功能表是程式的主要功能選項,並且可以選擇要加入的GUI物件,當然物件的數量不像Virtual Studio 來的多,但是足夠一般的應用。
image
左側是以樹狀顯示物件的清單,下方是物件的參數
image
若同時設計多個Form 則可在右側Form List 檢視及切換
image
中間的Form 即是GUI設計重要的畫布了,將想要呈現的畫面及物件在Form 裡擺設好,在未來程式執行時即依照擺放位置執行。
image

Koda 是AutoIt 的GUI設計程式,但是僅是做GUI畫面的設計,並不含程式碼的編輯,所完成的GUI程式碼還是要在原本的SciTE 編輯程式來做程式的開發,但是比起在SciTE編輯器中一行一行的撰寫GUI程式碼要來的方便快速,下一篇再來說明Koda 的使用方式。
image

2017年7月3日 星期一

AutoIt 執行外部程式

除了自已可以透過AutoIt語法寫出想要的功能,但是有時侯如果作業系統或已有現成的工具可以達到想要的目的。直接執行工具不失為一個省時省力的好方法,AutoIt 提供了蠻多執行外部程式的方式,Run()、RunWait()、RunAs()、RunAsWait()、ShellExecute()、ShellExecuteWait()等等,都可以執行外部程式或者自行撰寫的Batch File。
選擇那一種方式執行外部程式端看最終的目的,善用F1 可以獲得詳細的說明,這篇以RunWait()解說執行外部程式為範例,程式的目的是重置Windows 的管理者密碼,使用Sysinternals 所提供的PSPasswd.exe 工具,之後有機會會介紹一下Windows Sysinternals ,裡面提供了不少好用的工具,而且是微軟所提供,安全性及穗定性也較有保障。

 RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd" , "EulaAccepted", "REG_DWORD", "1")
這一段程式是預先同意程式License Agreement,避免執行程式跑出意外的視窗如下:

image

PsPasswd 提供修改密碼的功能,我們可以執行一次程式看看提供程式提供了那些參數,在此不額外贅述,請參考下方
image


RunWait(@ComSpec & " /c " & "pspasswd.exe \\" & @ComputerName & " administrator " & $sNewPassword,@ScriptDir,@SW_HIDE)

這一段程式是最主要的功能,使用RunWait()的功能是執行外部程式,並等待程式執行結束後回到原來的AutoIt 程序,如果使用Batch File 很難達到這一點,最好用的是加上@SW_HIDE 參數後可以達到背景執行,透過派送工具執行時一般使用者是沒有感覺的。


範例:



#cs -------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/07/03
Script Function: Script Demo
Description :呼叫外部程式的簡單運用
Notes:http://pentiumto.blogspot.tw/


#ce -------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)


Dim $sNewPassword = "NewPassword"


_ExecReset()


Func _ExecReset()


RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd" , "EulaAccepted", "REG_DWORD", "1")

Sleep(1000)

RunWait(@ComSpec & " /c " & "pspasswd.exe \\" & @ComputerName & " administrator " & $sNewPassword,@ScriptDir,@SW_HIDE)


EndFunc


2017年6月28日 星期三

AutoIt 建立彷Windows 更新程式訊息功能

一般使用Windows Update 更新後會顯示提示重新開機訊息,若是佈署非Windows 更新程式,又想要讓使用者可以自訂安裝的時間,只能自已動手寫了,AutoIt除了可以撰寫一般的程序碼,也可以撰寫Windows GUI程式,以下是使用GUI彷Windows 更新後提示重新啟動及延時安裝的功能。
Dim $sSoftName = "Java8 Update"
  ==>定義顯示畫面的訊息,本例為安裝Java8 Update 的訊息

Case $Button1
     MsgBox(4096, "Software Install", "Install Beging")

  ==> 在Case $Button1 中定義時間內點選立即安裝時所要執行的程序,當然你可以自訂啟動執行安裝程式

Case $Button2
              $sComboRead = GUICtrlRead($Combo1)
            If $sComboRead ="10 分" Then
                GUISetState(@SW_HIDE)
                Sleep(600000)
                GUISetState(@SW_SHOW)
            ElseIf $sComboRead ="1 小時" Then
                GUISetState(@SW_HIDE)
                Sleep(3600000)
                GUISetState(@SW_SHOW)
            ElseIf $sComboRead ="4 小時" Then
                GUISetState(@SW_HIDE)
                Sleep(14400000)
                GUISetState(@SW_SHOW)
            EndIf

==>Case $Button2 中訂義下拉選項程式等待安裝的時間,例如我點選10分後,畫面會隱藏600000 毫秒,其它1小時、4小時依此類推,只要訂義好時間畫面會隱藏,這樣就可以達到由使用者自訂安裝的時間,彈性佈署。

範例:



#cs ----------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/06/16
Script Function: Script Demo
Description :彷Windows更新重啟訊息
Notes:http://pentiumto.blogspot.tw/


#ce -----------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)



#include
#include
#include
#include
#include
#include

; Display the tray icon.
Opt("TrayIconHide", 1)


Dim $sSoftName = "Java8 Update"


#Region ### START Koda GUI section ### Form=AlarmInfo.kxf
$Form1 = GUICreate("SoftWare Update", 600, 212, 229, 500,$WS_CAPTION)
$Label1 = GUICtrlCreateLabel( $sSoftName &" 軟體派送更新,請將您的文件儲存", 8, 16, 600, 28)
GUICtrlSetFont(-1, 18, 800, 0, "標楷體")
GUICtrlSetColor(-1, 0x0000FF)
$Icon1 = GUICtrlCreateIcon("D:\icon\Leopard_ico\ico\AppleScript Utility.ico", -1, 8, 112, 48, 48)
$Group1 = GUICtrlCreateGroup("執行選項", 172, 112, 369, 89)
$Combo1 = GUICtrlCreateCombo("請選擇", 372, 136, 153, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "10 分|1 小時|4 小時")
GUICtrlSetFont(-1, 10, 800, 0, "標楷體")
$Button1 = GUICtrlCreateButton("立即安裝", 268, 165, 121, 33)
GUICtrlSetFont(-1, 12, 800, 0, "標楷體")
$Button2 = GUICtrlCreateButton("延期", 420, 164, 105, 33)
GUICtrlSetFont(-1, 12, 800, 0, "標楷體")
$Label2 = GUICtrlCreateLabel("過了下列時間後提醒我:", 180, 136, 191, 20)
GUICtrlSetFont(-1, 12, 800, 0, "標楷體")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label3 = GUICtrlCreateLabel("程式更新過程中有可能造成不可預期的錯誤,為避免資料遺失,"& @CRLF &"請務必儲存您的檔案後,再進行安裝", 8, 48, 884, 63)
GUICtrlSetFont(-1, 14, 400, 0, "標楷體")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


Local $sComboRead = ""



While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Combo1
$sComboRead = GUICtrlRead($Combo1)
; MsgBox($MB_SYSTEMMODAL, "", "The combobox is currently displaying: " & $sComboRead, 0, $Form1)
Case $Button1

MsgBox(4096, "Software Install", "Install Beging")

Case $Button2

$sComboRead = GUICtrlRead($Combo1)
If $sComboRead ="10 分" Then

GUISetState(@SW_HIDE)
Sleep(600000)
GUISetState(@SW_SHOW)

ElseIf $sComboRead ="1 小時" Then
GUISetState(@SW_HIDE)
Sleep(3600000)
GUISetState(@SW_SHOW)

ElseIf $sComboRead ="4 小時" Then
GUISetState(@SW_HIDE)
Sleep(14400000)
GUISetState(@SW_SHOW)

EndIf


EndSwitch
WEnd





執行結果:
image
image

2017年6月22日 星期四

AutoIt 修復Windows WMI

Windows 內的WMI服務提供了不少好用的指令,若是企業中有導入SCCM (Microsoft System Center Configuration Manager )可參考以下 System Center Configuration Manager Overview 連結說明,在這就不多介紹了。
講了這麼多為什麼要修復WMI 呢?因為在企業中SCCM 的Client 安裝到Windows 系統後若WMI服務有問題,將造成SCCM Client 功能異常,這個時侯就需要進行WMI 的修復,以下是透過AutoIt 的程式碼進行修復。

範例:


Func WmiFix()


RunWait(@ComSpec & " /c " & 'sc config winmgmt start= disabled', "", @SW_HIDE)

Sleep(2000)


RunWait(@ComSpec & " /c " & 'net stop winmgmt /y', "", @SW_HIDE)

Sleep(2000)


DirMove("C:\WINDOWS\system32\wbem\Repository","C:\WINDOWS\system32\wbem\Repository.bak",1 )


Sleep(2000)

RunWait(@ComSpec & " /c " & 'sc config winmgmt start= auto', "", @SW_HIDE)

Sleep(3000)


EndFunc


2017年6月18日 星期日

AutoIt 軟體自動化安裝

在企業的環境中常常有需要自動化佈署軟體的需求,AutIt可以讓佈署更加便利且自動化,以下是介紹軟體佈署的做法:
程式碼的運作可以定義要執行軟體的數量並且一個接一個依序執行,這裡以安裝Windows 的修正程式為例。語法中   Global $sExecPath[2]   本行定義增加增加執行多少程式,本例為2個,若有多個程式要執行只要增加數字就可以了,本例程式碼是陣例的應用。
以下程式碼定義要執行的程式名稱及參數,要注意的是要佈署的程式和AutoIt程式要放在一起,若放在不同的路徑要定義清楚否則就會失敗。因為要透過自動化佈署所以參數要定義為自動且靜默( Silent install )

以下是要安裝的程式碼:

$sExecPath[0] = @ScriptDir & "wusa.exe X86-all-windows6.1-kb3170455-x86.msu" &" /log /quiet /norestart"
$sExecPath[1] = @ScriptDir & "wusa.exe Windows6.1-KB3192403-x86.msu" &" /log /quiet /promptrestart"



範例:




#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/06/16
Script Function: Script Demo
Description :陣列的簡單運用於軟體佈署
Notes:http://pentiumto.blogspot.tw/


#ce ----------------------------------------------------------------------------


#include


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 1) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

;指定要執行的程式數量,並提供執行路徑

Global $sExecPath[2]

$sExecPath[0] = @ScriptDir & "wusa.exe X86-all-windows6.1-kb3170455-x86.msu" &" /log /quiet /norestart"
$sExecPath[1] = @ScriptDir & "wusa.exe Windows6.1-KB3192403-x86.msu" &" /log /quiet /promptrestart"




ExecuteMe() ;啟動程式


Func ExecuteMe()


For $element In $sExecPath
Sleep(2000)
ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " " &$element&@CRLF)


Local $iPID = RunWait(@ComSpec & " /c " & $element, @ScriptDir, @SW_MINIMIZE )

ProcessWaitClose($iPID)

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " " & $iPID&@CRLF)
Next


EndFunc







2017年6月16日 星期五

AutoIt 建立本機帳號並設定管理者群組中

在方便自動化作業,常常有需要在Windows 中建立帳號,並且設定好權限,以下用一段簡單的程式碼建立一個帳號,並將帳號加入到本機的管理者群組中

範例:


#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/06/16
Script Function: Script Demo
Description :建立本機帳號並設定管理者群組中
Notes:http://pentiumto.blogspot.tw/


#ce ----------------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

; ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)



Dim $NewUser = "Admin" ;This is the User account to be created
Dim $Newpass = "Admin@password" ;This is were you enter the password you want for this account
Dim $Comment = "Windows Account Create Demo" ;This is a discription of the account that is added to the windows. Optional - leave blank for nothing to be entered
Dim $FName = "Admin" ;This is the Full name section of the account. Optional - leave blank for nothing to be entered



CreateUser()



Func CreateUser()

RunWait('net user '& $Newuser & ' ' & $Newpass & ' /add /fullname:"' & $FName & '" /comment:"' & $comment & '"', '', @SW_MAXIMIZE)

RunWait('net user '& $Newuser & ' /EXPIRES:never', '', @SW_HIDE)

RunWait('net localgroup users ' & $Newuser & ' /delete', '', @SW_HIDE)

RunWait('net localgroup Administrators ' & $Newuser & ' /add', '', @SW_HIDE)

RunWait('net accounts /maxpwage:unlimited', '', @SW_HIDE)


EndFunc





執行結果:

image
image

AutoIt Function 功能

為了讓你在開發AutoIt程式有效重覆運用程式碼,Function 的運用可以讓你快速開發AutoIt程式,以是介紹使用的方式:
一般的Function 直接將程式碼寫在 Func......EndFunc 之中 同時必須為Function 命名這樣程式才可以呼叫使用 如下,Function 的名稱為 FirstFunction() 在呼叫Function  時有一點要注意必須在Function 之前執行時要加上「()」括號

FirstFunction()     ;呼叫Function
Func FirstFunction()

…程式碼寫在這之間

EndFunc

範例:


#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: 奔騰兔開發誌
Date : 2017/06/16
Script Function: Script Demo
Description :Function 簡單運用
Notes:http://pentiumto.blogspot.tw/


#ce ----------------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

FirstFunction() ;呼叫Function

Func FirstFunction()

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 一般 Function 簡單運用 "&@CRLF)

EndFunc






執行結果:
image

2017年6月15日 星期四

AutoIt 開發範本

為了讓AutoIt 開發的程式後續的維護及讓未來接手維護的人能夠好維護,建議在開發的過程建立標準的範本,就是Templete ,在這裡分享我自已開發過程中使用的範本,當然在這機年開發AutoIt的過程中也參考了網路上許多先進的程式,給同樣使用AutoIt的同好參考囉。





#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.14.2
Author: XXXX XXXX
Date : 2017/06/15
Script Function: AutoIT Script Templete
Description :
Notes:


#ce ----------------------------------------------------------------------------


Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon

Dim $sNowtime=@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN

ConsoleWrite($sNowtime & " [Info] " & @ScriptLineNumber & " 自訂訊息可以在開發過程除錯 "&@CRLF)




執行結果:


在開發工具下方的Debug 視窗可以透過ConsoleWrite() 寫出訊息並且可以得知是那一行,在開發的過程中非常好用。
image

2017年6月7日 星期三

ListView 資料存取設計

完成ListView 的資料Bind 後可依取得的資料進行後續的設計
image

在ListView的ItemDataBound 事件中取得ListView 的資料後進行資料處理
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        //使用ItemDataBound事件中找到ListView 的資料ID="UnitsInStockLabel"的值,並且
        //依傳回的值進行判斷,小於10修改ForeColor 為紅色,其它為綠色

        Label lb = (Label)e.Item.FindControl("UnitsInStockLabel");
        if (int.Parse(lb.Text) < 10)
        {
            lb.ForeColor = System.Drawing.Color.Red;
        }
        else
        {
            lb.ForeColor = System.Drawing.Color.Green;
        }
    }
結果:
根據不同的值顯示出紅色或綠色
image