Menu Content/Inhalt
Accueil arrow Outils arrow WSHShell arrow WSH Shell : Afficher les URL d'une machine distante

Syndication

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

WSH Shell : Afficher les URL d'une machine distante Convertir en PDF Version imprimable Suggérer par mail
Écrit par Gilles LAURENT   
26-08-2008

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

Une question d'un usager sur le Forum Scripting (Fr) était de savoir s'il était possible de déterminer par script les URL des instances Internet Explorer en cours d'exécution sur une machine distante. J'ai tout d'abord pensé, à tord, que le simple fait d'utiliser l'outil PSExec de Windows Sysinternals pour exécuter un script VBScript distant suffirait pour accomplir cette tâche en s'inspirant du précédent article WSH Shell : Afficher les URL. Et bien NON ! Pour la bonne et simple raison que l'outil PSExec n'est pas en mesure d'exécuter à distance un outil ou un script au sein d'une session utilisateur connecté sur une machine distante. Cela n'est pas grave car il y a quelques temps maintenant, j'avais developpé l'outil RunAsLoggedOnUser permettant de réaliser cette tâche (Vous pouvez retrouver l'article concernant cet outil en suivant ce lien). J'ai donc rapidement maquetté une solution, ce qui m'a conduit à mettre à jour l'outil RunAsLoggedOnUser pour, entre autre, ajouter le support de la redirection des flux puis à créer un module externe compatible avec la console WSH Shell. C'est cette solution que je vous présente ici et qui se compose de l'outillage et pré requis suivants :

1- Sur la machine d'administration :

  • De la classe VBScript _wshRemoteIExplore.inc (module externe WSH Shell)
    Ce module est à déposer dans le sous-dossier Include de la console WSH Shell
  • De l'outil PSExec de Windows Sysinternals
  • De l'outil RunAsLoggedOnUser de moi-même ;-)
    Il est absolument nécessaire d'utiliser la version supérieure ou égale à la v1.0.0.3
  • Du composant COM DynaWrap (version étendue obligatoire)
    Ce composant a besoin d'être inscrit dans le registre via la commande regsvr32 sur la machine d'administration. Il est à noter que cette opération est automatiquement réalisée depuis la version v1.0.0.9 du setup WSH Shell si le composant DynaWrap - DynaCall Wrapper a été sélectionné dans la liste des composants additionnels à installer)

Note : Le composant COM DynaWrap est utilisé pour invoquer les API Win32 suivantes :

  • NetApiBufferFree
  • NetWkstaGetInfo
  • PathFindOnPathW

2- Sur la machine distante :

  • Du script VBScript IExplore.vbs (à installer par défaut à la racine de la partition C:\)
    La propriété RemoteScriptFolder de la classe wshRemoteIExplore permet de modifier ce chemin par défaut. Ce script pourra, par exemple, être installé dans le dossier partagé netlogon d'un contrôleur de domaine pour les postes membres d'un domaine. Dans ce cas, il faudra utiliser la syntaxe d'expansion retardée des variables d'environnement compatible avec l'outil RunAsLoggedOnUser, c'est à dire :
    WSH D:\Test> oRemoteIE.RemoteScriptFolder="{logonserver}\netlogon"
  • Du composant COM DynaWrap (version étendue obligatoire)
    Il est facilement possible de s'affranchir de ce pré requis si uniquement les URL doivent être affichées. Le script IExplore.vbs devra dans ce cas être adapté en conséquence

Note : Le composant COM Dynawrap est utilisé pour invoquer l'API Win32 suivante :

  • GetWindowThreadProcessId

Important : Comme le soulignait à juste titre Jacques Barathon [MS] dans ce fil de discussion, j'attire également votre attention sur le risque d'illégalité de l'utilisation de cette solution si les utilisateurs finaux ne sont pas prévenus que leur navigation Internet est susceptible d'être surveillée. Cette solution (scripts VBScript ainsi que les outils personnels développés qui l'accompagne) est destinée à un usage à but purement éducatif et non à un usage dans le cadre d'une utilisation illégale.

Bon, le décor étant maintenant planté, il est temps de démarrer une console WSH Shell pour tester ce nouveau module externe ! Les commentaires se font au fil de l'eau en ligne de commandes dans la console.

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.9 starting ...                           
                                                                                
Registering components ...                                                      
                                                                                
Loading external modules ...                                                    
  Loading _wshAdsi.inc ...                                                      
  Loading _wshCalendar.inc ...                                                  
  Loading _wshCodeSyntaxing.inc ...                                             
  Loading _wshComputerToolbox.inc ...                                           
  Loading _wshCultures.inc ...                                                  
  Loading _wshFtp.inc ...                                                       
  Loading _wshIExplore.inc ...                                                  
  Loading _wshIni.inc ...                                                       
  Loading _wshModuleManager.inc ...                                             
  Loading _wshRemoteIExplore.inc ...                                            
  Loading _wshTaskView.inc ...                                                  
  Loading _wshWmi.inc ...                                                       
                                                                                
Loading profiles ...                                                            
  Loading D:\Users\Dev\Copyright\WSH\Release\WSHShell_Profile.inc ...           
  Loading D:\Documents and Settings\Gilles\Mes documents\WSH Shell\WSHShell_P...
                                                                                
Welcome ...                                                                     
It's 25/08/2008 18:46:48 and WSH Shell is up !                                  
                                                                                
Ready.                                                                          
                                                                                
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, comme d'habitude, à   
WSH D:\Test> ' créer une instance pour en bénéficier                            
WSH D:\Test> Set oRemoteIE=New wshRemoteIExplore                                
WSH D:\Test>                                                                    
WSH D:\Test> ' détermination des membres (méthodes et propriétés)               
WSH D:\Test> gm(oRemoteIE)                                                      
                                                                                
Category  Name                                                                  
--------  ----                                                                  
Function  CheckPrerequisites ()                                                 
Function  GetRemoteIERunningInstances (strComputer)                             
Function  IsUserLoggedIn (strComputer)                                          
Property  OptionalToolsFolder                                                   
Property  RemoteScriptFolder                                                    
Property  Verbose                                                               
Property  Version                                                               
                                                                                
WSH D:\Test> ' la méthode "CheckPrerequisites ()" permet de vérifier que les    
WSH D:\Test> ' pré requis sont bien présent dans un dossier référencé par la    
WSH D:\Test> ' variable d'environnement Path ou alors dans le dossier pointé    
WSH D:\Test> ' par la propriété OptionalToolsFolder                             
WSH D:\Test> ' les pré requis sont les deux outils suivants :                   
WSH D:\Test> ' - PsExec de Windows Sysinternals                                 
WSH D:\Test> ' - RunAsLoggedOnUser >= 1.0.0.3 disponible sur mon site           
WSH D:\Test>                                                                    
WSH D:\Test> ' vérification des pré requis                                      
WSH D:\Test> echo CStr (oRemoteIE.CheckPrerequisites ())                        
Checking prerequisites ...                                                      
PSExec.exe            : Faux                                                    
RunAsLoggedOnUser.exe : Faux                                                    
Operation completed successfully                                                
Faux                                                                            
WSH D:\Test> ' les deux outils ne sont pas installés ou non présents dans l'un  
WSH D:\Test> ' des dossiers référencé par la variable d'environnement Path      
WSH D:\Test> ' en fait, j'ai installé ces deux outils dans le dossier "D:\Test" 
WSH D:\Test> oRemoteIE.OptionalToolsFolder = "D:\Test"                          
Checking Tools Folder ...                                                       
Tools folder exists on this machine : D:\TEST                                   
Operation completed successfully                                                
WSH D:\Test> ' ok, le dossier spécifié existe bien sur ma machine locale        
WSH D:\Test> ' nouvelle vérification des pré requis                             
WSH D:\Test> echo CStr (oRemoteIE.CheckPrerequisites ())                        
Checking prerequisites ...                                                      
PSExec.exe            : Vrai                                                    
RunAsLoggedOnUser.exe : Vrai                                                    
Operation completed successfully                                                
Vrai                                                                            
WSH D:\Test> ' tout semble en ordre au niveau de l'outillage nécessaire         
WSH D:\Test> ' une autre étape consiste à s'assurer qu'un utilisateur est bien  
WSH D:\Test> ' connecté sur la machine distante                                 
WSH D:\Test> ' pour cela il suffit d'utiliser la méthode "IsUserLoggedIn" en    
WSH D:\Test> ' spécifiant comme paramètre le nom NetBIOS ou DNS de la machine   
WSH D:\Test> ' distante                                                         
WSH D:\Test> echo CStr (oRemoteIE.IsUserLoggedIn ("\\homem500"))                
Trying to connect to \\HOMEM500 ...                                             
Number of logged on users (including service accounts) : 2                      
At least on user is logged in to \\HOMEM500                                     
Operation completed successfully                                                
Vrai                                                                            
WSH D:\Test> ' au moins un utilisateur semble être connecté sur la machine      
WSH D:\Test> ' distance HOMEM500                                                
WSH D:\Test> ' Note: Les comptes de service sont également comptabilisés !      
WSH D:\Test>                                                                    
WSH D:\Test> ' le script VBScript distant doit être présent dans un dossier     
WSH D:\Test> ' de la machine distante. Ce script VBScript porte le nom :        
WSH D:\Test> ' IExplore.vbs. Par défaut, il doit être présent à la racine de    
WSH D:\Test> ' la partition C:\. Ce dossier par défaut peut être modifié via    
WSH D:\Test> ' la propriété "RemoteScriptFolder"                                
WSH D:\Test> ' affichage du dossier distant défini par défaut                   
WSH D:\Test> echo oRemoteIE.RemoteScriptFolder                                  
C:\                                                                             
WSH D:\Test> ' lecture des URL Internet Explorer (ici la version IE7)           
WSH D:\Test> ' - deux onglets dans une instance IE7                             
WSH D:\Test> ' - un seul onglet dans une autre instance IE7                     
WSH D:\Test> arrURL=oRemoteIE.GetRemoteIERunningInstances ("\\homem500")        
Checking prerequisites ...                                                      
PSExec.exe            : Vrai                                                    
RunAsLoggedOnUser.exe : Vrai                                                    
Operation completed successfully                                                
Creating temporary file ...                                                     
Running remote command ...                                                      
Checking result ...                                                             
Reading remote URL ...                                                          
Operation completed successfully                                                
WSH D:\Test> ' Tout est "successfully" ;-)                                      
WSH D:\Test> ' combien d'URL utilise l'utilisateur sur la machine distante ?    
WSH D:\Test> echo UBound (arrURL)                                               
3                                                                               
WSH D:\Test> ' l'utilisateur connecté sur la machine distante HOMEM500 utilise  
WSH D:\Test> ' actuellement trois URL                                           
WSH D:\Test> ' mais quelles sont ces URL consultées ?                           
WSH D:\Test> ' affichage formaté des instances IE                               
WSH D:\Test> ft arrURL,"Id","","*"                                              
                                                                                
Id    Name          URL                                                         
--    ----          ---                                                         
2568  iexplore.exe  http://glsft.free.fr/                                       
3512  iexplore.exe  http://fr.msn.com/                                          
3512  iexplore.exe  http://www.google.fr/                                       
                                                                                
WSH D:\Test> ' Enjoy !                                                          

Tip_1 : Fixer la propriété Verbose à False désactive le mode verbeux ;-)

Vous trouverez ci-dessous le listing du module externe _wshRemoteIExplore.inc de la console WSH Shell ainsi que le listing du script VBScript IExplore.vbs à déposer celui-ci sur la machine distante.

Listing 1 : _wshRemoteIExplore.inc

  1. '
  2. '    Windows Script Host (WSH) Shell
  3. '    (c) 2008 Gilles LAURENT
  4. '    wshRemoteIExplore Class v1.0.0.1
  5. '
  6. Option Explicit
  7. ' spécification des objets COM requis pour exécuter ce module externe
  8. ' un message d'erreur s'affichera lors du chargement du module externe
  9. ' si les pré requis ne sont pas vérifiés et la classe ne sera pas chargée
  10. ' en mémoire donc ne pourra être instanciée
  11. shell.Require "DynamicWrapper"
  12. Class WSHRemoteIExplore
  13. ' =========================
  14. ' == PRIVATE PROPERTIES
  15. ' =========================
  16.     Private m_oFs, m_oRe, m_oDyn, m_oSh
  17.     Private m_strToolsFolder, m_strScriptFolder, m_strRALUPath, m_strPSEPath
  18.     Private m_dwToolsPtr
  19.     Private m_bVerbose
  20. ' =========================
  21. ' == PUBLIC PROPERTIES
  22. ' =========================
  23.     Public Property Get OptionalToolsFolder ()
  24.         OptionalToolsFolder = m_strToolsFolder
  25.     End Property
  26.     Public Property Let OptionalToolsFolder (strToolsFolder)
  27.         ' déclaration des variables
  28.         Dim oFolder
  29.         If Not IsNull (strToolsFolder) Then
  30.             ' vérification de l'existance du dossier contenant les outils
  31.             PrintMessage "Checking Tools Folder ..." & Chr (2)
  32.             Set oFolder = m_oFs.GetFolder (strToolsFolder)
  33.             ' le dossier existe
  34.             ' lecture du chemin court
  35.             m_strToolsFolder = oFolder.ShortPath
  36.             PrintMessage "Tools folder exists on this machine : " & UCase (m_strToolsFolder) & Chr (2)
  37.             ' libération de l'objet
  38.             Set oFolder = Nothing
  39.         Else
  40.             ' le dossier n'est pas spécifié
  41.             m_strToolsFolder = Null
  42.         End If
  43.         
  44.         ' détermination de l'adresse de la chaine de caractères
  45.         m_dwToolsPtr = m_oDyn.GetBSTRAddr (m_strToolsFolder)
  46.         ' traitement achevé avec succès
  47.         PrintMessage "Operation completed successfully" & Chr (2)
  48.     End Property
  49.     Public Property Get RemoteScriptFolder ()
  50.         RemoteScriptFolder = m_strScriptFolder
  51.     End Property
  52.     Public Property Let RemoteScriptFolder (strScriptFolder)
  53.         PrintMessage "Remote script folder set to " & UCase (strScriptFolder) & Chr (2)
  54.         m_strScriptFolder = strScriptFolder
  55.         ' traitement achevé avec succès
  56.         PrintMessage "Operation completed successfully" & Chr (2)
  57.     End Property        
  58.     Public Property Get Verbose ()
  59.         Verbose = m_bVerbose
  60.     End Property
  61.     Public Property Let Verbose (bValue)
  62.         m_bVerbose = CBool (bValue)
  63.     End Property
  64.         
  65.     Public Property Get Version ()
  66.         m_oRe.Pattern="\r\n\'.+?[vV]((\d+\.?){3}(\.\d+)?)\r\n"
  67.         Version = m_oRe.Execute (m_oFs.OpenTextFile (shell.Path & "\Include\_" & TypeName (Me) & ".inc", 1, False).ReadAll ())(0).SubMatches (0)
  68.     End Property
  69. ' =========================
  70. ' == PRIVATE MEMBERS
  71. ' =========================
  72.     Private Sub Class_Initialize ()
  73.         ' initialisation des objets
  74.         Set m_oDyn = CreateObject ("DynamicWrapper")
  75.         Set m_oFs = CreateObject ("Scripting.FileSystemObject")
  76.         Set m_oSh = CreateObject ("WScript.Shell")
  77.         Set m_oRe = New RegExp
  78.         ' initialisation des variables
  79.         m_bVerbose = True
  80.         m_strToolsFolder = Null
  81.         m_strScriptFolder = "C:\"
  82.         m_dwToolsPtr = m_oDyn.GetBSTRAddr (m_strToolsFolder)
  83.         ' déclaration des API Win32 (prototypes)
  84.         m_oDyn.Register "shlwapi.dll", "PathFindOnPathW", "f=s", "r=b", "i=ll"
  85.         m_oDyn.Register "netapi32.dll", "NetApiBufferFree", "f=s", "r=l", "i=l"
  86.         m_oDyn.Register "netapi32.dll", "NetWkstaGetInfo", "f=s", "r=l","i=lll"
  87.         ' définition des propriétés de l'expression régulière
  88.         m_oRe.IgnoreCase = True
  89.         m_oRe.Multiline = False
  90.         m_oRe.Global = True
  91.     End Sub
  92.     Private Sub Class_Terminate ()
  93.         ' libération des objets
  94.         Set m_oRe = Nothing
  95.         Set m_oSh = Nothing
  96.         Set m_oFs = Nothing
  97.         Set m_oDyn = Nothing
  98.     End Sub
  99.     Private Sub PrintMessage (str)
  100.         ' le message s'affiche uniquement en mode verbeux
  101.         If Verbose Then WScript.Echo str
  102.     End Sub
  103. ' =========================
  104. ' == PUBLIC MEMBERS
  105. ' =========================
  106.     Public Function CheckPrerequisites ()
  107.         ' déclaration des variables
  108.         Dim bRet(1)
  109.         Dim strFileName
  110.         ' vérification de la présence des pré requis
  111.         PrintMessage "Checking prerequisites ..." & Chr (2)
  112.         strFileName=Left("PSExec.exe" & String(260,0), 260)
  113.         bRet(0) = m_oDyn.PathFindOnPathW (m_oDyn.GetBSTRAddr(strFileName), m_oDyn.GetVariantAddr (m_dwToolsPtr))
  114.         PrintMessage "PSExec.exe            : " & CStr (bRet(0)) & Chr (2)
  115.         ' sauvegarde du chemin complet de l'outil PSExec.exe
  116.         m_strPSEPath = Left(strFileName, InStr(strFileName, Chr(0)) - 1)
  117.         strFileName=Left("RunAsLoggedOnUser.exe" & String(260,0), 260)
  118.         bRet(1) = m_oDyn.PathFindOnPathW (m_oDyn.GetBSTRAddr(strFileName), m_oDyn.GetVariantAddr (m_dwToolsPtr))
  119.         PrintMessage "RunAsLoggedOnUser.exe : " & CStr (bRet(1)) & Chr (2)
  120.         ' sauvegarde du chemin complet de l'outil RunAsLoggedOnUser.exe
  121.         m_strRALUPath = Left(strFileName, InStr(strFileName, Chr(0)) - 1)
  122.         ' traitement achevé avec succès
  123.         PrintMessage "Operation completed successfully" & Chr (2)
  124.         ' retour du résultat de l'opération
  125.         CheckPrerequisites = bRet(0) And bRet(1)
  126.     End Function
  127.     Public Function GetRemoteIERunningInstances (strComputer)
  128.         ' déclaration des variables
  129.         Dim strTempFileName, strCmd
  130.         Dim arrContent
  131.         ' vérification de la présence des pré requis
  132.         If CheckPrerequisites () = True Then
  133.             ' création d'un fichier temporaire
  134.             PrintMessage "Creating temporary file ..." & Chr (2)
  135.             strTempFileName = m_oFs.GetSpecialFolder (2) & "\" & m_oFs.GetTempName ()
  136.             ' préparation de la commande
  137.             strCmd = "%COMSPEC% /c " & m_strPSEPath & " " & strComputer & " -accepteula -s -c " & m_strRALUPath & " -hide -wait -cmd " & Chr(34) & "cscript.exe //nologo " & m_strScriptFolder & "\IExplore.vbs" & Chr(34) & "2>nul >" & strTempFileName
  138.             ' exécution de la commande distante
  139.             ' la méthode Exec ne semble pas fonctionner avec l'outil psexec :-(
  140.             PrintMessage "Running remote command ..." & Chr (2)
  141.             m_oSh.Run strCmd, 0, True
  142.             ' vérification du résultat de l'opération
  143.             PrintMessage "Checking result ..." & Chr(2)
  144.             ' le fichier peut être vide sur la machine distante est inaccessible
  145.             ' il est donc nécessaire de gérer les erreurs
  146.             On Error Resume Next
  147.             arrContent = Shell.GetFileContent (strTempFileName)
  148.             On Error Goto 0
  149.             ' le fichier ne doit pas être vide !
  150.             If IsArray (arrContent) Then
  151.                 ' vérification de la présence du header
  152.                 If arrContent(0) = "Id,Name,URL" Then
  153.                     ' lecture des url
  154.                     PrintMessage "Reading remote URL ..." & Chr (2)
  155.                     GetRemoteIERunningInstances = Shell.StringToArray (Replace (Shell.ArrayToString (arrContent), ",", Shell.strTableFieldSep))
  156.                     ' traitement achevé avec succès
  157.                     PrintMessage "Operation completed successfully" & Chr (2)
  158.                 Else
  159.                     ' une erreur est survenue
  160.                     WScript.Echo ":: An error occurred" & Chr (1) & " :: Remote process failed to execute"
  161.                 End If
  162.             Else
  163.                 ' une erreur est survenue
  164.                 WScript.Echo ":: An error occurred" & Chr (1) & " :: Temporary file is empty !"
  165.             End If
  166.             ' suppression du fichier temporaire
  167.             If m_oFs.FileExists (strTempFileName) Then m_oFs.DeleteFile strTempFileName, True
  168.         Else
  169.             ' les pré requis ne sont pas vérifiés
  170.             ' Impossible d'exécuter l'opération requise
  171.             Err.Raise 17
  172.         End If
  173.     End Function
  174.     Public Function IsUserLoggedIn (strComputer)
  175.         ' déclaration des variables
  176.         Dim bUserLoggedIn: bUserLoggedIn = False
  177.         Dim lRet, lBufferAddr, lBufferPtr, lNbLoggedOnUsers
  178.         ' récupération des informations de niveau 102
  179.         ' la structure WKSTA_INFO_102 est allouée par le système
  180.         PrintMessage "Trying to connect to " & UCase (strComputer) & " ..." & Chr (2)
  181.         lRet = m_oDyn.NetWkstaGetInfo (m_oDyn.GetBSTRAddr (strComputer), 102, m_oDyn.GetVariantAddr (lBufferAddr))
  182.         ' vérification du résultat de l'opération
  183.         If lRet = 0 Then
  184.             ' l'opération a réussi
  185.             ' récupération du pointeur sur la structure WKSTA_INFO_102 (LPBYTE *)
  186.             lBufferPtr = m_oDyn.GetMemInBSTRAddr(m_oDyn.GetVariantAddr (lBufferAddr), 0, 4)
  187.             ' détermination du nombre d'utilisateur connecté sur la machine distante
  188.             lNbLoggedOnUsers = m_oDyn.GetMemInBSTRAddr (lBufferPtr, 24, 4)
  189.             PrintMessage "Number of logged on users (including service accounts) : " & lNbLoggedOnUsers & Chr (2)
  190.             ' évaluation du nombre d'utilisateur connecté
  191.             If lNbLoggedOnUsers > 0 Then
  192.                 ' au moins un utilisateur est connecté sur la machine distante
  193.                 PrintMessage "At least on user is logged in to " & UCase (strComputer) & Chr (2)
  194.                 bUserLoggedIn = True
  195.             Else
  196.                 ' aucun utilisateur connecté sur la machine distante
  197.                 PrintMessage "No user is logged in to " & UCase (strComputerName)
  198.             End If
  199.             ' libération du buffer alloué par le système
  200.             m_oDyn.NetApiBufferFree (lBufferAddr)
  201.         Else
  202.             ' une erreur est survenue
  203.             WScript.Echo ":: An error occurred (" & lRet & ")" & Chr (1) & " :: " & m_oDyn.FormatMessage (lRet)
  204.         End If
  205.         ' traitement achevé avec succès
  206.         PrintMessage "Operation completed successfully" & Chr (2)
  207.         ' retour du résultat de l'opération
  208.         IsUserLoggedIn = bUserLoggedIn
  209.         
  210.     End Function
  211. End Class

Listing 2 : IExplore.vbs

  1. Option Explicit
  2. ' déclaration des variables
  3. Dim oDyn, oApp, oWindow, oProc
  4. Dim dwPid: dwPid=CLng(0)
  5. ' initialisation des objets
  6. Set oDyn=CreateObject("DynamicWrapper")
  7. Set oApp=CreateObject("Shell.Application")
  8. ' déclaration des API Win32 (prototypes)
  9. oDyn.Register "User32.dll", "GetWindowThreadProcessId", "f=s", "r=l", "i=hl"
  10. ' écriture du header dans le flux stdout
  11. WScript.Echo "Id,Name,URL"
  12. ' énumération des instances Explorer et Internet Explorer
  13. For Each oWindow In oApp.windows
  14.     ' détermination du pid du processus
  15.     oDyn.GetWindowThreadProcessId oWindow.HWND, oDyn.GetVariantAddr(dwPid)
  16.     ' détermination du nom du processus
  17.     Set oProc = GetObject("winmgmts:/root/cimv2:Win32_Process.Handle='" & dwPid & "'")
  18.     ' écriture des informations dans le flux stdout
  19.     WScript.Echo oProc.ProcessId & "," & oProc.Name & "," & oWindow.LocationURL
  20. Next
 
Suivant >