Comment répertorier tous les ordinateurs et la dernière fois qu'ils ont été connectés à AD?
-
05-07-2019 - |
Question
J'essaie de récupérer une liste de noms d'ordinateur et la date à laquelle ils ont été connectés pour la dernière fois à partir d'Active Directory et de les renvoyer dans un fichier de données. Obtenir les noms est assez simple, mais lorsque j'essaie d'ajouter le "lastLogon" ou " lastLogonTimestamp " Comme indiqué ci-dessous, les seules valeurs que je reçois pour lastLogonTimestamp sont "System._ComObject"
.public DataTable GetListOfComputers(string domainName)
{
DirectoryEntry entry = new DirectoryEntry("LDAP://DC=" + domainName + ",DC=com");
DirectorySearcher search = new DirectorySearcher(entry);
string query = "(objectclass=computer)";
search.Filter = query;
search.PropertiesToLoad.Add("name");
search.PropertiesToLoad.Add("lastLogonTimestamp");
SearchResultCollection mySearchResultColl = search.FindAll();
DataTable results = new DataTable();
results.Columns.Add("name");
results.Columns.Add("lastLogonTimestamp");
foreach (SearchResult sr in mySearchResultColl)
{
DataRow dr = results.NewRow();
DirectoryEntry de = sr.GetDirectoryEntry();
dr["name"] = de.Properties["Name"].Value;
dr["lastLogonTimestamp"] = de.Properties["lastLogonTimestamp"].Value;
results.Rows.Add(dr);
de.Close();
}
return results;
}
Si je demande à AD en utilisant un outil tel que LDP, je peux voir que la propriété existe et est renseignée avec des données Comment puis-je obtenir cette information?
La solution
Il serait plus facile d'utiliser la classe ComputerPrincipal et un PrincipalSearcher de System.DirectoryServices.AccountManagement.
PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName);
PrincipalSearcher ps = new PrincipalSearcher(new ComputerPrincipal(pc));
PrincipalSearchResult<Principal> psr = ps.FindAll();
foreach (ComputerPrincipal cp in psr)
{
DataRow dr = results.NewRow();
dr["name"] = cp.Name;
dr["lastLogonTimestamp"] = cp.LastLogon;
results.Rows.Add(dr);
}
Autres conseils
** Pour traiter la propriété 'lastLogonTimestamp' extraite d'un DirectoryEntry, vous devez la convertir en IADSLargeInteger
.de: http://www.dotnet247.com/247reference/msgs/31/159934.aspx **
Le __ComObject renvoyé pour ces types est IADsLargeInteger pour le valeurs numériques et IADsSecurityDescriptor for SecurityDescriptors.
Vous pouvez inclure une référence dans l'onglet COM à Active DS Type Lib et obtenir la définition de ces interfaces ou les définir manuellement. Voici une échantillon:
using System;
using System.DirectoryServices;
using System.Runtime.InteropServices;
//This is the managed definition of this interface also found in
ActiveDs.tlb
[ComImport]
[Guid("9068270B-0939-11D1-8BE1-00C04FD8D503")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
internal interface IADsLargeInteger
{
[DispId(0x00000002)]
int HighPart{get; set;}
[DispId(0x00000003)]
int LowPart{get; set;}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
DirectoryEntry entry = new
DirectoryEntry("LDAP://cn=user,cn=users,dc=domain,dc=com");
if(entry.Properties.Contains("lastLogon"))
{
IADsLargeInteger li =
(IADsLargeInteger)entry.Properties["lastLogon"][0];
long date = (long)li.HighPart << 32 | (uint)li.LowPart;
DateTime time = DateTime.FromFileTime(date);
Console.WriteLine("Last logged on at: {0}", time);
}
}
}
David Stucki Support aux développeurs Microsoft
Essayez d’utiliser IADsLargeInteger ( Source )
DirectoryEntry user = DirectoryEntry("LDAP://" + strDN);
if (user.Properties.Contains("lastlogontimestamp"))
{
// lastlogontimestamp is a IADsLargeInteger
IADsLargeInteger li = (IADsLargeInteger)
user.Properties["lastlogontimestamp"][0];
long lastlogonts =
(long)li.HighPart << 32 | (uint)li.LowPart;
user.Close();
return DateTime.FromFileTime(lastlogonts);
}
Une réponse simple à la question initiale consiste à accéder à la propriété de votre résultat de recherche:
sr.Properties["lastLogonTimestamp"][0].ToString()
DateTime.FromFileTimeUTC (long.Parse (sr.Properties [" lastLogonTimestamp "]] [0] .ToString ())
pour obtenir une valeur de date / heure
Je rencontre un problème similaire. Je peux accéder à la propriété lastLogonTimestamp
dans SearchResult
et obtenir une valeur dans le résultat indexé, mais après avoir utilisé SearchResult. GetDirectoryEntry ()
Je ne parviens pas à accéder à un résultat valide pour la propriété lastLogonTimestamp
sur DirectoryEntry .
Quelqu'un d'autre at-il rencontré ce problème avec le DirectoryEntry
renvoyé par SearchResult.GetDirectoryEntry ()
en ce qui concerne l'accès à la propriété lastLogonTimestamp
?