Débutant Power-Shell

Le
Michel Claveau
Bonsoir !

Avec PowerShell, si on veut utiliser Internet-Explorer par COM, on peut
utiliser :
$ie=(New-Object -com 'InternetExplorer.Application')

Ce que je voudrais, c'est connecter à une instance Internet-Explorer
déjà ouverte.

Avec Python, il suffit de faire
win32com.client.Dispatch('{9BA05972-F6A8-11CF-A442-00A0C90A8F39}')
pour récupérer une liste des handles COM des instances ouvertes.

Comment faire la même chose en PowerShell ?

Merci d'avance.







--
@-salutations

Michel Claveau
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jacques Barathon [MS]
Le #663902
"Michel Claveau" news:
Bonsoir !

Avec PowerShell, si on veut utiliser Internet-Explorer par COM, on peut
utiliser :
$ie=(New-Object -com 'InternetExplorer.Application')

Ce que je voudrais, c'est connecter à une instance Internet-Explorer déjà
ouverte.

Avec Python, il suffit de faire
win32com.client.Dispatch('{9BA05972-F6A8-11CF-A442-00A0C90A8F39}')
pour récupérer une liste des handles COM des instances ouvertes.

Comment faire la même chose en PowerShell ?


La méthode que je connais, pour une raison que je n'explique pas, ne marche
pas pour IE:

$word =
[system.runtime.interopservices.marshal]::GetActiveObject("word.application")

Cette technique permet de récupérer toutes les instances de Word dans la
variable $word. Ca marche également avec Outlook et Excel, et à priori avec
toute application qui a un ProgId. Mais si j'essaie avec
"internetexplorer.application" ça me donne l'erreur méchante suivante:

PS>
$ie=[System.Runtime.InteropServices.Marshal]::GetActiveObject("internetexplorer.application")
Exception calling "GetActiveObject" with "1" argument(s): "Operation
unavailable (Exception from HRESULT: 0x800401E3 (M
K_E_UNAVAILABLE))"
At line:1 char:62
+ $ie=[System.Runtime.InteropServices.Marshal]::GetActiveObject( <<<<
"internetexplorer.application")

Pourtant, je suis sûr d'avoir vu ça marcher avec IE au moins une fois il y a
longtemps. Je vais essayer de retrouver la façon de faire exacte.

Jacques

Michel Claveau
Le #663901
Salut !

J'ai essayé tes exemples de codes, et obtient les mêmes résultats que
toi.







--
@-salutations

Michel Claveau
Gilles LAURENT
Le #663896
"Michel Claveau" le message de news:
| Salut !

Bonsoir,

| J'ai essayé tes exemples de codes, et obtient les mêmes résultats que
| toi.

GetObject (VBScript) ou GetActiveObject (.Net) s'appuient sur la ROT
(Running Object Table) pour rechercher les serveurs COM en cours
d'exécution et retourner les références des instances. Généralement, un
serveur COM enregistre ses instances de manière dynamique dans la ROT
(Excel, Word, ...). Ceci n'est pas le cas de Internet Explorer :-( Donc
que ce soit en VBScript ou en PowerShell (.Net), il n'est pas possible
de se connecter à une instance Internet Explorer par ces méthodes.
Ci-dessous, un transcript WSH issu de mes tests :

*******************************
WSH Transcript Start
Start time : 2007-04-22 20:47:15
Username : xxxAdministrateur
Machine : xxx (Microsoft Windows NT 5.1.2600.1)
*******************************
Transcript started, output file is D:TranscriptGetIEObject.txt

WSH D:test> ' connexion à une instance Excel en cours d'exécution
WSH D:test> set oExcel=GetObject(,"Excel.Application")
WSH D:test> ' ok
WSH D:test> ' connexion à une instance Word en cours d'exécution
WSH D:test> set oWord=GetObject(,"Word.Application")
WSH D:test> ' ok
WSH D:test> ' connexion à une instance Internet Explorer en cours
WSH D:test> set oIE=GetObject(,"InternetExplorer.Application")
:: An error occured (429)
:: Un composant ActiveX ne peut pas créer un objet.

WSH D:test>

Transcript stopped.

--
Gilles LAURENT
http://glsft.free.fr
Jacques Barathon [MS]
Le #663895
"Gilles LAURENT" news:
"Michel Claveau" le message de news:
| Salut !

Bonsoir,

| J'ai essayé tes exemples de codes, et obtient les mêmes résultats que
| toi.

GetObject (VBScript) ou GetActiveObject (.Net) s'appuient sur la ROT
(Running Object Table) pour rechercher les serveurs COM en cours
d'exécution et retourner les références des instances. Généralement, un
serveur COM enregistre ses instances de manière dynamique dans la ROT
(Excel, Word, ...). Ceci n'est pas le cas de Internet Explorer :-( Donc
que ce soit en VBScript ou en PowerShell (.Net), il n'est pas possible
de se connecter à une instance Internet Explorer par ces méthodes.
Ci-dessous, un transcript WSH issu de mes tests :


Merci Gilles pour la confirmation. Il me semble me souvenir d'une technique
en PowerShell (sans doute utilisable également en VBScript) qui utilise
l'inventaire des fenêtres Explorer ou quelque chose comme ça. Il faudra que
je retrouve ça dans mes archives, mais je n'ai pas encore eu le temps de m'y
mettre sérieusement.

Jacques

Gilles LAURENT
Le #663894
"Jacques Barathon [MS]" message de news:Oxg%
| "Gilles LAURENT" | news:
|| "Michel Claveau" || dans le message de news:
||| Salut !
||
|| Bonsoir,
||
||| J'ai essayé tes exemples de codes, et obtient les mêmes résultats
||| que toi.
||
|| GetObject (VBScript) ou GetActiveObject (.Net) s'appuient sur la ROT
|| (Running Object Table) pour rechercher les serveurs COM en cours
|| d'exécution et retourner les références des instances. Généralement,
|| un serveur COM enregistre ses instances de manière dynamique dans la
|| ROT (Excel, Word, ...). Ceci n'est pas le cas de Internet Explorer
|| :-( Donc que ce soit en VBScript ou en PowerShell (.Net), il n'est
|| pas possible de se connecter à une instance Internet Explorer par
|| ces méthodes. Ci-dessous, un transcript WSH issu de mes tests :
|
| Merci Gilles pour la confirmation. Il me semble me souvenir d'une
| technique en PowerShell (sans doute utilisable également en VBScript)
| qui utilise l'inventaire des fenêtres Explorer ou quelque chose comme
| ça. Il faudra que je retrouve ça dans mes archives, mais je n'ai pas
| encore eu le temps de m'y mettre sérieusement.
|
| Jacques

Tout à fait. Il est possible de récupérer les instances Internet
Explorer via la collection Windows de l'objet "Shell.Application".
Ci-dessous un transcript WSH :

*******************************
WSH Transcript Start
Start time : 2007-04-23 08:21:41
Username : xxxAdministrateur
Machine : xxx (Microsoft Windows NT 5.1.2600.1)
*******************************
Transcript started, output file is D:TranscriptIEInst.txt

WSH D:test> set oShApp=co("Shell.Application")
WSH D:test> ' affichage du nombre de fenêtre
WSH D:test> echo oShApp.Windows.Count
7
WSH D:test> ' énumération des instances Internet Explorer
WSH D:test> % oIE in oShApp.Windows {
echo oIE.LocationUrl
}

http://www.devguru.com/Technologies/vbscript/QuickRef/getobject.html


http://imp.free.fr/
http://www.jeuxvideo.com/articles/listes/tests-ds-noms.htm
file:///D:/Users/Dev/Copyright/WSH/Release/Transcript
http://www.valdoisetrophy.org/
http://www.google.fr/
http://support.microsoft.com/
WSH D:test> ' il est possible de se connecter à une instance
WSH D:test> set oIE=oShApp.Windows.Item(0)
WSH D:test> ' modification d'un attribut
WSH D:test> oIE.Visibleúlse
WSH D:test>

Transcript stopped.

--
Gilles LAURENT
http://glsft.free.fr


Michel Claveau
Le #663640
Bonjour !

Mais, n'y aurait-il pas un autre moyen de se connecter à une instance
que par la table ROT ?

Par exemple, en énumérant les CLSID actif, ou les Process-actifs ?

Sinon, j'ai vu le descriptif d'une méthode consistant à forcer
l'inscription de IE dans la ROT (en convertissant le CLSID en type
com). Malheureusement, tout était en C#






--
@-salutations

Michel Claveau
Gilles LAURENT
Le #663638
"Michel Claveau" le message de news:
| Bonjour !

Bonjour,

| Mais, n'y aurait-il pas un autre moyen de se connecter à une instance
| que par la table ROT ?

Je ne connais que deux méthodes :
- GetObject / GetActiveObject qui utilisent la ROT
- La collection Windows de l'objet Shell.Application

| Par exemple, en énumérant les CLSID actif, ou les Process-actifs ?

Cela permettra effectivement de détecter la présence d'une instance. En
revanche, il n'y aura aucun moyen de récupérer un pointeur sur l'objet
COM correspondant.

| Sinon, j'ai vu le descriptif d'une méthode consistant à forcer
| l'inscription de IE dans la ROT (en convertissant le CLSID en type
| com). Malheureusement, tout était en C#

Concernant Internet Explorer, une solution élégante serait d'écrire un
plugin COM de type "Browser Helper Object" qui prendrait en charge
l'inscription des instances IE dans la ROT via les API CreateItemMoniker
et/ou RegisterActiveObject. Un exemple de plugin BHO est disponible sur
le site du support Microsoft :
http://support.microsoft.com/kb/179230/en-us

--
Gilles LAURENT
http://glsft.free.fr
Jean
Le #663637
l'inventaire des fenêtres Explorer ou quelque chose comme ça



Outre (Shell.Application).Windows, comme on recherche généralement des
fenêtres que l'on a instanciées "soi même" on pourrait aussi imaginer
utiliser des fenêtres IE nommées récupérables via la méthode Open du
DOM :

'---8<---Fenetre_IE_Nommee.VBS---Jean-JMST-Belgium---
'Creation d'une fenêtre IE nommée "BOND"
'(pourrait être créée dans un autre script)
Set IE=CreateObject("InternetExplorer.Application")
With IE
.Navigate("about:blank")
While .Busy:WScript.Sleep 10:Wend
With .Document
.ParentWindow.Name="BOND"
.Body.InnerText="My name is Bond, James Bond"
End With
.Visible=True
End With

'Récupération de la fenêtre nommée "BOND" à l'aide de
'la méthode Open du DOM
With CreateObject("InternetExplorer.Application")
.Navigate("about:blank")
While .Busy:WScript.Sleep 10:Wend
Set JBOND=.Document.ParentWindow.Open("","BOND")
WScript.Echo JBOND.Document.Body.InnerText
.Quit
End With

IE.Quit
'---8<---Fenetre_IE_Nommee.VBS---Jean-JMST-Belgium---

... malheureusement, en PowerShell, l'objet document.parentWindow n'est
pas récupéré.

Amicalement,

--
Jean - JMST
Belgium

Michel Claveau
Le #663635
Bonjour, compatriote de Wolbodon !


utiliser fenêtres IE nommées récupérables via la méthode Open du DOM

... malheureusement, en PowerShell, l'objet document.parentWindow
n'est pas récupéré.



He oui, malheureusement. J'avais bien pensé à essayer ça.

Mais, effectivement, et on ne sait pas pourquoi, PS a bien la propriété
parent.Window, mais elle est toujours vide !!!?????????

Exemple de code :

$ie = new-object -com "InternetExplorer.Application"
$ie.Navigate("file:///D:/dev/powershell/toto.htm")
$ie.Visible=1
echo $ie.Document
$win=$ie.Document.parentWindow


On voit bien la propriété, dans $ie.Document. Mais elle est toujours
désespérement vide.

Idem avec parenNode, ou même nodeValue


Donc, cher Jean, merci de m'avoir confirmé que j'ai perdu mon temps,
depuis 2 ans, à tenter de me connecter à l'objet Window du DOM...







--
@-salutations

Michel Claveau

Michel Claveau
Le #663634
Re !

De toutes façons, pouvoir se connecter à une instance d'IE, sans
pourvoir utiliser l'objet Window du DOM, ça ne sert pas à
grand-chose...






--
@-salutations

Michel Claveau
Publicité
Poster une réponse
Anonyme