Question Lancer un objet COM avec parametres d'instance
- Madrolle
- Auteur du sujet
- Hors Ligne
- Membre senior
- Messages : 47
- Remerciements reçus 0
[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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
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 ( \"InternetExplorer.Application.2\") 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.
- Madrolle
- Auteur du sujet
- Hors Ligne
- Membre senior
- Messages : 47
- Remerciements reçus 0
j'ai deux classes \"InternetExplorer.Application\" et \"InternetExplorer.Application.1\" 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 ?
\"InternetExplorer.Application\"
ou
\"InternetExplorer.Application.1\"
ou
\"{0002DF01-0000-0000-C000-000000000046}\"
Le second ?
NULL
Le troisiéme ?
\"CLSCTX_ACTIVATE_32_BIT_SERVER\"
Le 4eme, je nage complétement
Le 5eme, je coule.
Je suppose qu'une fois les arguments compris, ça s'utilise comme \"mon\" CreateInstance ici: powershell-scripting.com/index.php?optio...;id=4199&catid=6
[code:1]$t = [system.type]::GetTypeFromProgID(\"MetaFrameCOM.MetaFrameFarm\", \"$_\")
$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 = \"REGISTRY::HKey_Classes_Root\clsid\*\progid\"
foreach ($val in dir $path)
{
$val.getvalue(\"\"«»)
}
}[/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]\"%ProgramFiles%\Internet Explorer\iexplore.exe\"[/code:1]
par
[code:1]\"%ProgramFiles(x86)%\Internet Explorer\iexplore.exe\"[/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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Le CLSID {0002DF01.... Un progID pointe sur un CLSID, mais on mémorise mieux le premierLe premier ?
\"InternetExplorer.Application\"
ou
\"{0002DF01-0000-0000-C000-000000000046}\"
Ensuite pour le progid entre Application ou .Application.1
Perso écrit:
Oui, c'est une combinaison.Le troisiéme ?
\"CLSCTX_ACTIVATE_32_BIT_SERVER\"
Perso écrit:
C'est une référence d'interface COM par exemple : IID_IUnknown ( c'est une constante)Le 4eme, je nage complétement
Perso écrit:
C'est un pointeur, un type [REF] sous PowerShellLe 5eme, je coule.
A vérifier, je n'ai pas testé.
Perso écrit:
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.et je ne trouve pas d'exemple de la syntaxe PS.
Perso écrit:
Sur le principe oui, mais il faudra un peu plus de code je pense et rien ne dit que cela soit possible...Je suppose qu'une fois les arguments compris, ça s'utilise comme \"mon\" CreateInstance
Perso écrit:
Comme il existe 2 exécutables, que donne dans la console l'exécution de IE à partir de \"%ProgramFiles(x86)%\" ?j'ai cependant besoin de lancer la version 32 bits juste le temps d'un script, la question est donc tjr ouverte.
Si cela suffit, il faut récupérer le process en tant qu'interface. Voir ce post .
Perso écrit:
C'est un pb sur Joomla je crois.comment fait-on pour conserver les anti-slash sur ce forum hormis la balise code ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Lancer un objet COM avec parametres d'instance