Question
accés wmi distant avec credential
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
Comment arrive-t-on à écrire un code comme celui ci pris sur divers site? où trouve-t-on des explications sur le pourquoi de cette formulation surprenante avec le -list et le where qui retourne la méthode ?
C'est pas enseigné dans le cours PS de l'ENI que je viens de suivre...
Mais si l'un de vous peut m'expliquer...
1. $HKLM = 2147483650 # j'ai même trouvé \"&h80000002\" et ca marche en PS !
2. $RemoteComputer = \"COMPUTER1\"
2bis $cred = get-credential # mon ajout
3. $RegObject = Get-WmiObject -List -Namespace root\default -ComputerName -credential $cred
$RemoteComputer | Where-Object {$_.Name -eq \"StdRegProv\"}
4. $RegKeys = $RegObject.EnumKey($HKLM, \"Software\Microsoft\")
5. $RegKeys.sNames.Count
6. $Regkeys|foreach {write-output $_.sNames}
Pour accéder à un registre distant, quand on est loggé avec un compte \"adm\", comme le signale un tutorial de ce site, on peut utiliser .net et $rootkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$computername)
mais sans pouvoir passer de credential.
Pourquoi tout est aussi compliqué?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
noel écrit:
En lisant les doc, en testant, en copiant, ...Comment arrive-t-on à écrire un code comme celui ci pris sur divers site?
Ici,on ne peut pas inventer.
noel écrit:
[code:1]où trouve-t-on des explications sur le pourquoi de cette formulation surprenante avec le -list et le where qui retourne la méthode ?
get-help Get-WmiObject -parameter List
[/code:1]
Dans la doc de PowerShell et sur MSDN.
Le where filtre les objets émit dans le pipeline par le premier cmdlet Get-WmiObject.
L'objet récupéré est une instance de la classe StdRegProv .
C'est celle-ci qui porte la méthode EnumKey .
noel écrit:
Difficile d'aborder dans un seul ouvrage tout ce qui à trait à l'automatisation de tâches.C'est pas enseigné dans le cours PS de l'ENI que je viens de suivre...
Tu peux consulter ce tuto sur WMI .
noel écrit:
Là tu utilises les API win32, par défaut celle-ci s'appuient sur le compte que tu utilises.mais sans pouvoir passer de credential.
L'authentification est donc transparente, là où WMI nécessite de le préciser.
noel écrit:
Il est parfois difficile de faire les choses simplement, ce n'est pas 'compliqué', à la rigueur tu n'as pas été formé ou tu ne possédes pas l'information, ce qui n'est pas la même chose.Pourquoi tout est aussi compliqué?
En même temps d'adresser une machine distante sans avoir à coder les trames réseaux, c'est tout de même appréciable
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
Avec le cours, le livre,de nombreuses heures d'écriture (ou de tatonnement pour être plus exact), et beaucoup de recherches sur internet dont les lectures de tous ou presque des tutorials de Laurent Dardenne (mais j'ai décroché dans bien des cas !), j'ai été surpris de constater que l'accès aux classes de stdRegProv ne se font pas aussi \"naturellement\" qu'avec d'autres objects wmi comme ceux des classes win32_... (namespace différents).
Par exemple, pour un objet d'une classe :
# OS supérieur à XP !
$MonDrive = gwmi -query \"select * from Win32_volume where DriveLetter='D:'\"
on accède à une propriété et à une méthode naturellement :
$MonDrive.DriveLetter=\"K:\"
$MonDrive.put()
Ou si l'on a besoin d'une méthode de la classe :
$MonShare=[wmiclass]'Win32_share'
$MonShare.create('c:\toto', 'toto', 0, 4294967295, 'mon partage'
Alors que pour stdRegProv, il faut lister les classes du \"namespace\". En retour il me semble que l'on obtienne un object et non un nom. Cet objet serait une classe un peu comme l'est win32_share. Et l'on peut alors utiliser ses méthodes.
Mais pourquoi ce passage par le -list et le where et non pas par quelque chose comme :
$RegObject = Get-WmiObject -class stdRegProv -Namespace root\default -ComputerName -credential $cred
Mais pourquoi pas ca ne marche pas avec cette forme pour stdRegProv? C'est cette différence que je ne m'explique pas.
Merci d'avance.
Ps :
à Laurent Dardenne :
merci de toujours positiver. Ca fait du bien.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Pareil, mais j'ai commencé en 2006, j'ai un peu d'avanceAvec le cours, le livre,de nombreuses heures d'écriture (ou de tatonnement pour être plus exact), et beaucoup de recherches sur internet
noel écrit:
Oui, je suis conscient que qq uns ne sont pas facile d'accès.dont les lectures de tous ou presque des tutorials de Laurent Dardenne (mais j'ai décroché dans bien des cas !)
J'ai relu hier celui sur les runspaces, j'ai effectivement indiqué le niveau \"Confirmé\" sans définir ce qu'il définit dans ce contexte.
Dans ce cas, c'est vrai que j'ai chargé la mûle !
Sans retour des lecteurs, sachant que parler est une prise de risque, difficile de corriger \"le tir\".
Si tu me donnes qq infos sur le pourquoi de ce décrochage je ne vais pas te mordre
noel écrit:
Le code que tu cites t'induis en erreurj'ai été surpris de constater que l'accès aux classes de stdRegProv ne se font pas aussi \"naturellement\" qu'avec d'autres objects wmi
comme ceux des classes win32_... (namespace différents).
noel écrit:
Il n'est peut être pas le plus pertinent pour étayer tes propos :Mais pourquoi ce passage par le -list et le where et non pas par quelque chose comme...
[code:1]
...
#Pour le détail voir la signature
#de ce constructeur : msdn.microsoft.com/fr-fr/library/8wzwcace.aspx
$stdReg= [wmiclass]\"\\MachineName\ROOT\default:«»StdRegProv\"
$RegKeys = $RegObject.EnumKey($HKLM, \"SoftwareMicrosoft\"«»)
...
[/code:1]
On se rapproche du \"naturel\", PowerShell est là pour nous aider à manipuler des données, issues de différentes sources (cf. les providers).
Mais pour être efficient il faut connaître comment fonctionne le fournisseur, le \"pouvoir\", tout relatif, n'est donc pas dans le shell, mais dans la connaissance que l'on a du fournisseur que l'on interroge.
[code:1]
$RegObject.__path
#\\MachineName\ROOT\default:«»StdRegProv
[/code:1]
Je ne connais pas Exchange, Powershell ne comblera pas ce manque, mais les cmdlets qu'il met à disposition m'aideront à masquer cette méconnaissance.
D'où le nom initial du produit, Monad .
Si tu décroches t'inquiéte pas, c'est normal ça me fait le même effet
noel écrit:
Tjr, je ne pense pas, souventmerci de toujours positiver.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
ni par celui ci powershell-scripting.com/index.php?optio...id=108&Itemid=71 .
avec :
$stdReg= [wmiclass]\"\\MachineName\ROOT\default:StdRegProv\"
$RegKeys = $RegObject.EnumKey($HKLM, \"SoftwareMicrosoft\")
on ne peut pas passer de credential.
Au passage, je suis surpris que :
$monshare.create(...
$monshare|gm --> System.Management.ManagementClass#ROOT\cimv2\Win32_Share <-- une classe
$tonshare=gwmi \"win32_share\"
$tonshare | gm --> System.Management.ManagementObject#root\cimv2\Win32_Share <-- des instances de la classe
J'ai lu pas mal de \"recettes de cuisine\" et il me semble que je ne suis pas le seul à les employer, à obtenir le résultat souhaité mais au final ne pas pouvoir faire seul quelque chose.
Je rêve d'un didacticiel très court (mais pas que le niveau \"recette pour les nuls\") sur la registry, locale et distante, avec et sans passage de credential, avec et sans les raccourcis, le tout pour faire coller la forme avec le fond (je sais que c'est bizarre mais si je dis que les quelques 200 application de mon entreprise sont sous....DOS5 (dans nvtdm bien sûr), y en a combien qui vont trouver ca bizarre aussi, ben pas moi)...Du temps bien sûr.
Bon, pas grave.
Encore merci à Laurent Dardenne pour ton implication dans les posts un peu sans queue ni tête comme celui ci.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Il faut utiliser un autre constructeur :on ne peut pas passer de credential.
[code:1]
$MyCredential=Get-Credential
$MachineName=\"test\"
$WmiNameSpace=\"\\$MachineName\ROOT\default\"
$scope =New-Object System.Management.ManagementScope $WmiNameSpace
$scope.options.Username = $MyCredential.GetNetworkCredential().Username
$scope.options.Password = $MyCredential.GetNetworkCredential().Password
$stdReg= new-object System.Management.ManagementClass($Scope,\"\\$MachineName\ROOT\default:«»StdRegProv\",$null)
[/code:1]
Pour le premier exemple, voir page 8 du tuto WMI.
noel écrit:
Tu interroges une classe, tu obtients donc des infos sur cette classe. La méthode Create renvoi un entier pas un objet Win32_Share.Au passage, je suis surpris que :
Ensuite GWMI renvoi par défaut des instances, c'est le besoin le + courant.
noel écrit:
Cela dépend de l'approche que chacun adopte par rapport à la résolution d'un problème ou face à la nouveauté.J'ai lu pas mal de \"recettes de cuisine\" et il me semble que je ne suis pas le seul à les employer, à obtenir le résultat souhaité mais au final ne pas pouvoir faire seul quelque chose.
Pour un pb, si seul le résultat compte, pas besoin de comprendre comment il se produit ni comment l'éviter.
Cuisiner un plat ne peut être réduit à suivre une recette, il y a un savoir/expérience préalable.
noel écrit:
Bha, tu peux le rédiger, c'est un excellent exercice d'apprentissage.Je rêve d'un didacticiel très court (mais pas que le niveau \"recette pour les nuls\") sur la registry, locale et distante,
noel écrit:
Si, les deux sont làun peu sans queue ni tête comme celui ci.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- accés wmi distant avec credential