Я создаю приложение для отображения отметки времени последнего входа пользователей в систему, а также даты создания и некоторой другой информации. Как сделать, чтобы lastlogon отображался в моем списке?
Я пробовал различные решения на SO, а также на других веб-сайтах, но, похоже, ни один из них не работает.
Это код, который я использую для отображения необходимой информации
lvwListView.Clear();
lvwListView.Columns.Add("Name", 175, HorizontalAlignment.Left);
lvwListView.Columns.Add("LanID", 100, HorizontalAlignment.Left);
lvwListView.Columns.Add("Email", 225, HorizontalAlignment.Left);
lvwListView.Columns.Add("Phone Number", 150, HorizontalAlignment.Left);
lvwListView.Columns.Add("When Created", 150, HorizontalAlignment.Left);
lvwListView.Columns.Add("Last Logon", 150, HorizontalAlignment.Left);
if (results != null)
{
foreach (Principal p in results)
{
itmListItem = new ListViewItem();
itmListItem.Text = p.Name;
itmListItem.SubItems.Add(p.SamAccountName);
if (p.StructuralObjectClass == "user")
{
var uP = (UserPrincipal)p;
if (uP != null)
{
itmListItem.SubItems.Add(uP.EmailAddress);
}
}
var creationDate = string.Empty;
var telephoneNumber = string.Empty;
var lastLogon = string.Empty;
var prop = string.Empty;
var directoryEntry = p.GetUnderlyingObject() as DirectoryEntry;
prop = "whenCreated";
if (directoryEntry.Properties.Contains(prop))
{
creationDate = directoryEntry.Properties[prop].Value.ToString();
}
prop = "telephoneNumber";
if (directoryEntry.Properties.Contains(prop))
{
telephoneNumber = directoryEntry.Properties[prop].Value.ToString();
}
prop = "lastLogon";
if (directoryEntry.Properties.Contains(prop))
{
lastLogon = directoryEntry.Properties[prop].Value.ToString();
}
itmListItem.SubItems.Add(telephoneNumber);
itmListItem.SubItems.Add(creationDate);
itmListItem.SubItems.Add(lastLogon);
lvwListView.Items.Add(itmListItem);
lvwListView.Refresh();
itmListItem = null;
this.Text = Application.ProductName + " (" + groupName + ")";
}
ctx.Dispose();
}
Приведенный выше код отлично отображает Name
, LanId
, Email
, phone number
и when created
, но для lastlogon
он отображает System._ComObject
.
Я не совсем понимаю, почему он будет отображать WhenCreated
, но не lastLogon
?
КогдаСоздано хранится как Тип строки (обобщенное время), тогда как Последний вход сохраняется как Синтаксис интервала, который может быть преобразован в IADsLargeInteger.
Вот пример расширения, которое преобразует это в знакомое System.DateTime
:
public static class ActiveDirectoryExtensions
{
public static DateTime GetLastLogon(this DirectoryEntry entry)
{
var activeDirectoryLargeInteger = (IAdsLargeInteger)entry.Properties["lastLogon"].Value;
return DateTime.FromFileTimeUtc((activeDirectoryLargeInteger.HighPart << 32) + activeDirectoryLargeInteger.LowPart);
}
[ComImport, Guid("9068270b-0939-11d1-8be1-00c04fd8d503"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
internal interface IAdsLargeInteger
{
long HighPart { get; set; }
long LowPart { get; set; }
}
}
Применение:
var lastLogon = directoryEntry.GetLastLogon()
По сути, просто скопируйте и вставьте ActiveDirectoryExtensions
в качестве нового класса в свой проект в том же пространстве имен, что и ваш код. Затем измените lastLogon = directoryEntry.Properties[prop].Value.ToString();
на lastLogon = directoryEntry.GetLastLogon().ToString();
Привет, спасибо, что объяснил мне разницу между
whenCreated
иlastLogon
. У меня все еще возникают проблемы с внедрением вашего кода в мой существующий код.