Menu Content/Inhalt
Accueil arrow Outils arrow WSHShell arrow WSH Shell : Afficher les URL

Syndication

Abonnez-vous à ce fil RSS pour être tenu informé des nouveautés de ce site.

WSH Shell : Afficher les URL Convertir en PDF Version imprimable Suggérer par mail
Écrit par Gilles LAURENT   
10-04-2008

WSH Shell : Afficher les URL des instances Internet Explorer en cours d'exécution

Une question d'un usager sur le forum Scripting (Fr) était de savoir comment récupérer par script les URL des instances Internet Explorer en cours d'exécution. Vous pouvez retrouver ce fil ici :

Je me suis amusé à réaliser cet exercice en VBScript en m'appuyant sur la console WSH Shell. J'ai finalement abouti à la solution proposée ci-dessous qui se compose :

  • De la classe VBScript _wshIExplore.inc
    Ce module est à déposer dans le sous-dossier Include de la console WSH Shell
  • Du composant COM externe dyncall.dll (wrapper Dynawrap)
    Ce composant a besoin d'être inscrit dans le registre via la commande regsvr32
    Toutefois si la console WSH Shell est démarrée sous l'autorité de l'administrateur local alors il suffit de déposer le composant dans le sous-dossier Com de la console WSH Shell. Dans ce cas l'enregistrement du composant est automatique ;-)

Note : Dans le cadre de ce projet, le composant COM est utilisé pour invoquer les API Win32 suivantes :

  • GetWindowThreadProcessId
  • lstrcat
  • RtlMoveMemory

Microsoft (R) Windows Script Host Version 5.6                                   
Copyright (C) Microsoft Corporation 1996-2001. Tous droits réservés.            
                                                                                
 _ _ _  ___  _ _   ___  _         _  _                                          
| | | |/ __>| | | / __>| |_  ___ | || |                                         
| | | |\__ \|   | \__ \| . |/ ._>| || |                                         
|__/_/ <___/|_|_| <___/|_|_|\___.|_||_|                                         
                                                                                
Windows Script Host (WSH) Shell v1.0.0.8 starting ...                           
                                                                                
Registering components ...                                                      
  Registering dyncall.dll ...                                                   
                                                                                
Loading external modules ...                                                    
  Loading _wshAdsi.inc ...                                                      
  Loading _wshIExplore.inc ...                                                  
  Loading _wshIni.inc ...                                                       
  Loading _wshTaskView.inc ...                                                  
  Loading _wshWmi.inc ...                                                       
                                                                                
Loading profiles ...                                                            
  Loading H:\Home\WSH\WSHShell_Profile.inc ...                                  
                                                                                
Welcome ...                                                                     
It's 10/04/2008 14:46:58 and WSH Shell is up !                                  
                                                                                
Ready.                                                                          
                                                                                
WSH D:\Test> ' le composant COM externe dyncall a été enregistré de manière     
WSH D:\Test> ' automatique lors du démarrage de la console (cela nécessite que  
WSH D:\Test> ' la console soit démarrée avec les droits appropriés)             
WSH D:\Test> ' notre nouveau module est bien présent dans la liste des modules  
WSH D:\Test> ' automatiquement chargés. Il ne reste plus qu'à créer une         
WSH D:\Test> ' instance pour en bénéficier                                      
WSH D:\Test> Set oIE=New wshIExplore                                            
WSH D:\Test> ' détermination des membres (méthodes et propriétés)               
WSH D:\Test> gm(oIE)                                                            
                                                                                
Category  Name                                                                  
--------  ----                                                                  
Function  GetIERunningInstances ()                                              
Property  InstanceCount                                                         
Property  Version                                                               
                                                                                
WSH D:\Test> ' combien d'instances IE sont actuellement en cours d'exécution ?  
WSH D:\Test> echo oIE.InstanceCount                                             
11                                                                              
WSH D:\Test> ' affichage formaté des instances IE en cours (id, nom et URL)     
WSH D:\Test> ft oIE.GetIERunningInstances(),"Id","","*"                         
                                                                                
Id    Name          URL                                                         
--    ----          ---                                                         
504   IEXPLORE.EXE  http://www.suez.com/fr/suez/                                
1064  IEXPLORE.EXE  http://www.microsoft.com/communities/newsgroups/en-us/def...
1064  IEXPLORE.EXE  http://glsft.free.fr/index.php?option=com_content&task=vi...
1064  IEXPLORE.EXE  http://glsft.free.fr/administrator/index.php?mosmsg=Sessi...
1064  IEXPLORE.EXE  http://www.google.fr/search?hl=fr&q=axiome+chanteloup&met...
1064  IEXPLORE.EXE  http://www.google.fr/                                       
1064  IEXPLORE.EXE  http://www.google.fr/                                       
1064  IEXPLORE.EXE  http://www.google.fr/search?hl=fr&q=html+table+scroll&met...
1064  IEXPLORE.EXE  http://msdn2.microsoft.com/en-us/library/aa390351(VS.85)....
1064  IEXPLORE.EXE  http://www.google.fr/search?hl=fr&q=microsoft+moss&meta=    
1304  explorer.exe  file:///D:/                                                 
                                                                                
WSH D:\Test> ' NOTE: on remarque que plusieurs instances d'Internet Explorer    
WSH D:\Test> ' sont affichées ici avec deux Id distincts (504) et (1064)        
WSH D:\Test> ' - le premier processus (504) gère une seule instance de fenêtre  
WSH D:\Test> ' - le second processus (1064) gère neuf instances de fenêtre      
WSH D:\Test> ' NOTE: une instance de l'explorateur de fichiers est également    
WSH D:\Test> ' affichée ici avec l'Id (1304)                                    
WSH D:\Test>                                                                    
WSH D:\Test> ' démarrage d'une nouvelle instance d'Internet Explorer            
WSH D:\Test> Set oIEInst=co("InternetExplorer.Application")                     
WSH D:\Test> oIEInst.Navigate("http://www.yahoo.fr")                            
WSH D:\Test> oIEInst.Visible=True                                               
WSH D:\Test>                                                                    
WSH D:\Test> ' affichage formaté des instances IE en cours (id, nom et URL)     
WSH D:\Test> ft oIE.GetIERunningInstances(),"Id","Name Like 'IE*'","*"          
                                                                                
Id    Name          URL                                                         
--    ----          ---                                                         
504   IEXPLORE.EXE  http://www.suez.com/fr/suez/                                
1064  IEXPLORE.EXE  http://www.microsoft.com/communities/newsgroups/en-us/def...
1064  IEXPLORE.EXE  http://glsft.free.fr/index.php?option=com_content&task=vi...
1064  IEXPLORE.EXE  http://glsft.free.fr/administrator/index.php?mosmsg=Sessi...
1064  IEXPLORE.EXE  http://www.google.fr/search?hl=fr&q=axiome+chanteloup&met...
1064  IEXPLORE.EXE  http://www.google.fr/                                       
1064  IEXPLORE.EXE  http://www.google.fr/                                       
1064  IEXPLORE.EXE  http://www.google.fr/search?hl=fr&q=html+table+scroll&met...
1064  IEXPLORE.EXE  http://msdn2.microsoft.com/en-us/library/aa390351(VS.85)....
1064  IEXPLORE.EXE  http://www.google.fr/search?hl=fr&q=microsoft+moss&meta=    
1064  IEXPLORE.EXE  http://fr.yahoo.com/                                        
                                                                                
WSH D:\Test> ' la nouvelle instance de fenêtre apparaît bien dans la liste      
WSH D:\Test> ' maintenant démarrage d'un nouveau processus Internet Explorer    
WSH D:\Test> ' de manière interactive                                           
WSH D:\Test> ' la nouvelle instance pointe sur le site web Mappy                
WSH D:\Test>                                                                    
WSH D:\Test> ' affichage formaté des instances IE en cours (id, nom et URL)     
WSH D:\Test> ft oIE.GetIERunningInstances(),"Id","URL Like '%mappy%'","*"       
                                                                                
Id    Name          URL                                                         
--    ----          ---                                                         
1708  IEXPLORE.EXE  http://www.mappy.fr                                         
                                                                                
WSH D:\Test> ' la nouvelle instance d'Internet Explorer possède le pid (1708)   
WSH D:\Test> ' Enjoy !                                                          
WSH D:\Test>                                                                    

Listing 1 : _wshIExplore.inc

  1. '
  2. '    Windows Script Host (WSH) Shell
  3. '    (c) 2008 Gilles LAURENT
  4. '    wshIExplore Class v1.0.0.1
  5. '
  6. Option Explicit
  7. Class WSHIExplore
  8. ' =========================
  9. ' == PRIVATE PROPERTIES
  10. ' =========================
  11.     Private oFs, oRe, oDyn
  12. ' =========================
  13. ' == PUBLIC PROPERTIES
  14. ' =========================
  15.     Public Property Get InstanceCount ()
  16.         InstanceCount = UBound (Me.GetIERunningInstances ())
  17.     End Property
  18.     Public Property Get Version ()
  19.         oRe.Pattern="v(\d\.\d.*)"
  20.         Version = oRe.Execute (oFs.OpenTextFile ("Include\_wshIExplore.inc", 1, False).ReadAll ())(0).SubMatches (0)
  21.     End Property
  22. ' =========================
  23. ' == PRIVATE MEMBERS
  24. ' =========================
  25.     Private Sub Class_Initialize ()
  26.         ' initialisation des objets
  27.         Set oDyn = CreateObject ("DynamicWrapper")
  28.         Set oFs = CreateObject ("Scripting.FileSystemObject")
  29.         Set oRe = New RegExp
  30.         ' déclaration des API Win32 (prototypes)
  31.         oDyn.Register "User32.dll", "GetWindowThreadProcessId", "f=s", "r=l", "i=hl"
  32.         oDyn.Register "kernel32.dll", "lstrcat", "f=s", "r=l", "i=ws"
  33.         oDyn.Register "kernel32.dll", "RtlMoveMemory", "f=s", "r=l", "i=lll"
  34.         ' définition des propriétés de l'expression régulière
  35.         oRe.IgnoreCase = True
  36.         oRe.Multiline = False
  37.         oRe.Global = True
  38.     End Sub
  39.     Private Sub Class_Terminate ()
  40.         ' libération des objets
  41.         Set oFs = Nothing
  42.         Set oRe = Nothing
  43.         Set oDyn = Nothing
  44.     End Sub
  45.     Private Function LPSTR (str)
  46.         Dim lpSrc, lpDest
  47.         lpSrc = oDyn.lstrcat (str, "")
  48.         lpDest = oDyn.lstrcat (LPSTR, "")
  49.         LPSTR = CLng (0)
  50.         oDyn.RtlMoveMemory lpDest+8, lpSrc+8, 4
  51.     End Function
  52.     Private Function ReadMemory (lpSrc, nOffset, nSize)
  53.         Dim lpDest
  54.         lpDest = oDyn.lstrcat (ReadMemory, "")
  55.         ReadMemory = CLng (0)
  56.         oDyn.RtlMoveMemory lpDest+8, lpSrc+nOffset, nSize
  57.     End Function
  58. ' =========================
  59. ' == PUBLIC MEMBERS
  60. ' =========================
  61.     Public Function GetIERunningInstances ()
  62.         ' déclaration des variables
  63.         Dim oApp, oWindow, oProc
  64.         Dim strPid
  65.         Dim arrIERI(): Redim arrIERI (0)
  66.         ' initialisation des buffers (allocation mémoire)
  67.         strPid = String (4, VBNullChar)
  68.         ' définition du header
  69.         arrIERI (0) = "Id" & shell.strTableFieldSep & "Name" & shell.strTableFieldSep & "URL"
  70.         ' instanciation de l'objet
  71.         Set oApp = CreateObject ("Shell.Application")
  72.         ' énumération des instances Explorer et Internet Explorer
  73.         For Each oWindow In oApp.Windows ()
  74.             ' détermination du pid du processus
  75.             oDyn.GetWindowThreadProcessId oWindow.HWND, LPSTR (strPid)
  76.             ' détermination du nom du processus
  77.             Set oProc = GetObject ("winmgmts:/root/cimv2:Win32_Process.Handle='" & ReadMemory (LPSTR (strPid), 0, 4) & "'")
  78.             ' sauvegarde des informations
  79.             Redim Preserve arrIERI (UBound (arrIERI) + 1)
  80.             arrIERI (UBound (arrIERI)) = oProc.ProcessId & shell.strTableFieldSep & oProc.Name & shell.strTableFieldSep & oWindow.LocationURL
  81.         Next
  82.         GetIERunningInstances = arrIERI
  83.     End Function
  84. End Class

Dernière mise à jour : ( 10-04-2008 )
 
< Précédent   Suivant >