IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

LastLogon Active Directory


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut LastLogon Active Directory
    Bonjour,

    Je cherche à récupérer la liste de tous les utilisateurs de mon AD qui ne se sont pas connecter depuis plus de "90" jours.
    Pour se faire, je parcours l'ensemble de l'annuaire à la recherche de la propriété "LastLogon". Cela fonctionne bien sauf pour certains utilisateurs...
    En effet, mon AD est très vieux et à vécu plusieurs migrations.

    Mon problème c'est que avec certains utilisateurs, j'ai un message d'erreur :
    Impossible d'exécuter la requête : L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre : index
    Hors cela fonctionne très bien pour les autres...

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [...]
    DirectoryEntry ldap = new DirectoryEntry(ConfigurationSettings.AppSettings["LdapUrl"], ConfigurationSettings.AppSettings["LdapLogin"], ConfigurationSettings.AppSettings["LdapPwd"]);
    DirectorySearcher searcher = new DirectorySearcher(ldap);
    searcher.Filter = "(&(objectClass=user)(employeeID=*)(mail=*))";
    foreach (string str in adProperties)
       searcher.PropertiesToLoad.Add(str);
    SearchResultCollection AdUsers = searcher.FindAll();
    foreach (SearchResult result in AdUsers)
    {
       int flag = int.Parse(result.Properties["userAccountControl"][0].ToString());
       if (!Convert.ToBoolean(flag & 0x0002))
       {
          if (result.Properties["lastLogon"][0] != null && long.Parse(result.Properties["lastLogon"][0].ToString()) > 0)
          {
             TimeSpan ts = DateTime.Now - new DateTime(1601, 01, 01).AddTicks((long)result.Properties["lastLogon"][0]);
             if (ts.Days >= 90)
             {[...]
    Quelqu'un aurait-il une idée ?
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Tu as pu identifier précisément les entrées/valeurs qui posaient problème ?

    Si oui, peux-tu tester le code suivant (enfin quelque chose qui s'en approche), manipuler plutôt ce type d'objets et dire ce que tu obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IADsLargeInteger lastLogonAsIADs = (IADsLargeInteger)result.Properties["lastLogon"][0];
    long lastLogonAsLong = (lastLogonAsIADs.HighPart * 0x100000000) + lastLogonAsIADs.LowPart; 
    DateTime lastLogonAsDateTime = DateTime.FromFileTimeUtc(lastLogonAsLong);
    Je n'ai jamais manipulé ce champ mais j'ai déjà eu des soucis avec d'autres du même type (Large Integer/Interval) .

  3. #3
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    Tu as pu identifier précisément les entrées/valeurs qui posaient problème ?
    Oui... Pour la valeur "129507190229911135" par exemple !

    Citation Envoyé par _Max_ Voir le message
    Si oui, peux-tu tester le code suivant (enfin quelque chose qui s'en approche), manipuler plutôt ce type d'objets et dire ce que tu obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IADsLargeInteger lastLogonAsIADs = (IADsLargeInteger)result.Properties["lastLogon"][0];
    long lastLogonAsLong = (lastLogonAsIADs.HighPart * 0x100000000) + lastLogonAsIADs.LowPart; 
    DateTime lastLogonAsDateTime = DateTime.FromFileTimeUtc(lastLogonAsLong);
    Je n'ai jamais manipulé ce champ mais j'ai déjà eu des soucis avec d'autres du même type (Large Integer/Interval) .
    C'est fait, cela règle le premier problème, mais une autre erreur apparait :
    Impossible d'effectuer un cast d'un objet de type 'System.Int64' en type 'ActiveDs.IADsLargeIntegrer'. [...] the value must be a number less than infinity
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  4. #4
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Stp tu peux dire à quelle ligne exactement tu as la nouvelle exception ? Poster ton nouveau code ?

  5. #5
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    Stp tu peux dire à quelle ligne exactement tu as la nouvelle exception ? Poster ton nouveau code ?
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    try
    {
        IADsLargeInteger lastLogonAsIADs = (IADsLargeInteger)result.Properties["lastLogon"][0];
        long lastLogonAsLong = (lastLogonAsIADs.HighPart * 0x100000000) + lastLogonAsIADs.LowPart;
        DateTime lastLogonAsDateTime = DateTime.FromFileTimeUtc(lastLogonAsLong);
        if (lastLogonAsDateTime.Day > 90)
        {
            ADUser u = new ADUser();
            u.expires = lastLogonAsDateTime.Day.ToString();
            u.completeName = result.Properties["cn"][0].ToString();
            if (result.Properties["employeeID"].Count != 0)
                u.employeeID = result.Properties["employeeID"][0].ToString();
            users.Add(u);
        }
    }
    catch (Exception e)
    {
        users.Add(new ADUser(result.Properties["cn"][0].ToString(), e.Message));
    }
    Le résultat est :
    <cn>User Name</cn>
    <messageException>Impossible d'effectuer un cast d'un objet de type 'System.Int64' en type 'ActiveDs.IADsLargeInteger'.</messageException>
    Et ce pour l'ensemble des enregistrements...
    L'exception est levée à la première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IADsLargeInteger lastLogonAsIADs = (IADsLargeInteger)result.Properties["lastLogon"][0];
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  6. #6
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    Si oui, peux-tu tester le code suivant (enfin quelque chose qui s'en approche)
    J'ai bien fait de prendre des pincettes .

    Je pense avoir pigé le problème : je t'ai passé un bout de code dans lequel j'utilisais des PropertyCollection. Or, toi, tu utilises des ResultPropertyCollection... et donc tu as déjà un long à disposition !

    Ton souci concerne donc uniquement la conversion du file time UTC en DateTime :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime lastLogonAsDateTime = DateTime.FromFileTimeUtc((long)result.Properties["lastLogon"][0]);
    Ça devrait rouler maintenant .

  7. #7
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    Ton souci concerne donc uniquement la conversion du file time UTC en DateTime :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime lastLogonAsDateTime = DateTime.FromFileTimeUtc((long)result.Properties["lastLogon"][0]);
    Ça devrait rouler maintenant .
    En effet.
    Cela dit, mon ancien code fonctionne de nouveau...
    Allez savoir pourquoi cela ne fonctionnait pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TimeSpan ts = DateTime.Now - new DateTime(1601, 01, 01).AddTicks((long)result.Properties["lastLogon"][0]);
                                                            if (ts.Days > JobsConstantes.NB_DAYS_BEFORE_UNUSED_STATE)
    Merci pour ton aide.
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/08/2006, 14h04
  2. [C#] Active directory LDAP
    Par Gauden dans le forum Windows Forms
    Réponses: 9
    Dernier message: 02/05/2005, 13h57
  3. [AD]Mise en place de Active Directory
    Par guiguisi dans le forum Windows Serveur
    Réponses: 9
    Dernier message: 29/07/2004, 08h50
  4. Réponses: 4
    Dernier message: 17/05/2004, 09h57
  5. Active directory
    Par m.schar dans le forum Développement
    Réponses: 5
    Dernier message: 22/03/2004, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo