Question Lancer un objet COM avec parametres d'instance

Plus d'informations
il y a 14 ans 11 mois #4683 par Madrolle
J'ai un code tout bête pour lancer ie.

[code:1]## Connection au site
[System.Reflection.Assembly]::LoadWithPartialName(\"System.web\"«») | out-null;
$global:ie = new-object -com \"InternetExplorer.Application\";
#$ie.visible = $true;

$ie.navigate(\"www.ledomaine.com/\"; )
while( $($ie.document.ReadyState) -ne \"complete\" ) {start-sleep 1}[/code:1]

Mais voilà,

mon Vista 64 instancie toujours la version 64 bit de ie pour la quelle il n'y a pas de plugin flash. Donc ce plugin n'est jamais installé, et donc il me demande tjr de le faire. Cela est une tache d'administration et relève donc de l'approbation interactive de l'administrateur.

Bref le résultat est que le batch est toujours bloqué et que les instances d'ie se multiplient en arriére plan.

J'aimerais forcer mon code à lancer la version 32 bits.

Je sais que la reponse est ici
msdn.microsoft.com/en-us/library/ms693716(VS.85).aspx

avec les constantes
CLSCTX_ACTIVATE_32_BIT_SERVER = 0x40000,
CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000,

mais peu familiarisé aux finesses de Dotnet je n'arrive pas à traduire dans la pratique des instructions powershell.

quelqu'un sait-il celà ?<br><br>Message édité par: Perso, à: 19/05/09 07:38

ShellDealer sur Twitter

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 11 mois #4691 par Laurent Dardenne
Salut,
ne connaissant pas l'organisation de la registry sous X64 et ne pouvant vérifier, vérifie, avant de passer par les API COM, s'il existe deux progID pour IE ( \&quot;InternetExplorer.Application.2\&quot;) sur un système 64 bits, un pour chaque version de l'OS.
Pour énumérer les ProgID :
[code:1]
#By Oisin (x0n) Grehan [MVP]
Get-WmiObject Win32_ProgIDSpecification | select ProgID | more
[/code:1]
Ensuite vérifie s'il existe 2 CLSID distincts (pour ie 32 bit ({0002DF01-0000-0000-C000-000000000046}).

Sinon pour les valeurs citées, il faut passer par l'api CoCreateInstance ...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 11 mois #4701 par Madrolle
CoCreateInstance
j'ai deux classes \&quot;InternetExplorer.Application\&quot; et \&quot;InternetExplorer.Application.1\&quot; avec le même CLSID, celui que vous m'avez donné.

C'est bien CoCreateInstance que je ne sais pas utiliser. Je ne comprend pas les arguments qu'il faut y mettre. et je ne trouve pas d'exemple de la syntaxe PS.

Le premier ?
\&quot;InternetExplorer.Application\&quot;
ou
\&quot;InternetExplorer.Application.1\&quot;
ou
\&quot;{0002DF01-0000-0000-C000-000000000046}\&quot;

Le second ?
NULL

Le troisiéme ?
\&quot;CLSCTX_ACTIVATE_32_BIT_SERVER\&quot;

Le 4eme, je nage complétement :-)

Le 5eme, je coule.

Je suppose qu'une fois les arguments compris, ça s'utilise comme \&quot;mon\&quot; CreateInstance ici: powershell-scripting.com/index.php?optio...;id=4199&catid=6

[code:1]$t = [system.type]::GetTypeFromProgID(\&quot;MetaFrameCOM.MetaFrameFarm\&quot;, \&quot;$_\&quot;)
$farm = [system.Activator]::CreateInstance($t)
$farm.Initialize(1)
[/code:1]


Résolution hors script (insatisfaisante)
Depuis j'ai désinstallé ie8 pour retrouver ie7 mais le comportement est reste le même, c'est donc un flag du système qui avait changé.

Vous m'avez mis sur la piste et grace à cette fonction:
[code:1]function com_list
{
$path = \&quot;REGISTRY::HKey_Classes_Root\clsid\*\progid\&quot;

foreach ($val in dir $path)
{
$val.getvalue(\&quot;\&quot;«»)
}
}[/code:1]

J'ai pu découvrir la clef à modifier.
[code:1]HKEY_CLASSES_ROOT\CLSID\{0002DF01-0000-0000-C000-000000000046}\LocalServer32[/code:1]

Il m'a fallut en prendre la propriété (dévolue à TrustedInstaller) en tant qu'administrateur.

j'ai remplacé
[code:1]\&quot;%ProgramFiles%\Internet Explorer\iexplore.exe\&quot;[/code:1]
par
[code:1]\&quot;%ProgramFiles(x86)%\Internet Explorer\iexplore.exe\&quot;[/code:1]

et redémarré mon poste

ça marche!

j'ai cependant besoin de lancer la version 32 bits juste le temps d'un script, la question est donc tjr ouverte.


PS: comment fait-on pour conserver les anti-slash sur ce forum hormis la balise code ?<br><br>Message édité par: Perso, à: 23/05/09 09:23

ShellDealer sur Twitter

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 11 mois #4702 par Laurent Dardenne
Perso écrit:

Le premier ?
\&quot;InternetExplorer.Application\&quot;
ou
\&quot;{0002DF01-0000-0000-C000-000000000046}\&quot;

Le CLSID {0002DF01.... Un progID pointe sur un CLSID, mais on mémorise mieux le premier ;-)
Ensuite pour le progid entre Application ou .Application.1
Perso écrit:

Le troisiéme ?
\&quot;CLSCTX_ACTIVATE_32_BIT_SERVER\&quot;

Oui, c'est une combinaison.
Perso écrit:

Le 4eme, je nage complétement :-)

C'est une référence d'interface COM par exemple : IID_IUnknown ( c'est une constante)
Perso écrit:

Le 5eme, je coule.

C'est un pointeur, un type [REF] sous PowerShell
A vérifier, je n'ai pas testé.
Perso écrit:

et je ne trouve pas d'exemple de la syntaxe PS.

Oui j'en ai cherché aussi il faut chercher en C# (voir Google Code), je pense que cela est dû aux limites de PS V1, de plus new-object suffit, et il n'est pas prévu pour ce type de code.
Perso écrit:

Je suppose qu'une fois les arguments compris, ça s'utilise comme \&quot;mon\&quot; CreateInstance

Sur le principe oui, mais il faudra un peu plus de code je pense et rien ne dit que cela soit possible...
Perso écrit:

j'ai cependant besoin de lancer la version 32 bits juste le temps d'un script, la question est donc tjr ouverte.

Comme il existe 2 exécutables, que donne dans la console l'exécution de IE à partir de \&quot;%ProgramFiles(x86)%\&quot; ?
Si cela suffit, il faut récupérer le process en tant qu'interface. Voir ce post .
Perso écrit:

comment fait-on pour conserver les anti-slash sur ce forum hormis la balise code ?

C'est un pb sur Joomla je crois.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.073 secondes
Propulsé par Kunena