Question Mise à jour en Powershell v3

Plus d'informations
il y a 11 ans 8 mois #17783 par gege
Mise à jour en Powershell v3 a été créé par gege
Bonjour,

J'ai procédé ces derniers temps à une mise à jour de Powershell sur mon poste, passant de la V2 à la V3.

Un de mes script \"maison\" qui me sert bien, est un script de création d'utilisateur dans l'AD.

Et depuis mon passage en v3, une commande ne passe plus.

[code:1]$objOU = New-Object System.DirectoryServices.DirectoryEntry(\"LDAP://OU=zzzz,OU=Utilisateurs,OU=yyyy,DC=xxx,DC=net\"«»)
$objUser= $objOU.Create(\"user\",$usercn)
$objuser.psbase.commitchanges()
$objUser.put(\"sAMAccountName\", $CP)
$objuser.psbase.commitchanges()
$objUser.put(\"userPrincipalName\", $CP+ $domaineSMTP)
$objuser.psbase.commitchanges()
$objUser.put(\"givenName\", $Prenom)
$objuser.psbase.commitchanges()
[/code:1]

j'ai le message suivant:

[code:1]Exception lors de l'appel de « put » avec « 2 » argument(s) : « Erreur non spécifiée (Exception de HRESULT : 0x80004005 (E_FAIL)) »
Au caractère T:\Kuser.ps1:780 : 8
+ $objUser.put(\"givenName\", $Prenom)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:«») [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
[/code:1]

J'ai essayé mon script sur une machine en powershell v2 et cela fonctionne.

Je me doute que la mise à jour y est pour quelque chose mais je n'arrive pas à trouver la parade.

Au pire je devrais changer ma méthode dans mon script, mais j'aurais aimer comprendre et trouver une solution pour palier le problème rapidement.

Merci à vous.

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

Plus d'informations
il y a 11 ans 8 mois #17785 par Laurent Dardenne
Salut,
sous quel OS testes-tu ?
Le poste a-t-il les dernières MAJ ?
As-tu testé sur le même poste avec :
[code:1]
powershell.exe -version 2.0 -noprofile
[/code:1]
Le framework utilisé n'est pas le même que celui de la v2.

La pile d'appel pourrait être utile ( cf. la fonction Resolve-Error).

Je n'ai pas trouvé d'infos sur MSConnect, à priori ce n'est pas un 'breaking change' référencé.

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 8 mois #17787 par gege
Réponse de gege sur le sujet Re:Mise à jour en Powershell v3
Bonjour,

Je suis sous Seven 64 bits.

De quel maj parles tu ? Celle du framework ou de l'OS en générale?

J'ai testé avec ta commande, et le script passe nickel mon utilisateur est bien créé.

j'ai utilisé la fonction Resolve-ErrorRecord en provoquant de nouveau l'erreur et voici ce que ça donne:

[code:1]
PSMessageDetails :
Exception : System.Management.Automation.MethodInvocationException: Exception lors de l'appel de «put» avec «2» argument(s): «Erreur non spécifiée (Exception de HRESULT : 0x80004005
(E_FAIL))» ---> System.Runtime.InteropServices.COMException: Erreur non spécifiée (Exception de HRESULT : 0x80004005 (E_FAIL))
--- Fin de la trace de la pile d'exception interne ---
à System.Management.Automation.Adapter.BaseMethodInvoke(PSMethod method, PSMethodInvocationConstraints invocationConstraints, Object[] arguments)
à System.Management.Automation.PSMethod.Invoke(PSMethodInvocationConstraints invocationConstraints, Object[] arguments)
à System.Management.Automation.PSMethod.Invoke(Object[] arguments)
à System.Management.Automation.Language.PSInvokeMemberBinder.InvokeAdaptedMember(Object obj, String methodName, Object[] args)
à System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
à System.Management.Automation.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
à System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
TargetObject :
CategoryInfo : NotSpecified: (:«») [], MethodInvocationException
FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
ScriptStackTrace : à <ScriptBlock>, T:\Kuser.ps1 : ligne 780
à <ScriptBlock>, T:\Kuser.ps1 : ligne 1147
PipelineIterationInfo : {}

MyCommand :
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 780
OffsetInLine : 8
HistoryId : -1
ScriptName : T:\Kuser.ps1
Line : $objUser.put(\"givenName\", $Prenom)

PositionMessage : Au caractère T:\Kuser.ps1:780 : 8
+ $objUser.put(\"givenName\", $Prenom)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PSScriptRoot : T:\
PSCommandPath : T:\Kuser.ps1
InvocationName :
PipelineLength : 0
PipelinePosition : 0
ExpectingInput : False
CommandOrigin : Internal
DisplayScriptPosition :

Exception at nesting level 0

ErrorRecord : Exception lors de l'appel de « put » avec « 2 » argument(s) : « Erreur non spécifiée (Exception de HRESULT : 0x80004005 (E_FAIL)) »
StackTrace : à System.Management.Automation.Adapter.BaseMethodInvoke(PSMethod method, PSMethodInvocationConstraints invocationConstraints, Object[] arguments)
à System.Management.Automation.PSMethod.Invoke(PSMethodInvocationConstraints invocationConstraints, Object[] arguments)
à System.Management.Automation.PSMethod.Invoke(Object[] arguments)
à System.Management.Automation.Language.PSInvokeMemberBinder.InvokeAdaptedMember(Object obj, String methodName, Object[] args)
à System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
à System.Management.Automation.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
à System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
WasThrownFromThrowStatement : False
Message : Exception lors de l'appel de « put » avec « 2 » argument(s) : « Erreur non spécifiée (Exception de HRESULT : 0x80004005 (E_FAIL)) »
Data : {System.Management.Automation.Interpreter.InterpretedFrameInfo}
InnerException : System.Runtime.InteropServices.COMException (0x80004005): Erreur non spécifiée (Exception de HRESULT : 0x80004005 (E_FAIL))
TargetSite : System.Object BaseMethodInvoke(System.Management.Automation.PSMethod, System.Management.Automation.PSMethodInvocationConstraints, System.Object[])
HelpLink :
Source : System.Management.Automation
HResult : -2146233087

Exception at nesting level 1

ErrorCode : -2147467259
Message : Erreur non spécifiée (Exception de HRESULT : 0x80004005 (E_FAIL))
Data : {}
InnerException :
TargetSite :
StackTrace :
HelpLink :
Source :
HResult : -2147467259
[/code:1]


Merci du coup de pouce ;)<br><br>Message édité par: kenobytes, à: 3/07/14 16:47

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

Plus d'informations
il y a 11 ans 8 mois #17788 par Laurent Dardenne
kenobytes écrit:

De quel maj parles tu ? Celle du framework ou de l'OS en générale?

Je pensais plus à celle du framework dotnet.
kenobytes écrit:

J'ai testé avec ta commande, et le script passe nickel mon utilisateur est bien créé.

Oui, mais on est tjr en v2 :(

Si ton lecteur T est un share essaie ton script en local.
As-tu essayé avec un seul appel à CommitChanges() ?
Les noms de propriétés sont peut-être sensibles à la casse ?

Je ne peut tester ton code, si un lecteur peut le faire ( v3 ou v4) tu aurais confirmation que c'est un pb récurrent.

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 8 mois #17789 par gege
Réponse de gege sur le sujet Re:Mise à jour en Powershell v3
Salut,

Le .net Framework est en 4.5.1 sur mon poste.

J'ai essayé le script en local, même sanction.

J'ai essayé avec un seul commit, même chose.

Par contre, j'ai remplacé ma variable $Prenom par une valeur \&quot;toto\&quot; et là ça fonctionne.
[code:1]
$objUser.put('givenname', \&quot;toto\&quot;«»)
[/code:1]

Je me suis donc pencher sur l'alimentation de ma variable $prenom dont voici le code:

[code:1]
$Verif.add_click( #Début Bouton Vérif
{
$i = 0
$login = ''
$pre = $txtboxprenom.get_text()
$pre2 = $txtboxprenom2.get_text()

if ($txtBoxPrenom2.get_text() -eq '')
{
$login = $pre.substring(0,1) + $txtBoxNom.get_text()
[string]$Prenom = $txtBoxPrenom.get_text()
while (userexist($login) -eq $true)
{
$i++
$login = $pre.substring(0,$i) + $txtBoxNom.get_text()
}

}
elseif ($txtBoxPrenom2.get_text() -ne '')
{
$login = $pre.substring(0,1) + $pre2.substring(0,1) + $txtboxnom.get_text()
[string]$Prenom = $txtBoxPrenom.get_text() + \&quot;-\&quot; + $txtBoxPrenom2.get_text()
while (userexist($login) -eq $true)
{
$i++
$login = $pre.substring(0,$i) + $pre2.substring(0,1) + $txtboxnom.get_text()
}
}


$txtboxlogin.text = $login.tolower()





}) #Fin Bouton Vérif
[/code:1]

Mon script génère un formulaire de saisie basé sur le windows forms, c'est pour cette raison que tu vois des entrées de type $txtboxprenom.get_text() , c'est le code d'un bouton Vérif, qui me génère un login et qui vérifie si il n'existe pas de doublons dans l'AD avec le fonction \&quot;userexist\&quot;

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

Plus d'informations
il y a 11 ans 8 mois #17790 par gege
Réponse de gege sur le sujet Re:Mise à jour en Powershell v3
j'ai continué quelques tests en mettant des \&quot;Write-Host $Prenom\&quot; dans mon script a divers endroits.

Et apparemment, à la sortie du code du bouton vérif la variable ne contient plus rien.

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

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