2016-10-03 201 views
0

我想将lastlogontimestamp转换为datetime,但我注意到对于大的值,我得到错误异常消息:索引超出范围。必须是非负数且小于集合的大小。将lastlogontimestamp转换为DateTime

有没有更好的方法来做到以下几点?

var de = new DirectoryEntry("LDAP://GLOBAL.ABC.COM"); 
var ds = new DirectorySearcher(de); 
ds.Filter = string.Format("(&(objectCategory=user)(objectClass=user)({0}={1}))", 
    "samAccountName", username); 
ds.PropertiesToLoad.AddRange(new string[] { "samAccountName", "lastLogon" }); 
SearchResult sr = ds.FindOne(); 
long lastLogon = (long)sr.Properties["lastLogon"][0]; 
// lastLogon is 131111471723190497 
var dtLastLogon = DateTime.FromFileTime(lastLogon); 
return dtLastLogon.ToString(); 
+0

哪一个投掷“索引超出范围”?请提供一个“大数值”的例子 – Julian

+0

这是我得到lastLogon变量的路线。值是131111471723190497 – Blade1

+0

是'long lastLogon =(long)sr.Properties [“lastLogon”] [0];''或'ds.PropertiesToLoad.AddRange(new string [] {“samAccountName”,“lastLogon”}); '? – Julian

回答

1

你的问题是事实上,帐户不必具有lastLogon属性。所以代码应该看起来像

// ... 
SearchResult sr = ds.FindOne(); 
if (sr.Properties["lastLogon"] != null && sr.Properties["lastLogon"].Count > 0) 
{ 
    long lastLogon = (long)sr.Properties["lastLogon"][0]; 
    var dtLastLogon = DateTime.FromFileTime(lastLogon); 
    return dtLastLogon.ToString(); 
} 
// last logon is not set here - make something up; for example 
return DateTime.MinValue.ToString()