獲取outlook聯繫人尋呼欄位

来源:https://www.cnblogs.com/hymanting/archive/2019/02/15/10381592.html
-Advertisement-
Play Games

這稱不上一篇技術文。 這邊記錄解決一個問題的過程和感受。這種感覺每個搞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,  一波三折後,轉角遇到了愛,這種感覺就像進了桃花源。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 前段時間,博客和論壇都放到的阿裡雲新購的三年 T5 實例伺服器上,等都轉移過去才發現,所謂的 T5 實例只能滿足10% 的 CPU 峰值。期間經歷了各種卡頓、死機,最終又把博客單獨遷移了回來。靜態文件走 CDN,文章都 Redis,以為萬事大吉了就。 群壓 然並卵,有一天,群里有網友說要壓測我 ...
  • 啟動了兩個goroutine,並完成一些工作。在各自迴圈的每次迭代之後,在goroutine 會使用LoadInt64 來檢查shutdown 變數的值。這個函數會安全地返回shutdown 變數的一個副本。如果這個副本的值為1,goroutine 就會跳出迴圈並終止。 ...
  • 父進程退出時,子進程會如何?如何確保父進程退出時,子進程也退出? ...
  • 一、閉包 1.舉例 註意:inner()是局部變數,在全局範圍不可調用(即不能直接調用inner()函數),但是在法二中,在執行完 f = outer() 之後,outer()函數就已經結束,執行f()的時候卻可以調用inner()函數,並輸出x的值,這是因為outer()里 return 的 in ...
  • 原因:python是64位的python,而windll.LoadLibrary只能由32位的python使用 參考: 64位Python調用32位DLL方法(一) 解決方法:使用32位的python(切記版本不要太新,本人一開始使用最新的32位python3.7.2再次報錯,換成python3.6 ...
  • 1.atomic包里的幾個函數以及sync包里的mutex類型,提供瞭解決方案2.原子函數能夠以很底層的加鎖機制來同步訪問整型變數和指針3.atomic.AddInt64(&counter, 1)的原理是強制同一時刻只能有一個goroutine運行並完成這個加法操作 ...
  • 迭代器的執行流程,以及說明可迭代對象不一定是迭代器,但迭代器一定是可迭代對象 實例1 實例1的優化 ...
  • 一、什麼是委托: 委托是定址方法的.NET版本,使用委托可以將方法作為參數進行傳遞。委托是一種特殊類型的對象,其特殊之處在於委托中包含的只是一個活多個方法的地址,而不是數據。 二、使用委托: 關鍵字:delegate 1.聲明: public delegate void DoNothing();// ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...