Question
AD OU Keep tree order
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
j'essai de partir sur des solutions simples qui sont souvent les meilleurs.
C'est dommage car tu avait donner la bonne réponse des le début.
Laurent Dardenne écrit:
J'avoue que ca ma aidée...Comme quoi de connaitre PS n'est pas suffisant, si on ne connait pas les objets qu'on manipule.
Au début je me suis tromper en faisant un faux parallèle avec un problème que j'ai, a savoir enregistrer des info dans un CSV avec un ordre des noms de colonnes différent que celui par défaut. Il faut savoir que les noms des membres de l'objet à enregistrer sont dynamiques.
du coup la solutions suivante ne fonctionne pas car les noms après select me sont pas connue :
[code:1]$cols | select Ordinateur, Etat, Reboot, Datemaj | Export-Csv \"c:\majgpo.csv\" -NoTypeInformation -Encoding unicode -UseCulture[/code:1]
Par contre pour le passage de paramètre, j'ai pas compris le miracle ToString !
[code:1]$Obj=1|select Name,count
$Obj.Name='c:\temp'
$Obj.Count=0
Add-Member -InputObject $Obj -MemberType ScriptMethod -Name ToString -Value { $this.Name } -Force
$Obj|dir[/code:1]
Ma compréhension me dis que dir vois que $obj n'est pas un objet System.IO.DirectoryInfo et il tente de le convertir l'argument en string, et toi tu intercepte cette demande de conversion (pour renvoyer $this.Name) ? Va tu me répondre la même chose :
Laurent Dardenne écrit:
Comme quoi de connaitre PS n'est pas suffisant, si on ne connait pas les objets qu'on manipule.
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Oui, mais parfois on ne le sait qu'à la finLaurent
j’essaie de partir sur des solutions simples qui sont souvent les meilleurs.
Il faut aussi reconnaitre quand on fait fausse route.
6ratgus écrit:
La réponse peut être pas, une piste probablement.C'est dommage car tu avais donné la bonne réponse dés le début.
D'habitude je ne réponds pas aux questions sur L'AD, car je ne maîtrise pas le sujet et surtout je n'ai pas d'AD de test sous la main.
Je peux coder des traitements autour de l'AD, mais cela ne fait pas de moi un admin, car ce n'est pas mon activité quotidienne.
6ratgus écrit:
Je comprends, bien qu'un mécanisme de stockage ne soit pas en théorie considéré comme ordonné.a savoir enregistrer des info dans un CSV avec un ordre des noms de colonnes différent que celui par défaut.
C'est le traitement sur les données qui le nécessite, on ne doit pas coupler les deux. Mais souvent on 'triche'.
6ratgus écrit:
Non.Par contre pour le passage de paramètre, j'ai pas compris le miracle ToString !
...
Va tu me répondre la même chose :
6ratgus écrit:
Dir renvoie de tel objet, mais le paramètre -Path attend un type string, un tableau de string ( [string[]] )Ma compréhension me dis que dir vois que $obj n'est pas un objet System.IO.DirectoryInfo
D'où l'importance de savoir lire la doc d'un cmdlet, la difficulté pour un débutant est qu'il doit connaitre ces points pour comprendre tout ce que la doc porte comme informations implicites.
Il faut donc commencer par apprendre des points avancés pour expliquer des points simples...
Mais pour un usage basique de cmdlet, ce n'est pas nécessaire.
Ce n'est pas le cmdlet, mais la partie analyse de paramètre commune à tout code PS qui se charge de cette tâche.
Cette analyse, le 'ParameterBinding', lit les métadonnées du cmdlet/fonction/script/scriptblock puis fait sa cuisine.
6ratgus écrit:
Le ParameterBinding oui, pas le cmdlet. Si on simplifie on peut dire que c'est lui qui rempli ce rôle.et il tente de le convertir l'argument en string,
( Les attributs de paramètres sont destinés au 'ParameterBinding' et c'est lui qui contrôle et renseigne les arguments des paramètres d'un cmdlet/fonction/etc. )
Ici cela fonctionne, car le paramètre ciblé, -Path, est du type string. Pour un autre type cela ne peut pas fonctionner.
A moins qu'on suppose les conversions :
[code:1]
$O=1|select PID
#PID n'est pas typé
$O.PID=\"$pid\"
# ParameterBinding trouve la propriété PID et la transforme avec succès en [int]
$O|Get-Process
#La transformation en [int] échoue
$O.PID=\"toto\"
#ParameterBindingException
$O|Get-Process
[/code:1]
Ici on ne peut pas mettre à contribution la méthode ToString(), car -PID attend un [int].
Pour typer le membre il faut utiliser d'autres techniques .
6ratgus écrit:
Oui, plus précisément je sais que dans la cas exposé le 'ParameterBinding' appelle ToString() avant d'affecter la valeur à -Path.et toi tu interceptes cette demande de conversion (pour renvoyer $this.Name) ?
Je fais donc en sorte que lors de l'appel, l'objet renvoi l'information attendue. Mais ce n'est pas une interception/ Hook .
Si je change de contexte( de cmdlet) l'info renvoyée peut ne pas correspondre. On revient donc au point de départ.
Le membre de type Alias est plus beaucoup plus souple pour diriger le 'ParameterBinding' selon les besoins.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
Laurent Dardenne écrit:
savoir lire, oui, mais pas que les docD'où l'importance de savoir lire la doc d'un cmdlet, la difficulté pour un débutant est qu'il doit connaitre ces points pour comprendre tout ce que la doc porte comme informations implicites.
et savoir écrire aussi... (ca c'est pour moi !)
pour un débutant c'est pas évidant parfoisIl faut donc commencer par apprendre des points avancés pour expliquer des points simples...
mais il faut un bon forum \"d'Entraide pour les débutants\" alorsMais pour un usage basique de cmdlet, ce n'est pas nécessaire.
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Tout à fait.pour un débutant c'est pas évident parfois
Mais comme je l'ai déjà dit, moins tu en dis en formation moins tu en as expliquer. C'est un choix avec ces avantages et ces inconvénients.
6ratgus écrit:
Il peut faire gagner du temps, mais ne remplace pas un travail personnel.mais il faut un bon forum \"d'Entraide pour les débutants\" alors
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Dela
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 47
- Remerciements reçus 0
Je reviens un peu tard sur le sujet.
Tout fonctionne à merveille avec cette version :
[code:1]
import-module activedirectory
[array]$table = @()
Get-ADOrganizationalUnit -filter * -SearchBase \"OU=MAC_Utilisateurs_Groupes;OU=MAC,dc=macdo,dc=com\" -SearchScope 2 -property canonicalName |
where {$_.name -ne 'Utilisateurs' -and $_.name -ne 'Groupes'} | sort canonicalName | Foreach {
[string]$Name = $_.canonicalName
write-Host \"Nom : \"$name $_.distinguishedname
$obj = New-Object PSObject
$obj | Add-Member Noteproperty \"Name\" $Name
$u=Get-ADUser -filter * -searchbase $_.distinguishedname -ResultPageSize 5000 -resultSetSize 5000
$total=($u | measure-object).count
$obj | Add-Member Noteproperty \"TotalUsers\" $Total
$enabled=($u | where {$_.Enabled -eq $true} | Measure-Object).count
$obj | Add-Member Noteproperty \"Enabled\" $Enabled
$Disabled=($u | where {$_.Enabled -eq $false} | Measure-Object).count
$obj | Add-Member Noteproperty \"Disabled\" $Disabled
$NotSpec=$total-$enabled-$disabled
$obj | Add-Member Noteproperty \"NotSpec\" $NotSpec
$table+=$obj
}
$Table | Export-csv c:\temp\export.csv -notype
$Table | ft
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- AD OU Keep tree order