Я пишу небольшое приложение, которое может проверять время последнего входа пользователя в систему на каждом контроллере домена в нашей среде. С небольшой помощью мне удалось создать код, который перебирает все контроллеры домена и запрашивает время последнего входа пользователя в систему. Как я читал ранее, это значение не синхронизируется между контроллерами домена, и это сделано по замыслу MS. Вот код, который я использую для проверки пользователя на каждом контроллере домена:
foreach (string DCInstance in DC_Collection)
{
try
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain,DCInstance))
{
using (UserPrincipal userPrincipal = new UserPrincipal(context))
{
userPrincipal.Name = "TestUserName";
using (PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal))
{
using (PrincipalSearchResult<Principal> results = searcher.FindAll())
{
foreach (UserPrincipal FoundUser in results)
{
Console.WriteLine(FoundUser.SamAccountName + "," + FoundUser.LastLogon + "," + DCInstance);
}
}
}
}
}
}
catch (PrincipalServerDownException PSDE)
{
MessageBox.Show(PSDE.Message + ": " + DCInstance);
}
}
Я знаю, что многие скобки не нужны, но мне так удобнее читать.
Это ядро программы. Однако я понял, что время последнего входа в систему найденного пользователя одинаково для каждого экземпляра контроллера домена, что весьма маловероятно. Чтобы убедиться в этой проблеме, я сделал небольшой PS-скрипт, который делает то же самое, поэтому я могу сравнить результаты. Вот скрипт PS:
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName -Server $hostname | Get-ADObject -Properties lastLogon
}
Опять же, это только ядро скрипта, который делает реальную работу.
Однако результат полностью отличается. Сценарий PS выдает время, как я и ожидал, совершенно разное почти на каждом DC (не все отличаются от других, но большинство из них). Однако программа .Net возвращает одно и то же время из всех экземпляров контроллера домена и, кроме того, возвращает время, которое не отображается в сценарии PS!
Теперь я совсем запутался. Я считаю, что сценарий PS является правильным, но тогда я действительно не знаю, что я пропустил в версии .Net.
Я сделал некоторую отладку программы, но найденный пользователь содержит только время, которое показывает программа, и даже значение времени файла, отличное от версии PS. Я даже думал о преобразовании даты и времени, но тогда структура результата должна быть одинаковой с разными значениями, но это не так.
Заранее спасибо за любую помощь.