這稱不上一篇技術文。 這邊記錄解決一個問題的過程和感受。這種感覺每個搞IT的人或多或少都感受過,是程式人獨有的快樂之一。只是大部分人沒有將這種感覺記錄下來。但是當你記錄時,這種感覺也早已消失。 需求:通過程式抓取outlook中的尋呼欄位 當然這個需求被我簡化了,實際上這個欄位記錄的是員工的工號。之 ...
這稱不上一篇技術文。
這邊記錄解決一個問題的過程和感受。這種感覺每個搞IT的人或多或少都感受過,是程式人獨有的快樂之一。只是大部分人沒有將這種感覺記錄下來。但是當你記錄時,這種感覺也早已消失。
需求:通過程式抓取outlook中的尋呼欄位
當然這個需求被我簡化了,實際上這個欄位記錄的是員工的工號。之前通過IIS我可以抓取域用戶名。在我的概念里,我以為這工號信息也該是域管控的信息之一。因此便朝著域的方向
查找了些資料,發現.net中有程式集可以抓取域中信息
編寫瞭如下代碼:
起初我猜UserPrincipal的EmployeeId欄位可能表示工號,但是取出來發現是空的,所以我猜這個欄位並沒有被利用起來,郵件地址和域用戶名都取到了,我只要順著這個
UserPrincipal類的屬性來找尋呼這個欄位。
找了半天,並沒有發現UserPrincipal有這個屬性。但是發現了有個GetUnderlyingObject方法,而且提供的註釋似乎有點搭邊
返回的object,可以轉換為DirectoryEntry對象,大致看了下這個對象的屬性,也沒有發現尋呼這個欄位
浮躁的我在找類似paging屬性的地方折騰了些許,覺得此路不通。於是換個思路,既然尋呼是出現在outlook中,本該直接從outlook入手,之前接觸過最多的是Excel的程式編寫,查找
資料發現同樣的outlook一樣有編程API
首先就入了坑,這邊很讓人激動的是ContactItem,不就是聯繫人的信息嘛,於是下麵紅色框出的代碼就很讓人興奮了,PagerNumber不就是尋呼號嘛,正覺得方向找對後,調試
發現只能遍歷出一個聯繫人?!後來發現,原來這段代碼對應的是Outlook中聯繫人文件夾中已經維護的聯繫人,
平時,我在outlook客戶端沒有使用過這個功能,不知啥時咋誤操作添加進一個聯繫人,而且該人已離職。
我立刻明白我要找的是全球通訊薄,因此又折騰了一波代碼
因為我在AddressEntry介面中同樣沒有找到Pager這樣的屬性,因此發現它提供了GetContact()方法,竊以為可以通過獲取ContactItem,進而獲取到它的PagerNumber屬性,前途
又是一片光明啊,但是隨之而來的又一次失落,就是這個GetContact()獲得的ContactItem是null,沒有深究為什麼,只是覺得不解。
浮躁的我似乎已經折騰夠了,開始猶豫了:這個尋呼欄位是某個人員維護進來的,outlook當然有數據來源,這個來源很可能是我們自己的庫。我從那邊抓似乎就可以。另外更簡單
的是我完全可以根據域賬號到員工信息里取出工號。那我花這麼多精力通過程式的方法獲取工號似乎就有點捨本逐末了。
但是仔細思考一下,發現也並不完全是這樣,outlook里的信息也是經過處理過後才顯示出來的,因此它過濾了些無效信息,其次,我不需要連資料庫,處理數據源,很可能有多個
數據來源,因為可能有多個域,我自己去抓,可能會面臨其他的如許可權和信息完整準確以及後續維護問題。
再次可能也是比較主要的是一個虛榮心,其實大概是每個程式員心底的要強吧,不然也不會有很多重覆造輪子的現象。只是如果這次抓出尋呼欄位來不是為了證明自己的技術,只是
找到一種解決問題的方法,且似乎是較優的,且似乎和技術搭點邊花了些時間琢磨的,如果這樣成功了,就會很開心。
猶豫了些許後,我覺得實在搞不出來也就算了,畢竟問題不大,雖然有些不快,但是我還是會在權衡了利弊後向boss彙報不好搞,雖然心底可能認為如果有足夠的時間和必要性還是
能琢磨出來的。
所以打算在午飯前,再次尋思尋思,也許這是最後一波團了,推不了對方基地,就GG。
還記得上面最先嘗試抓取域信息的方式中的UserPrincipal對象地GetUnderlyingObject方法嗎,似乎這是個黑盒,總感覺返回object對象的方法裡面提供了很多未知的可能,首先將其
轉換為DirectoryEntry對象。在網上游蕩的時候,看到它有個InvokeSet方法,有個示例似乎調用了這個方法且傳了一個字元串常量作為參數,我想既然可以這樣玩,必然有個InvokeGet方法,
我也傳個參數,反正就試試,看看能獲得啥信息。傳什麼參數?之前在Outlook那發現pager屬性對應的是pagerNumber欄位,因此我大膽地使用該字元串參數,雖然不見得outlook那的屬性和這邊
的代碼有啥直接關聯,但既然DirectoryEntry對象沒有為我們列出所有屬性,也許裡面的屬性太多,萬一這個屬性存在呢!而且嘗試過Outlook調用代碼和域調用代碼,發現裡面對於聯繫人有些屬性
定義得非常像,沒有理由不嘗試。
代碼如下:
原本不抱希望的,但突然就成了的感覺似乎和糖一樣甜
總結
1, 前面沒有提到的是搜索問題的能力,其實在解決問題的過程中,我在google上嘗試用英文短語和關鍵字做了大量搜索,它的重要性在於搜索結果可能不斷提示你新的嘗試方向。
2, 問題的解決實際上有幾次甚至多次的迭代,一種方案不行可以迅速切換為另一種,總歸有那麼個時間點,你會和讓你滿意的解決方案邂逅。
3, 如果確定了這個難題是非解決不可,沒有其他替代方案,且你確信一定是可以解決的,那麼我以為堅持還是很重要的,畢竟後天很美好,不能在明晚就繳械投降。
4, 問題驅動或是項目驅動似乎可以讓我們接觸更多知識,就像這次,之前我完全沒註意Outlook API的存在。
5, 一波三折後,轉角遇到了愛,這種感覺就像進了桃花源。