2015-10-22 6 views
4

Я искал способ конвертировать COM объект в DateTime и я видел много статей об этой проблеме (как это - https://msdn.microsoft.com/en-us/library/ms180872(v=vs.80).aspx и этом одно- How to read "uSNChanged" property using C#)Пространство имен IADsLargeInteger

Однако, все эти статьи говорят об использовании объекта с интерфейса IADsLargeInteger.

Я попытался найти пространство имен этого интерфейса, и я просто не мог найти подсказки.

+1

Я нашел ответ. Это пространство имен ActiveD. Чтобы найти, что требуется добавить пространство имен для ссылки на C: \ Windows \ System32 \ activeds.tlb. – neriag

ответ

5

Вот пример кода, в том числе все, что нужно для преобразования из типа AD в DateTime:

using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 
using ActiveDs; // Namespace added via ref to C:\Windows\System32\activeds.tlb 

private DateTime? getLastLogin(DirectoryEntry de) 
{ 
    Int64 lastLogonThisServer = new Int64(); 

    if (de.Properties.Contains("lastLogon")) 
    { 
     if (de.Properties["lastLogon"].Value != null) 
     { 
      try 
      { 
       IADsLargeInteger lgInt = 
       (IADsLargeInteger) de.Properties["lastLogon"].Value; 
       lastLogonThisServer = ((long)lgInt.HighPart << 32) + lgInt.LowPart; 

       return DateTime.FromFileTime(lastLogonThisServer); 
      } 
      catch (Exception e) 
      { 
       return null; 
      } 
     } 
    } 
    return null; 
} 
+1

_ActiveDs C: \ Windows \ System32 \ activeds.tlb_ *** действительно требуется *** для работы с *** ActivieDirectory в .NET ***. Я использую только 'System.DirectoryServices.AccountManagement' – Kiquenet

+0

Нет, это не требуется для работы с ActiveDirectory в целом. Однако, если вы хотите работать со многими типами дат в AD, например lastLogon, вам нужен тип IADsLargeInteger, который входит в состав библиотеки ActiveDs. Я не видел обходного пути к этому, но мне тоже понравилось бы! Вы преобразовали эти даты с помощью System.DirectoryServices.AccountManagement? – Shane

+0

Для образца, \t Я видел это *** исходный код ***: https://github.com/egil/PasswordExpireNotification/blob/master/Program.cs и другие ссылки в github. 'maxPwdAge = TimeSpan.FromTicks ((long) sr.Properties [" maxPwdAge "] [0]);' – Kiquenet