OVH Cloud OVH Cloud

[wd10] ldap:lastlogon

10 réponses
Avatar
[Bernard Vessiot]
bonjour,
je recupere la valeur contenu dans mon ldap et j'arrive sur lastlogon
qui me renvoie :
127917148294687500

question: quelqu'un sait-il comment convertir cela en date pour obtenir
la date de la derniere connexion ?

merci d'avance
@+++

--
[Bernard Vessiot]
34980 Saint Gély du Fesc

10 réponses

Avatar
Romain PETIT
[Bernard Vessiot] avait soumis l'idée :
bonjour,
je recupere la valeur contenu dans mon ldap et j'arrive sur lastlogon
qui me renvoie :
127917148294687500
question: quelqu'un sait-il comment convertir cela en date pour obtenir la
date de la derniere connexion ?



Hum trop long pour être un timestamp unix....

Peut être une piste :
http://www.rlmueller.net/Programs/LastLogon.txt

[...]
lngDate = objRecordSet.Fields("lastLogon")
On Error Resume Next
Set objDate = lngDate
If Err.Number <> 0 Then
On Error GoTo 0
dtmDate = #1/1/1601#
Else
On Error GoTo 0
lngHigh = objDate.HighPart
lngLow = objDate.LowPart
If lngLow < 0 Then
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0 ) Then
dtmDate = #1/1/1601#
Else
dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) + lngLow)/600000000
End If
...

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
[Bernard Vessiot]
Le 10/05/2006, Romain PETIT a supposé :
[Bernard Vessiot] avait soumis l'idée :
bonjour,
je recupere la valeur contenu dans mon ldap et j'arrive sur lastlogon
qui me renvoie :
127917148294687500
question: quelqu'un sait-il comment convertir cela en date pour obtenir la
date de la derniere connexion ?





Hum trop long pour être un timestamp unix....



Peut être une piste :
http://www.rlmueller.net/Programs/LastLogon.txt



[...]
lngDate = objRecordSet.Fields("lastLogon")
On Error Resume Next
Set objDate = lngDate
If Err.Number <> 0 Then
On Error GoTo 0
dtmDate = #1/1/1601#
Else
On Error GoTo 0
lngHigh = objDate.HighPart
lngLow = objDate.LowPart
If lngLow < 0 Then
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0 ) Then
dtmDate = #1/1/1601#
Else
dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) + lngLow)/600000000
End If
...



Bonsoir,
merci de ta réponse !
En fait c'est le contenu renvoyé par l'Ad de Windows pour le couple
LastLogon/LastLogoff...

j'avais déjà exploré la même piste mais sans grand résultat...
donc je continue !
merci encore !
@+++

--
[Bernard Vessiot]
34980 Saint Gély du Fesc
Avatar
[Bernard Vessiot]
[Bernard Vessiot] a formulé la demande :
bonjour,
je recupere la valeur contenu dans mon ldap et j'arrive sur lastlogon
qui me renvoie :
127917148294687500



question: quelqu'un sait-il comment convertir cela en date pour obtenir la
date de la derniere connexion ?



merci d'avance
@+++



bon, j'ai trouvé une solution alors je poste cela pour l'historique .
La solution (provisoire) est de laisser windows faire le boulot!
Comment ?
en utilisant la cmd : W32tm /ntte 127917148294687500
le systeme renvoie alors
148052 06:07:09.4687500 - 10/05/2006 08:07:09 (local time)
ce que l'on peut facilement recuperer et retravailler avec la classe
cwdDos de Wdforge.
Mais je continue a chercher pour implémenter cela directement en Windev
!
@++

--
[Bernard Vessiot]
34980 Saint Gély du Fesc
Avatar
Romain PETIT
[Bernard Vessiot] a pensé très fort :

Mais je continue a chercher pour implémenter cela directement en Windev !



Ah ben c'est "simple", regarde l'aide sur la commande :

w32tm /ntte <période de temps NT>
Convertir un temps système NT, en intervalles (10^-7)s à partir de 0h
1-Jan 1601, en un format lisible.

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
[Bernard Vessiot]
Romain PETIT a formulé ce vendredi :
[Bernard Vessiot] a pensé très fort :

Mais je continue a chercher pour implémenter cela directement en Windev !



Ah ben c'est "simple", regarde l'aide sur la commande :

w32tm /ntte <période de temps NT>
Convertir un temps système NT, en intervalles (10^-7)s à partir de 0h 1-Jan
1601, en un format lisible.

A+



salut,
merci, c'est ce que j'avais trouvé...(voir mon post précédent)
par contre ce que j'aimerais, c'est convertir cette période de temps
directement en Wlangage, sans passer a travers une commande...tout
simplement pour des questions de performances...
@+++

--
[Bernard Vessiot]
34980 Saint Gély du Fesc
Avatar
Romain PETIT
[Bernard Vessiot] a exposé le 12/05/2006 :
salut,
merci, c'est ce que j'avais trouvé...(voir mon post précédent)
par contre ce que j'aimerais, c'est convertir cette période de temps
directement en Wlangage, sans passer a travers une commande...tout simplement
pour des questions de performances...



Il y a bien une API :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/filetimetosystemtime.asp

-> cela converti la structure qui correspond à ton entier sur 8 octets (64 bits) en structure de temps système (en local directement avec cette API là).

Par contre, je ne vois pas comment récupérer les DWORD dwLow et dwHigh à partir de l'entier 64 (un QWORD)...
(PoidsFort et PoidsFaible ne sont applicables que pour des entiers sur 4 octets (32 bits))
A suivre


Pour l'instant, ca devrait donc donner à peu près ca en W-Langage :

**************************
strTFILETIME est une structure
edwLowdateTime est un entier
edwHighdateTime est un entier
FIN
strSYSTEMTIME est une structure
wYear est un entier sans signe sur 2 octets
wMonth est un entier sans signe sur 2 octets
wDayOfWeek est un entier sans signe sur 2 octets
wDay est un entier sans signe sur 2 octets
wHour est un entier sans signe sur 2 octets
wMinute est un entier sans signe sur 2 octets
wSecond est un entier sans signe sur 2 octets
wMilliseconds est un entier sans signe sur 2 octets
FIN


UTC_TFilteTime est une strTFILETIME
LOCAL_TFilteTime est une strTFILETIME
LOCAL_SystemTime est une strSYSTEMTIME

eRetAPI est un entier

eUTC_TFileTime est un entier sur 8 octets = 127917148294687500

// mais comment récupérer les DWORDS d'un QWORD ?
// une piste :
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/iadslargeinteger.asp
UTC_TFilteTime:edwLowdateTime = PoidsFaibleQW(eUTC_TFileTime)
UTC_TFilteTime:edwHighdateTime = PoidsFortQW(eUTC_TFileTime)

// on converti en temps local
eRetAPI = API("kernel32","FileTimeToLocalFileTime", &UTC_TFilteTime, &LOCAL_TFilteTime)

//trace(eTFileTime + " / " + edwHighdateTime + " / " + edwLowdateTime)
SI eRetAPI<>0 ALORS
// on converti en system time
eRetAPI = API("kernel32","FileTimeToSystemTime", &LOCAL_TFilteTime, &LOCAL_SystemTime)
SI eRetAPI<>0 ALORS
Info("L'entier 64 bits " + eUTC_TFileTime + " correspond à jour/heure local " + LOCAL_SystemTime:wDay + "/" + LOCAL_SystemTime:wMonth + "/"+ LOCAL_SystemTime:wYear + ...
" à " + LOCAL_SystemTime:wHour + ":" + LOCAL_SystemTime:wMinute + ":" + LOCAL_SystemTime:wSecond + "." +LOCAL_SystemTime:wMilliseconds)
SINON
Erreur("Echec de FileTimeToSystemTime : " + ErreurInfo())
FIN
SINON
Erreur("Echec de FileTimeToLocalFileTime : " + ErreurInfo())
FIN
*************************

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Romain PETIT
Romain PETIT vient de nous annoncer :

Par contre, je ne vois pas comment récupérer les DWORD dwLow et dwHigh à
partir de l'entier 64 (un QWORD)... (PoidsFort et PoidsFaible ne sont
applicables que pour des entiers sur 4 octets (32 bits)) A suivre



Pour l'instant, ca devrait donc donner à peu près ca en W-Langage :



Suis-je bête, pas besoin de décomposer en 2 dw, le QW est directement utilisable :
Et ça donne :

*************************** DEBUT DE CODE *****************************
FONCTION fg_Entier64VersDate(eUTC_TFileTime est un entier sur 8 octets , sErr = "")
// Version 1.00 pour WD7/7.5/8/9/10 (WD55 voir les déclarations)
// (c) mai 2006 Romain PETIT (mailto:)
// sous licence WD-LIBRE (http://www.windasso.org)
// But : Convertir un timestamp 64 bits en date locale
// Paramètres : TimeStamp 64 bits
// Retour : date au format "JJ/MM/AAAA HH:MM:SS,CCC"
// en cas d'erreur, la fonction retourne une chaine vide et
// sErr passée par adresse peut être récupérée.
// Références API:
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/filetimetosystemtime.asp
// Exemple :
// sDate est une chaine
// sErreur est une chaine
// eEntier64 est un entier sur 8 octets = 127917148294687500
// sDate = fg_Entier64VersDate(eEntier64, sErreur)
// si Sdate ="" alors
// erreur("Impossible de récupérer la date : " + sErreur)
// sinon
// info("Le timestamp correspondant à " + eEntier64 + " est " + sDate)
// FIN

strTFILETIME est une structure
edwLowdateTime est un entier
edwHighdateTime est un entier
FIN
strSYSTEMTIME est une structure
wYear est un entier sans signe sur 2 octets //WD55 : entier sans signe
wMonth est un entier sans signe sur 2 octets //WD55 : entier sans signe
wDayOfWeek est un entier sans signe sur 2 octets //WD55 : entier sans signe
wDay est un entier sans signe sur 2 octets //WD55 : entier sans signe
wHour est un entier sans signe sur 2 octets //WD55 : entier sans signe
wMinute est un entier sans signe sur 2 octets //WD55 : entier sans signe
wSecond est un entier sans signe sur 2 octets //WD55 : entier sans signe
wMilliseconds est un entier sans signe sur 2 octets //WD55 : entier sans signe
FIN

LOCAL_TFilteTime est une strTFILETIME
LOCAL_SystemTime est une strSYSTEMTIME

eRetAPI est un entier
sRetour est une chaîne

// on converti en temps local
eRetAPI = API("kernel32","FileTimeToLocalFileTime", &eUTC_TFileTime, &LOCAL_TFilteTime)

SI eRetAPI<>0 ALORS
// on converti en system time
eRetAPI = API("kernel32","FileTimeToSystemTime", &LOCAL_TFilteTime, &LOCAL_SystemTime)
SI eRetAPI<>0 ALORS
sRetour = NumériqueVersChaine(LOCAL_SystemTime:wDay,"02d") + "/" + ...
NumériqueVersChaine(LOCAL_SystemTime:wMonth,"02d") + "/" + ...
NumériqueVersChaine(LOCAL_SystemTime:wYear,"04d") + " " + ...
NumériqueVersChaine(LOCAL_SystemTime:wHour,"02d") + ":" + ...
NumériqueVersChaine(LOCAL_SystemTime:wMinute,"02d") + ":" + ...
NumériqueVersChaine(LOCAL_SystemTime:wSecond,"02d") + "," + ...
NumériqueVersChaine(LOCAL_SystemTime:wMilliseconds)
SINON
sErr = "Echec de FileTimeToSystemTime : " + ErreurInfo()
FIN
SINON
sErr = "Echec de FileTimeToLocalFileTime : " + ErreurInfo()
FIN

RENVOYER sRetour

*************************** FIN DE CODE *****************************

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Romain PETIT
(supersedes )

Romain PETIT vient de nous annoncer :

Par contre, je ne vois pas comment récupérer les DWORD dwLow et dwHigh à
partir de l'entier 64 (un QWORD)... (PoidsFort et PoidsFaible ne sont
applicables que pour des entiers sur 4 octets (32 bits)) A suivre



Pour l'instant, ca devrait donc donner à peu près ca en W-Langage :



Suis-je bête, pas besoin de décomposer en 2 dw, le QW est directement
utilisable :
Et ça donne :

http://rompetit.free.fr/Pub/WD7/fg_Entier64VersDate.txt

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
[Bernard Vessiot]
Romain PETIT avait prétendu :
(supersedes )

Romain PETIT vient de nous annoncer :

Par contre, je ne vois pas comment récupérer les DWORD dwLow et dwHigh à
partir de l'entier 64 (un QWORD)... (PoidsFort et PoidsFaible ne sont
applicables que pour des entiers sur 4 octets (32 bits)) A suivre



Pour l'instant, ca devrait donc donner à peu près ca en W-Langage :



Suis-je bête, pas besoin de décomposer en 2 dw, le QW est directement
utilisable :
Et ça donne :

http://rompetit.free.fr/Pub/WD7/fg_Entier64VersDate.txt

A+



Alors là chapeau bas !!!
ça marche Nickel
Super, merci beaucoup Romain pour ton aide plus que précieuse !
@+++

--
[Bernard Vessiot]
34980 Saint Gély du Fesc
Avatar
Romain PETIT
[Bernard Vessiot] avait prétendu :

Super, merci beaucoup Romain pour ton aide plus que précieuse !
@+++



De rien.
Ceci-dit, la question de pouvoir récupérer les 2 DWORDS d'un QWORD
reste ouverte...et m'intéresse :-)

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)