Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > VB.NET
VB.NET Forum d'entraide sur la programmation Visual Basic .NET. Avant de poster -> FAQ VB.NET, Articles VB.NET, Sources VB.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 10h32   #1
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Par défaut [LDAP] Mise à jour d'une propriété (LastLogonTimeStamp)

Bonjour,
Je suis bloquée sur ce problème depuis quelque temps.

J'ai reçu une demande de mon DT pour une MaJ d'une propriété de user dans le LDAP à chaque connexion à notre intranet.

Le code qui effectue l'authentification au LDAP utilise des UsersPrincipal qui n'ont pas accès à la propriété LastLogonTimeStamp mais accès en readonly à LastLogon.

J'ai regardé et beaucoup de gens utilise DirectoryEntry pour modifiée des propriétés mais je n'arrive pas à modifier celle-ci ni même a bien comprendre comment fonctionne le Directory Entry comparativement au UserPrincipal...

Je sais que c'est possible de modifier cette entrée en PHP mais l'est-ce en VB.Net? ou plutot VB lors de l'authentification sur l'intranet.

Cordialement

Bobuche
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 11h17   #2
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Bonjour,
j'ai réussi à accéder aux différentes propriétés et à en modifier durablement.

Le problème est sur les lastlogon et lastlogontimestamp qui ont des valeurs assez particluière.

J'utilise ce code
Code :
1
2
3
4
5
6
7
8
9
10
 
Dim dirEntry As DirectoryEntry = New DirectoryEntry("LDAP://FR-DTC-DC02/DC=fr,DC=capio,DC=net", "COMPTE", "MDP")
            Dim dirSearch As DirectorySearcher = New DirectorySearcher(dirEntry)
            dirSearch.Filter = "(&(objectCategory=person)(sAMAccountName=apigenel))"
            Dim result As DirectoryEntry = dirSearch.FindOne().GetDirectoryEntry()
            Dim name As String = result.Properties("lastLogonTimestamp").Value.ToString()
            If result.Properties.Contains("lastLogonTimestamp") Then
                result.Properties("lastLogonTimestamp").Item(0)
            End If
            dirEntry.CommitChanges()
L'objet retourne un "System.__ComObject" que je ne sais pas utilisé.

Une idée?

Cordialement
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 12h09   #3
bizet
Membre Expert
 
Avatar de bizet
 
Homme
Ingénieur développement logiciels
Inscription : juin 2005
Messages : 715
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2005
Messages : 715
Points : 1 379
Points : 1 379
Salut

Ta valeur est en int64.
Pour la convertir :
http://social.msdn.microsoft.com/For...6-198422838cdf
bizet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 12h59   #4
sinople
Membre Expert
 
Homme Marco Guignard
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 729
Détails du profil
Informations personnelles :
Nom : Homme Marco Guignard
Âge : 30
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : avril 2009
Messages : 729
Points : 1 385
Points : 1 385
Envoyer un message via MSN à sinople
Le principal (jeux de mot pourri) problème que tu auras en voulant utiliser les infos lastlogon et lastlogontimestamp c'est que ces propriétés sont probablement partagées avec l'authentification de windows sur l'active directory. C'est probablement pourquoi elles sont protégées en écriture.

Donc en gros tu ne sais pas si la valeur de lastlogon correspondera à sa dernière ouverture de session sur Windows dans le domaine, sur ton site intranet, voir même à un access à Exchange.

Par contre il est possible de définir et utilisé des propriétés personnalisée dans Active Directory (et les autres annuaires LDAP) pour étendre les fonctionnalités de stockage des principals. Tu peux donc utiliser ce moyen pour définir un espace de stockage reservé à ta problèmatique.

Par contre il est clair que l'interface "standard" de gestion de l'annuaire de windows ne permettera pas de consulter ces informations (déjà qu'elle ne gère pas toutes les propriétés propres à Windows comme par exemple l'image associé au login utilisateur par ex.).

Il faudra donc développer une interface spécifique pour la lecture de ta propriété.

Autrement tu stockes cette information ailleurs (base de donnée) en utilisant le guid de l'utilisateur identifié pour faire le lien avec l'annuaire.
sinople est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 13h54   #5
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Citation:
Envoyé par bizet Voir le message
Salut

Ta valeur est en int64.
Pour la convertir :
http://social.msdn.microsoft.com/For...6-198422838cdf
Je ne vois pas comment convertir...

Je suis surement aveugle

Cdt

Bobuche
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 13h56   #6
bizet
Membre Expert
 
Avatar de bizet
 
Homme
Ingénieur développement logiciels
Inscription : juin 2005
Messages : 715
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2005
Messages : 715
Points : 1 379
Points : 1 379
ceci ne fonctionne pas ?

Code :
1
2
3
4
 
 long int64Value = (long)((uint)result.Properties["lastLogon"]);
 
var date = DateTime.FromFileTimeUtc(int64Value);
bizet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 14h17   #7
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Citation:
Envoyé par bizet Voir le message
ceci ne fonctionne pas ?

Code :
1
2
3
4
 
 long int64Value = (long)((uint)result.Properties["lastLogon"]);
 
var date = DateTime.FromFileTimeUtc(int64Value);
Le code en VB serait celui-ci:
Code :
1
2
3
 
Dim int64Value As Long = DirectCast(DirectCast(result.Properties("lastLogon"), UInt64), Long)
                Dim var As Date = DateTime.FromFileTimeUtc(int64Value)
Dans un premier temps le uint n'est pas reconnu mais UInt12,32,64 oui.

Et sur la première ligne la valeur "result.Properties("lastLogon")" est une collection de propriété.

Si je rajoutes ".Value" il me dit impossible de cast en ULong.

Je fais donc ceci:
Code :
1
2
3
4
 
Dim int64Value As ULong = DirectCast(DirectCast(result.Properties("lastLogon").Value, UInt64), ULong)
                Dim tempaaa As DateTime = Convert.ToDateTime(int64Value)
                Dim tempgg As String = tempaaa.Date.ToString
Et j'ai une exception sur le premier cast.


Ma demande est de voir comment je peux obtenir mais aussi insérer dans la propriété.

Je veux pouvoir mettre la date actuelle et l'heure dans cette propriétée.

Cordialement

Bobuche
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 16h57   #8
bizet
Membre Expert
 
Avatar de bizet
 
Homme
Ingénieur développement logiciels
Inscription : juin 2005
Messages : 715
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2005
Messages : 715
Points : 1 379
Points : 1 379
Un nouveau lien

http://en.csharp-online.net/User_Man...ing_Last_Logon

si tu regardes bien il prend le premier element de la liste.
bizet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 17h14   #9
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Citation:
Envoyé par bizet Voir le message
Un nouveau lien

http://en.csharp-online.net/User_Man...ing_Last_Logon

si tu regardes bien il prend le premier element de la liste.
Bonjour,
Merci de ton aide.

Le problème que j'ai actuellement c'est que toutes les techniques que j'essaye ne marche pas pour une raison.
Code :
1
2
 
result.Properties("lastLogonTimeStamp").Value
Cette objet est de type "System.__ComObject"

J'ai réussi à faire ceci:
Code :
1
2
3
4
5
6
7
 
    If result.Properties.Contains("lastLogonTimestamp") Then
                Dim highPart As Int32 = DirectCast(result.Properties("lastLogon")(0), Int32).MaxValue
                Dim lowPart As Int32 = DirectCast(result.Properties("lastLogon")(0), Int32).MinValue
                Dim total As Long = CLng((highPart * 2 ^ 32) + lowPart)
                Dim dat As DateTime = New DateTime(total)
            End If
Mon problème c'est qu'avec cette technique qui n'est pas bonne j'obtient un long ENORME!

J'ai obtenu:9223372030412324864 pour 129997993762676702 (date du jour)

Je ne comprend pas d'où peu venir cette erreur de conversion...

Les propriétés "givenName" qui sont des chaines de caractères je les récupères correctement dans une string...

J'ai aussi essayer de convertir directement en date, datetime... Rien a fonctionné a cause du type retourné par cette propriété...

Je n'y comprend rien... Surtout que personne n'a ce genre de problème j'ai l'impression...

Je suis en Framework 2.0 au passage je ne sais pas si cela influ mais une DLL du Framework 3.5 m'a permis d'utiliser certaine fonctionnalité.

Cordialement

Bobuche
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 17h34   #10
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
ENFIN!

Voila un lien qui répond a ma question!

Je l'ai trouvé en fouillant sur les largeInteger en VB d'après un autre lien qui m'avais été recommandé par qqun... Bref a trouvé c'est relou!

http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx

Mon problème est résolu.

a part un petit cas de droit sur le serveur que je vais régler avec les admins!

merci a tous ceux qui m'ont aidé!

Cordialement

Bobuche
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 16h58   #11
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Bonjour,
Je reviens vers vous car manuellement la propriété LastLogonTimeStamp ne peut être modifée...

Il faut donc passer par une authentification au niveau du LDAP qui requiert certaines conditions que je n'arrive pas a cerner...

Quelqu'un aurais une idée?

On m'a parlé de liaison simple, requête etc...

Mais j'ai réussi a me connecté au ldap avec directory entry et login,mdp, authentification.Secure...
J'ai réussi a mettre à jour des propriétés puis CommitChanges...

Je ne vois pas ce qu'il faut de plus pour une requete ou liaison simple...

Apparement, ce n'est pas le bon mode de fonctionnement.

Si jamais quelqu'un à déja effectuer ce genre de traitement merci de m'aider...

Cordialement

Bobuche
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 14h56   #12
bobuche
Invité régulier
 
Homme
Développeur .NET
Inscription : décembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : décembre 2012
Messages : 28
Points : 5
Points : 5
Bonjour,

Je rajoute la solution au problème:

Pour mettre à jour cette propriété il faut effectuer au minimum un bind avec l'AD.

En outre, établir une connexion avec un compte précis sur le LDAP suffit à enclencher le processus de mise à jour de la propriété LastLogonTimeStamp.

Cependant, cela ne modifie que la propriété du user qui a effectué le bind mais aussi d'un random de 5 -14 par rapport à la valeur actuel du LastLogonTimeStamp!

Pour que la mise a jour soit quotidienne et pas en générale au bout de 3 à 5 jour, voir plus, il faut abaissé le 14 à 5 (qui est la valeur minimale!)

Je n'ai plus le lien pour cette info que je tire de la documentation MSDN.

Cordialement
bobuche est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h13.


 
 
 
 
Partenaires

Hébergement Web