在多个域服务器中搜索用户的lastLogon属性 [英] Searching for lastLogon attribute of user in multiple domain servers
问题描述
首先,如果我使用的术语不正确,请原谅我.无论我在哪里使用错误的术语,都请纠正我.
First of all, please forgive me if I'm not using the correct terminologies. Correct me wherever I'm using the wrong terminology.
目标是以编程方式检索给定用户名的lastLogon
日期.
The objective is to programmatically retrieve the lastLogon
date of a given username.
我有一个我认为是森林的地方;两个AD服务器-adserver01.aa.mycompany.com
和adserver02.aa.mycompany.com
We have what I believe is a forest; two AD servers like - adserver01.aa.mycompany.com
and adserver02.aa.mycompany.com
我使用Microsoft的ADExplorer从第三台计算机连接到这些服务器,以检查对象.在那里,我看到一些用户的adserver01
中有lastLogon日期,但adserver02
中没有.例如,在adserver02
中,lastLogon的值为0x0,而在adserver01
中,对于某些用户来说,它是有效日期.
I connected to these servers from a third machine using Microsoft's ADExplorer to inspect the objects. There I see some users having lastLogon date available in adserver01
, but not in adserver02
. For example, the value for lastLogon is 0x0 in adserver02
whereas it is a valid date in adserver01
for some users.
如果仅涉及一个AD Server,我到目前为止为Windows Forms应用程序开发的代码可以正常工作.如何在lastLogon日期属性之一中检查两个服务器并返回非零值(如果可用)?
The code I've developed so far as a Windows Forms application, works fine if only one AD Server is involved. How do I check both servers and return the non-zero value if available, in either for lastLogon date attribute?
private static string GetLastActivityDate(string UserName)
{
string domainAndUserName = String.Format(@"LDAP://aa.mycompany.com/CN={0},OU=CLIENT_PROD,OU=clients.mycompany.com,DC=aa,DC=mycompany,DC=com", UserName);
string OUAdminUserName = "abc";
string OUAdminPassword = "xyz";
AuthenticationTypes at = AuthenticationTypes.Secure;
DateTime lastActivityDate;
string returnvalue;
long lastLogonDateAsLong;
using (DirectoryEntry entryUser = new DirectoryEntry(domainAndUserName, OUAdminUserName, OUAdminPassword, at))
using (DirectorySearcher mysearcher = new DirectorySearcher(entryUser))
try
{
using (SearchResultCollection results = mysearcher.FindAll())
{
if (results.Count >= 1)
{
DirectoryEntry de = results[0].GetDirectoryEntry();
lastLogonDateAsLong = GetInt64(de, "lastLogon");
try
{
if (lastLogonDateAsLong != -1)
{
lastActivityDate = DateTime.FromFileTime(lastLogonDateAsLong);
returnvalue = lastActivityDate.ToString();
}
else
{
returnvalue = "-Not available-";
}
}
catch (System.ArgumentOutOfRangeException aore)
{
returnvalue = "Not available";
}
}
else
{
returnvalue = string.Empty;
}
}
}
catch (System.DirectoryServices.DirectoryServicesCOMException dsce)
{
returnvalue = "- Not available -";
}
return returnvalue;
}
谢谢.
private static Int64 GetInt64(DirectoryEntry entry, string attr)
{
DirectorySearcher ds = new DirectorySearcher(
entry,
String.Format("({0}=*)", attr),
new string[] { attr },
SearchScope.Base
);
SearchResult sr = ds.FindOne();
if (sr != null)
{
if (sr.Properties.Contains(attr))
{
return (Int64)sr.Properties[attr][0];
}
}
return -1;
}
忘记了,AD架构,结构等在两台服务器中看起来完全一样.
Forgot to mention, the AD schema, structure etc, looks exactly alike in the two servers.
推荐答案
检查此帖子 http://www.codeproject.com/Articles /19181/跨所有Windows域控件的Find-LastLogon
我遇到了同样的问题,但只针对一个域, 我通过使用以下代码解决了它,但是我正在检查所有用户的lastLogin
I had the same issue but but only for one domain, I solved it by using the following code however i'm checking the lastLogin of all users
public static Dictionary<string, DateTime> UsersLastLogOnDate()
{
var lastLogins = new Dictionary<string, DateTime>();
DomainControllerCollection domains = Domain.GetCurrentDomain().DomainControllers;
foreach (DomainController controller in domains)
{
try
{
using (var directoryEntry = new DirectoryEntry(string.Format("LDAP://{0}", controller.Name)))
{
using (var searcher = new DirectorySearcher(directoryEntry))
{
searcher.PageSize = 1000;
searcher.Filter = "(&(objectClass=user)(!objectClass=computer))";
searcher.PropertiesToLoad.AddRange(new[] { "distinguishedName", "lastLogon" });
foreach (SearchResult searchResult in searcher.FindAll())
{
if (searchResult.Properties.Contains("lastLogon"))
{
var lastLogOn = DateTime.FromFileTime((long)searchResult.Properties["lastLogon"][0]);
var username = Parser.ParseLdapAttrValue(searchResult.Properties["distinguishedName"][0].ToString());
if (lastLogins.ContainsKey(username))
{
if (DateTime.Compare(lastLogOn, lastLogins[username]) > 0)
{
lastLogins[username] = lastLogOn;
}
}
else
{
lastLogins.Add(username, lastLogOn);
}
}
}
}
}
}
catch (System.Runtime.InteropServices.COMException comException)
{
// Domain controller is down or not responding
Log.DebugFormat("Domain controller {0} is not responding.",controller.Name);
Log.Error("Error in one of the domain controllers.", comException);
continue;
}
}
return lastLogins;
}
在代码之上,您可以使用以下代码获取目录林中的所有域.
On top of the code you can use the following to get all domains in a forest.
Forest currentForest = Forest.GetCurrentForest();
DomainCollection domains = currentForest.Domains;
foreach(Domain domain in domains)
{
// check code above
}
这篇关于在多个域服务器中搜索用户的lastLogon属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!