2013-09-04 35 views
7
public static string GetProperty(SearchResult searchResult, string PropertyName) 
    { 
     if (searchResult.Properties.Contains(PropertyName)) 
     { 
      return searchResult.Properties[PropertyName][0].ToString(); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 

Các phương pháp trên hoạt động tuyệt vời cho các thuộc tính Active Directory nhất trừ có liên quan đến ngày/giờ như pwdLastSet, maxPwdAge vvLàm thế nào để chuyển đổi Active Directory pwdLastSet to Date/Time

Câu hỏi của tôi là làm thế nào để tôi nhận được pwdLastSet đến một datetime có thể đọc được con người (như 2013/08/13 hoặc 13 tháng 8 năm 2013, vv)

tôi đã cố gắng này, nhưng nó ném ngoại lệ

public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger) 
{ 
    var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null); 
    var lowPart = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null); 
    return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart; 
} 

tôi u hát đoạn mã sau để có được thời gian như một Int64

Int64 passwordLastSet = ConvertADSLargeIntegerToInt64(objResult.Properties["pwdLastSet"][0]); 

Sau đó, tôi có kế hoạch sử dụng DateTime (Int64) constructor để tạo ra một DateTime

Trả lời

9

Theo the MSDN documentation:

Giá trị này là được lưu trữ dưới dạng số nguyên lớn đại diện cho số lượng khoảng 100 nano giây kể từ ngày 1 tháng 1 năm 1601 (UTC).

Điều này phù hợp hoàn hảo với DateTime.FromFileTimeUtc, as described here.

Và tôi không chắc tại sao bạn cảm thấy cần phải thực hiện thao tác ở mức độ thấp của số nguyên. Tôi nghĩ bạn có thể bỏ nó.

Vì vậy, chỉ cần làm:

long value = (long)objResult.Properties["pwdLastSet"][0]; 
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value); 
1

Bạn có thể lấy mật khẩu cuối cùng ngày một người sử dụng thư mục ở dạng có thể đọc được con người thiết lập dễ dàng như chiếc bánh. Để đạt được điều này, bạn có thể sử dụng thuộc tính rỗng của của UserPrincipal từ không gian tên System.DirectoryServices.AccountManagement.

Nếu tùy chọn User must change password at next logon được chọn thì LastPasswordSet thuộc tính trả về null giá trị. Nếu không, nó sẽ trả về ngày và giờ cuối cùng mật khẩu được đặt theo loại DateTime.

using(PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
{ 
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, Username); 
    //? - to mark DateTime type as nullable 
    DateTime? pwdLastSet = (DateTime?)user.LastPasswordSet; 
    ... 
} 

MSDN: UserPrincipal
MSDN: LastPasswordSet

Các vấn đề liên quan