使用Powershell實現自動登錄域賬號

問題背景

由於愈來愈煩於單位裏處理辦公事務的電腦開機訪問站點時彈出的域賬號登陸對話框,因而就尋思着想個辦法解決一下。單位爲了處理這個問題已經爲每人提供了叫USB Key的東西,插入U盤接口後,再訪問須要身份認證信息的網站時就能夠自動獲取這些信息而不用手工輸入了。但不幸的是個人這個工具自打發下來後就以沒有好用過,幸虧還能夠像之前同樣用域賬號登陸,只是每次第一次打開須要身份認證的網站都要手動錄入。html

無心間知道了微軟很早之前就在Windows系統中集成了一個命令行工具Powershell,上網找了些參考資料一看,雖然使用者大都是系統管理員、數據庫管理員,但看到它能操做.NET對象,能用在自動化部署和測試上,對開發者也是好處多多,功能甚是強大。因而就萌生了用它處理域認證的問題的想法。web

解決思路

單位裏決大多數B/S應用都在.NET環境下開發部署運行的,而且這些應用都使用了統一的第三方集中式身份認證接口。這個API使用了Form認證和Windows集成身份認證兩種方式,關於這兩種認證方式的介紹請參考這篇文章:http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.htmlhttp://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.htmlshell

按照這個思路,首先要知道這個身份認證API的認證機制。由於按照通常操做,若是是第一次登陸網站,客戶端上可能找不到身份認證信息,因而若是選擇的是Windows集成身份認證方式,它會彈出一個輸入認證信息的Windows對話框。等用戶錄入提交後,就發送給身份認證服務器進行驗證。若是驗證成果,它會以某種方式(Cookies)把這些信息存儲在客戶端。這樣在下次訪問或訪問其它使用相同身份驗證API的應用時,就能夠直接使用而不用重複登陸了。另外若是在Internet上訪問域中的服務器,解決方案請參考這篇文章:http://www.pstips.net/access-web-app-that-authenticated-with-adfs.html數據庫

因而解決登陸問題時,只要發給身份驗證API一個請求,並在請求頭中加上它須要的認證信息,再解析響應中的認證並把身份信息存儲在客戶端。理論上用Powershell調用.NET對象完成這些工做是可行的,但問題是這個過程應該怎麼實現,要說清楚整個過程貌似能夠寫個連載了。編程

因而就有了第二個方法:訪問一個須要認證的站點,彈出Windows域認證對話框後,自動用Powershell填寫用戶名/密碼,再自動點擊確認,模擬用戶操做來完成這個任務。服務器

用Powershell自動實現填寫Windows對話框和確認動做

有了以上想法就能夠寫Powershell腳本實現了。基本的流程就是啓動一個IE窗口,導航到一個須要認證的站點,在它彈出的對話框中自動填寫用戶名和密碼,再點擊肯定就OK了。app

啓動IE並導航到某站點是很容易的,就是調用一個COM對象。代碼以下:工具

$IEHost = New-Object -ComObject "InternetExplorer.Application"
$IEHost.Navigate(yourUrl)
$IEHost.Visible = $true

這樣就會彈出一個乾淨的IE窗口並導航到指定網址。測試

但涉及到自動化操做就有些麻煩了。要自已寫方法嗎,想一想涉及到進程、WinForm編程之類的,好像也是能夠寫個連載的。按照少寫代碼的原則,仍是找個現成的庫吧。翻閱如今的Powershell資料,不多有涉及到這種模擬WinForm應用操做的,但偶然間發現了一個(可能也是惟一一個)關於這方面的庫--WASP。這是一個好久沒更新的庫了,託管在CodePlex上。官方沒有文檔(其實它只有幾個方法)但有一些討論內容能夠參考。網站

有了這個庫就好多了。因爲是第三方庫,用以前要導入它。

Import-Module Your_Path\WASP.dll

接下來我把模擬登陸操做的命令先寫出來(注意,這實際上是一個模擬點擊彈出框的命令,但原理是同樣的),很短只有一句話,再詳細說明一下。

Select-Window -Class "Alternate Modal Top Most" | Select-ChildWindow | Select-Control | Send-Click -ControlButton

Select-Window表明選擇窗口,即IE窗,若是你看Select-Window命令的可選項,其實除了Class,還有Title和ProcessName可用。但Title重複率高,而且有時Title是根據文檔內容變化的,Process Name也不具備惟一性,我的感受仍是Class辨識度高。這裏值得注意的問題是如何選擇正確的類名。有一個小技巧,就是先單獨使用Select-Window命令,這樣它會列出全部桌面上的應用對應的類名,選擇須要的便可。

以後的「|」符號表明管道操做。Select-ChildWindow表示選擇這個彈出框,不直接用Select-Control是由於這個模態對話框屬於窗口而不是IE的控件。

選好彈出框後就能夠操做裏面的控件了。Select-Control就表示選擇了窗口中全部控件。由於整個窗口只有一個按鈕可點擊,因此就不用指定操做哪一個控件了。固然有興趣的同窗也能夠了解一下這個命令的參數,它也有幾個參數可選來指定某些或某一個控件。

接下來Send-Click表示點擊了彈出框中的控件,ControlButton表示點擊了確認按鈕。

這是模擬彈出框,要是有文本錄入那種輸入框怎麼辦呢?就須要這義到文本框控件,並使用Send-Keys命令就能夠了,具體就是再後面加上命令:

Send-Keys -Keys "userName"

而後再Send-Click。這樣就實現了一個完整的登錄操做。在同一個會話中再打開其餘須要認證的站點就不須要再登錄了。

總結

上面其實是一個迂迴的方案。偉光正的作法就是解決思路的第一個思路。這裏重點在於「自動」二字,這是完全的自動--連文本錄入和點鼠標的動做省去了,我的認爲在一些情景下仍是有用的--好比這個每次開機或清除了認證信息就提示登錄的煩人的域認證對話框。

相關文章
相關標籤/搜索