Active Directory: 如何在 Domain\User 與 AD 中的 User Principal Name 間互轉

如何在 Domain\User 與 AD 中的 User Principal Name 間互轉 (IADsNameTranslate 的方法)

這一篇是我貼在Xuite Blog 那一篇文章的另一種方法,在 ASP.NET 使用表單驗證法和 AD 做驗證與資料處理是很實用,通常使用 AD 驗證時,UPN 是一個不錯的方法,但通常使用者都會要求用 Domain\User 的格式,因此才會有名稱互轉的需求出現,前次的作法是使用 DsCrackNames() API 來做,這次則是直接取用 IADsNameTranslate 介面的方法來做。

在使用下列程式前,必須先在專案中加入 activeds.dll 的參考,此元件為 COM DLL。

ActiveDs.NameTranslateClass nameTranslate = new ActiveDs.NameTranslateClass();
string NTFormatNAmeForTranslate = Console.ReadLine();

nameTranslate.InitEx((int)ActiveDs.ADS_NAME_INITTYPE_ENUM.ADS_NAME_INITTYPE_GC,
    "LDAP://acme.com.tw", "AdReader", "ACME", "adReaderPassword");

nameTranslate.Set((int)ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4, NTFormatNameForTranslate);

object result = nameTranslate.Get((int)ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME);

nameTranslate = null;
Console.WriteLine("UPN: " + result.ToString();

 

簡單說明一下:

  • IADsNameTranslate 的 .NET 類別名稱是 NameTranslateClass,而在使用它之前,要先用 Init() 或 InitEx() 來初始化,這兩個方法的分別是一個使用預設驗證的帳戶(即目前使用者的帳戶),另一個則可以指定連線的帳戶。
  • 初始化之後,請呼叫 Set() 方法來設定要轉換的名稱,並且設定來源的名稱格式(例如 NT 的名稱是設定 ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4),若同時有多組名稱要轉換時,則可以使用 SetEx() 方法。
  • 設定名稱後,呼叫 Get() 方法來取回轉換完成的名稱,並且要設定轉換的格式(例如 UPN 是設定 ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME),Get() 的回傳值是 object,可直接轉型為 string。若之前使用 SetEx() 指定多組名稱,此時就要呼叫 GetEx() 來取回轉換後的多組名稱,但它回傳的仍然是 object,要轉型為 object[] 後再轉為 string[]。