Время Lastlogon на DC возвращает другое значение в .Net и powershell

Я пишу небольшое приложение, которое может проверять время последнего входа пользователя в систему на каждом контроллере домена в нашей среде. С небольшой помощью мне удалось создать код, который перебирает все контроллеры домена и запрашивает время последнего входа пользователя в систему. Как я читал ранее, это значение не синхронизируется между контроллерами домена, и это сделано по замыслу 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. Я даже думал о преобразовании даты и времени, но тогда структура результата должна быть одинаковой с разными значениями, но это не так.

Заранее спасибо за любую помощь.


person SecThor    schedule 06.07.2015    source источник


Ответы (1)


Я нашел ответ! :-)

Я изменил код C#, чтобы возвращать время файла для предполагаемых данных о последнем входе в систему, а также сделал подробный скрипт ps, чтобы перечислить все переменные пользователя, чтобы я мог найти соответствующее свойство, возвращаемое C#.

Вот PS-скрипт:

Get-ADUser TestUser | Get-ADObject -Properties *

Эта строка возвращает все свойства, которые хранятся в AD для данного пользователя. Среди прочего есть два значения, о которых я забочусь:

lastLogon и lastLogonTimestamp

После этого я проверил файловую версию свойства lastlogon, возвращаемую c#, и оказалось, что это значение на самом деле совпадает с lastLogonTimestamp и нет (или Я не нашел) способ запросить точные данные lastlogon.

Правильное решение — перепроектировать код, чтобы он работал с запросами LDAP вместо вызовов API. Небольшую помощь в этом можно найти здесь

person SecThor    schedule 13.07.2015