Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Débutant Power-Shell

25 réponses
Avatar
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

10 réponses

1 2 3
Avatar
Jacques Barathon [MS]
"Michel Claveau" <Enleverles wrote in message
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

Avatar
Michel Claveau
Salut !

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







--
@-salutations

Michel Claveau
Avatar
Gilles LAURENT
"Michel Claveau" <Enleverles a écrit 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 :

*******************************
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
Avatar
Jacques Barathon [MS]
"Gilles LAURENT" wrote in message
news:
"Michel Claveau" <Enleverles a écrit 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

Avatar
Gilles LAURENT
"Jacques Barathon [MS]" a écrit dans le
message de news:Oxg%
| "Gilles LAURENT" wrote in message
| news:
|| "Michel Claveau" <Enleverles a écrit
|| 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


Avatar
Michel Claveau
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
Avatar
Gilles LAURENT
"Michel Claveau" <Enleverles a écrit dans
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
Avatar
Jean
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

Avatar
Michel Claveau
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

Avatar
Michel Claveau
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
1 2 3