Powershell caps lock state change 引起名稱 密碼錯誤

http://wp.me/ph3BR-1ig

有人回報說, 登入 VPN 的連線常常不成功, 看了一下, 原來 VPN 的登入帳號密碼是必須區分大小寫的, 在 script  裡面已經輸入成為大小寫混合的文字, 但是執行過程裡面, 顯示卻是全部大寫字母, 難怪登入名稱密碼都報錯.

源碼的片段,


#IP address or host name of cisco vpn
[string]$CiscoVPNHost = "1.2.3.4"
[string]$Login = "userNAME"
[string]$Password = "password_1234ABCD"

....

#Write login and password
[System.Windows.Forms.SendKeys]::SendWait(“$Login{Enter}”)
[System.Windows.Forms.SendKeys]::SendWait(“$Password{Enter}”)

. .

明明要求大小寫, 顯示卻是全部大寫字母輸入, 問題在哪裡呢 !? 原來某些人喜歡把鍵盤設定成輸入全為大寫字母, 意思就是按一下鍵盤上面 [Caps lock] 的那個鍵, 鎖定在大寫輸入 (再按一次, 就回到小寫輸入, 老外稱為 toggle key). 另外, 如果發現大小寫的指示燈是壞的, 那麼使用者除了敲鍵盤鍵檢視以外, 是沒有辦法確認輸入大小寫的狀態. 這兩種情形, 都會讓鍵盤可在輸入英文大寫字母的狀態而使用者不以為意 (中文輸入狀態還沒研究有否其他影響), 但是 SendKeys 這個方法, 只是用程序自動輸入, 模擬有人在敲鍵盤輸入的動作, 所以, 一旦大寫輸入狀態設定, 就會全部變成大寫字母, 密碼和帳號當然被判斷為錯誤, 這是問題. 那解決方案呢 ?! 可要求使用者先檢查鍵盤狀態再啟動, 但保證有更多的問題和埋怨, 這只能是應變方法. 所以要用真正解決問題的方案, 找一下網路, 就抄回來試驗, 不過, 原作的 powershell script 只能在 Powershell 裡面執行, 想要點 BAT 讓她自動化, 還是需要自己改一下. 以下實驗, 目的是檢查鍵盤的大小寫輸入狀態, 有了這樣的基礎後, 再去修改 VPN 登入的 script, 應該就可以避免使用者預設鍵盤大小寫習慣的影響.

.

.

檔案名稱 hello.bat, 內容如下, 存檔後點兩下就會執行, 但是一定要存到 D:\hello.bat


@echo off

@echo Powershell script, run at command line level, use batch file to invoke
@echo Xiaolaba, 2014-07-17
@echo.
@echo 1) To display hello world message
@echo 2) To show keyboard status with caplock / scrolllock / numlock

powershell.exe "D:\hello.ps1"

@echo.
pause

.

.

檔案名稱 hello.ps1, 內容如下,

但是一定要存到 D:\hello.ps1 (檔俺名稱後綴是 P,S 和 數字1, 不是 L,  不是 i, 清楚了嗎)


# reference : http://technet.microsoft.com/en-us/library/bb963733.aspx

#modified, xiaolaba, 2014-07-17
# Filename: Hello.ps1
Write-Host
Write-Host 'Hello Xiaolaba, keyboard status key checking !'
Write-Host "Good-bye Xiaolaba ! `n"
# end of hello script

#2014-07-17, xiaolaba, debug purpose, time stamp display
#REF: http://technet.microsoft.com/en-us/library/ff730960.aspx
#REF: http://technet.microsoft.com/en-us/library/ee692801.aspx
$a = Get-Date -Format "yyyy-MM-d HH:MM:s"
"Time is: " + $a

# 2014-07-17, xiaolaba, include this section,
# ensure this script can be invoked at dosbox or double click to file of hello.bat

########################################################
#To check keyboard, caps lock, input small letter

Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop

#Set foreground window function
#This function is called every time in [System.Windows.Forms.Control]
#with this, thsi script can be called under command line,
# for example, "powershell.exe hello.ps1"

Add-Type @'
using System;
using System.Runtime.InteropServices;
public class Win {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
}
'@ -ErrorAction Stop
########################################################

#2014-07-17, xiaolaba modified
#REF: http://gallery.technet.microsoft.com/scriptcenter/ON-OFF-Keyboad-Lock-keys-6ba9885c
#REF: http://newdelhipowershellusergroup.blogspot.in/2013/10/on-off-keyboard-lock-keys-capsscrollnum.html

#the script following is only able to run within powershell IDE, command line invoke will be error

# Creating a WScript.Shell onject
 $keyBoardObject = New-Object -ComObject WScript.Shell
 
# CAPSLOCK / SCROL LOCK /  Num Lock key Status  
# Getting the status of Keys using .Net Object , this result of the ISkeyLock is in Boolean
# Capsock
 [string]$capsLockKeySatus = [System.Windows.Forms.Control]::IsKeyLocked('CapsLock') 

#Numlock  
 [string]$numLockKeySatus = [System.Windows.Forms.Control]::IsKeyLocked('NumLock') 

#scrollLock
 [string]$ScrollLockKeySatus =  [System.Windows.Forms.Control]::IsKeyLocked('Scroll')
 
#---- process starts form here  
# checking caps lock  
 if ( $capsLockKeySatus -eq $false )  
    {
        Write-Host "Capslock key is off"  
         
        # if you want to ON the CapsLock {IF CAPSLOCK IS ALREADY OFF }, then please unComment the below Command.
        #  $keyBoardObject.SendKeys("{CAPSLOCK}")
    }  
 
else {          
        Write-Host "Capslock key is On"  
         
        # if you want to OFF the CapsLock Key {IF CAPSLOCK IS ALREADY on }, then please unComment the below Command.
        #-->   $keyBoardObject.SendKeys("{CAPSLOCK}")
         
    }
 
# Checking ScrollOck
 
 if ( $ScrollLockKeySatus -eq $false )  
    {
        Write-Host "Scroll Lock key is off"  
         
        # if you want to ON the ScrollLoc {IF ScrollLock IS ALREADY OFF }, then please unComment the below Command.
        #$keyBoardObject.SendKeys("{SCROLLLOCK}")
    }  
 
else {          
        Write-Host "Scroll Lock key is On"  
         
        # if you want to OFF the CapsLock Key {IF CAPSLOCK IS ALREADY on }, then please unComment the below Command.
        #-->  $keyBoardObject.SendKeys("{SCROLLLOCK}")
         
    }
 
 
# Checking NumLock
 
 if ( $numLockKeySatus -eq $false )  
    {
        Write-Host "NumLock Lock key is off"  
         
        # if you want to ON the ScrollLoc {IF ScrollLock IS ALREADY OFF }, then please unComment the below Command.
        #$keyBoardObject.SendKeys("{NUMLOCK}")
    }  
 
else {          
        Write-Host "NumLock Lock key is On"  
         
        # if you want to OFF the CapsLock Key {IF CAPSLOCK IS ALREADY on }, then please unComment the below Command.
        #-->   $keyBoardObject.SendKeys("{NUMLOCK}")
         
    }
#-----------end of the script ----------------------#

.

.

執行的結果, 成功演示鍵盤3 個 toggle keys 的狀態.
powershell_caps_lock_check

END of this journey.

Powershell 檔案無法載入 執行已遭軟體限制原則封鎖, win 7 home edition

http://wp.me/ph3BR-1hI

 

自己寫好的 powershell script, 測試正常後, self signed

Set-ExecutionPolicy RemotedSinged, 或

Set-ExecutionPolicy AllSinged

都可以正常執行, 要搞這個的原因是 (http://wp.me/ph3BR-1gF). 放到別台電腦, 使用者第一次安裝使用時, 誤選 " V 永遠不執行" , 以致出現 “已遭軟體限制原則封鎖" 的情形, Continue reading “Powershell 檔案無法載入 執行已遭軟體限制原則封鎖, win 7 home edition"

Powershell 不要打很長串的命令行

http://wp.me/ph3BR-1gP

 

剛剛處理過自動化登入VPN 等的 powershell script (ps1), 會使用很多次的命令行, 也要測試自己寫的 ps1 到底效果如何, 所以常要切換到不同的目錄, 這就帶來很多打字或剪貼命令的動作, 有方法簡單一些嗎 ? 有的 Microsoft 有說明,

http://technet.microsoft.com/en-us/library/bb963733.aspx

不過 win7 是行不通的, 原因的是不同版本 WINDOWS, 不同的目錄結構

俺是這樣做的


建立一個資料夾 MyScripts

mkdir C:\Users\user0\Documents\MyScripts

切換到資料夾 MyScripts

cd C:\Users\user0\Documents\MyScripts

建立 Profile.ps1

在 Profile.ps1 內寫入以下內容

#http://technet.microsoft.com/en-us/library/bb963733.aspx

# win7 not working
# Filename: Profile.ps1
#$env:path = $env:path + ";<C>:\Documents and Settings\<UserAlias>\My Documents\MyScripts"
# end of script

2014-07-11, xiaolaba
# win 7, path is different
# Filename: Profile.ps1
$env:path = $env:path + ";<C>:\Users\<user0>\Documents\MyScripts"
# end of script

然後建立 hello.ps1, 內容如下,

# Filename: Hello.ps1
Write-Host
Write-Host 'Hello World!'
Write-Host "Good-bye World! `n"
# end of script

最後試驗執行, 成功就會顯示 Hello World

.\hello

結果
hello_world

Powershell 自動執行的幫助工具, 俺忘記啥時用過, 反正就按裝

http://wp.me/ph3BR-1gF

 

每天的密碼太多了, 要輸入很多又麻煩.

以前都用 DOS 的年代, 使用 BAT 執行一些自動化的簡單劇本, 但是到了 WINDOWS 系統, 很多 BAT 都不行, 但是某些動作還是可以用 BAT 完成, Windows95 到 Windows8 都可以. 但是如果一個應用程式啟動後要求是使用者互動或輸入密碼之類的工作, BAT 就無能為力. 俺記得用 CC:MAIL  (LOTUS 買斷的產品EMAIL軟體) 的時候, 那是 WIN98 和 XP 的交替時間, 俺刨了一些網上的資料, 使用 WIN32 的 API, 可以自動在 EMAIL 內容加入當下時間印記以及一些當時流行的 ASCII 圖形的簽名檔, 其實是可以做到的, 不過需要用到 WIN32 API 的底層, 首先找到那個 CCMAIL 的 PID, 再提取她的 HANDLE, 然後向 HANDLE 內 [編輯WINDOW] 內注入文字, 達到自動化輸入文字的效果, 然後生成一封有特色的 EMAIL. 需要用到 WIN32ASM 編譯的, 而且不是一般使用者可以修改的. 不過太久, 已經不記得實際的編碼過程了.

這次突然要用到 Microsoft Daynamic AX, 想要自動化執行自動連接 VPN 然後啟動 AX, 所以抄了一個劇本, Continue reading “Powershell 自動執行的幫助工具, 俺忘記啥時用過, 反正就按裝"