0

Est-ce que quelqu'un sait comment je pourrais trouver quand un certificat pour l'utilisateur est expiré? Je sais que je peux me tirer tous les certificats pour un utilisateur donné par usin le code suivant:Savoir quand le certificat d'un utilisateur va expirer

Set objUserTemplate = _ 
    GetObject("LDAP://cn=userTemplate,OU=Management,dc=NA,dc=fabrikam,dc=com") 
arrUserCertificates = objUserTemplate.GetEx("userCertificate") 

Mais alors comment dois-je procéder vote à la date d'expiration d'un certificat donné? Je ne vois ce code java ici: http://forums.novell.com/novell-developer-forums/dev-ldap/364977-q-retrieving-users-public-key-over-ldap.html,

X509Certificate cert = (X509Certificate)it.next(); 
java.util.Date expires = cert.getNotAfter(); 
GregorianCalendar calNow = new GregorianCalendar(); 
GregorianCalendar calExp = new GregorianCalendar(); 
calExp.setTime(expires); 
//issuerDN = cert.getIssuerDN().getName(); 
int daysTilExp = com.willeke.utility.DateUtils.daysPast(calExp); 
long diffDays = com.willeke.utility.DateUtils.diffDayPeriods(calNow, 
calExp); 
if(diffDays <= 0) 
{ 
String mex = " Will expire in: " + diffDays + " days!"; 

mais je ne sais pas si je peux utiliser la méthode getNotAfter au sein de VB, ou comment j'allais à le faire. Quelqu'un a-t-il une idée? Si possible, je voudrais aider à faire cette requête dans VBScript/VB.Net/VBA, etc.

J'ai trouvé ce VBScript code here qui semble faire ce que j'essaye d'accomplir, mais qui semble assez complexe , où le code java semblait beaucoup plus simple. Y at-il un moyen plus facile de faire cette requête dans une certaine saveur de VB?

Sur le site Cruto:

On Error Resume Next 

Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D 
Const ForWriting = 2 
Const WshRunning = 0 

Set objUser = GetObject _ 
    ("GC://cn=MyerKen,ou=Management,dc=NA,dc=fabrikam,dc=com") 
objUser.GetInfoEx Array("userCertificate"), 0 
arrUserCertificates = objUser.GetEx("userCertificate") 

If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then 
    WScript.Echo "No assigned certificates" 
    WScript.Quit 
Else 
    Set objShell = CreateObject("WScript.Shell") 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    strPath = "." 
    intFileCounter = 0 

    For Each arrUserCertificate in arrUserCertificates 
     strFileName = "file" & intFileCounter 
     strFullName = objFSO.BuildPath(strPath, strFileName) 
     Set objFile = objFSO.OpenTextFile(strFullName, ForWriting, True) 

     For i = 1 To LenB(arrUserCertificate) 
      ReDim Preserve arrUserCertificatesChar(i - 1) 
      arrUserCertificatesChar(i-1) = _ 
       Hex(AscB(MidB(arrUserCertificate, i, 3))) 
     Next 

     intCounter=0 
     For Each HexVal in arrUserCertificatesChar 
      intCounter=intCounter + 1 
      If Len(HexVal) = 1 Then 
       objFile.Write(0 & HexVal & " ") 
      Else 
       objFile.Write(HexVal & " ") 
      End If 
     Next 
     objFile.Close 
     Set objFile = Nothing 

     Set objExecCmd1 = objShell.Exec _ 
      ("certutil -decodeHex " & strFileName & " " & strFileName & ".cer") 
     Do While objExecCmd1.Status = WshRunning 
      WScript.Sleep 100 
     Loop 
     Set objExecCmd1 = Nothing 

     Set objExecCmd2 = objShell.Exec("certutil " & strFileName & ".cer") 
     Set objStdOut = objExecCmd2.StdOut 
     Set objExecCmd2 = Nothing 

     WScript.Echo VbCrLf & "Certificate " & intFileCounter + 1 
     While Not objStdOut.AtEndOfStream 
      strLine = objStdOut.ReadLine 
      If InStr(strLine, "Issuer:") Then 
       WScript.Echo Trim(strLine) 
       WScript.Echo vbTab & Trim(objStdOut.ReadLine) 
      End If 
      If InStr(strLine, "Subject:") Then 
       Wscript.Echo Trim(strLine) 
       WScript.Echo vbTab & Trim(objStdOut.ReadLine) 
      End If 
      If InStr(strLine, "NotAfter:") Then 
       strLine = Trim(strLine) 
       WScript.Echo "Expires:" 
       Wscript.Echo vbTab & Mid(strLine, 11) 
      End If 
     Wend 

     objFSO.DeleteFile(strFullName) 
     objFSO.DeleteFile(strPath & "\" & strFileName & ".cer") 

     intFileCounter = intFileCounter + 1 
    Next 
End If 

Mise à jour je ne voyais que je pouvais import the certificate into the CAPICOM objet à retourner la ValidToDate propriété, mais apparemment le format inwhich il est stocké dans AD est de format incorrect selon cette poster ici: http://www.powershellcommunity.org/Forums/tabid/54/aff/4/aft/1639/afv/topic/Default.aspx

Est-ce que quelqu'un sait quel format est attendu de la fonction d'importation CAPICOM?

Répondre

1

Microsoft possède un contrôle ActiveX appelé CAPICOM qui vous permet d'accéder par programme à diverses propriétés du certificat. Le MSDN CAPICOM article détaille ces fonctions. Le Platform SDK (lié à partir du lien Where to get it) inclut des exemples, de la documentation et le contrôle redistribuable. Les exemples incluent des exemples VBScript. J'ai trouvé le téléchargement pour le Platform SDK here.

En bref, une fois que vous avez récupéré le certificat, vous êtes à la recherche de la ValidFromDate et ValidToDate propriétés.

+0

J'ai vu ce code PowerShell (http://bit.ly/9IdB8) où il a montré comment je pouvais le faire en utilisant Capicom, mais encore une fois le code ne fonctionnait pas pour lui car il renvoyait le CERT dans un format que Capicom n'a pas pu reconnaître: $ pfad = "LDAP: // serveur/cn =" + $ tnummer + ", ou = operationsaccounts, ou = useraccounts, dc = domaine, dc = net" $ utilisateur = Nouveau-Objet DirectoryServices.DirectoryEntry ($ pfad) $ userCerts = $ utilisateur.GetEX ("userCertificate") !!! peut dans cette ligne je reçois le mauvais format $ oCert = New-Object -com "CAPICOM.Certificate" foreach ($ Certificat en $ userCerts) { $ oCert.import ($ Certificate) $ oCert.ValidToDate } – mrTomahawk