Question
ValueFromPipelineByPropertyName et obj differents
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
Pour te répondre point à point :
Concernant :
[code:1]
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
[/code:1]
Si j'enlève le premier, la fonction ne tourne plus, effectivement, je peux enlever le second sans nuire au fonctionnement du script.
Concernant :
[code:1]
[string]$Right=$true,
[string]$Owner=$true
[/code:1]
J'avoue ne pas saisir ta suggestion d'utiliser deux switchs.
Pourquoi serait-ce préférable à mes deux conditions if ? C'est best-practize ?
D'ailleurs, je devrais plutôt utiliser des arguments au lieu des paramètres, genre [code:1]PS> Repair-Homedir -Name sarou Right Owner[/code:1]
Pour :
[code:1]$Name =@($input)[/code:1]
C'était plutôt mon inculture PowerShell qui est en cause
Ca marche bien avec les blocs Begin, Process et End, merci.
J'essaye de retravailler mon code là et bizarrement j'arrive à faire une fonction qui accepte que les objets AD en pipe, par contre, impossible d'utiliser le paramètre -Name
J'ai un peu l'impression que c'est l'un ou l'autre...
Ca :
[code:1]PS> \"sarou\" | Repair-HomeDir[/code:1]
ca marche, mais ça :
[code:1]PS> Repair-HomeDir -Name sarou[/code:1]
Ca ne marche pas.
Une idée ?
Bonne journée,
sarou
Connexion ou Créer un compte pour participer à la conversation.
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
Pour te répondre point à point :
Concernant :
[code:1]
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
[/code:1]
Si j'enlève le premier, la fonction ne tourne plus, effectivement, je peux enlever le second sans nuire au fonctionnement du script.
Concernant :
[code:1]
[string]$Right=$true,
[string]$Owner=$true
[/code:1]
J'avoue ne pas saisir ta suggestion d'utiliser deux switchs.
Pourquoi serait-ce préférable à mes deux conditions if ? C'est best-practize ?
D'ailleurs, je devrais plutôt utiliser des arguments au lieu des paramètres, genre [code:1]PS> Repair-Homedir -Name sarou Right Owner[/code:1]
Pour :
[code:1]$Name =@($input)[/code:1]
C'était plutôt mon inculture PowerShell qui est en cause
Ca marche bien avec les blocs Begin, Process et End, merci.
J'essaye de retravailler mon code là et bizarrement j'arrive à faire une fonction qui accepte que les objets AD en pipe, par contre, impossible d'utiliser le paramètre -Name
J'ai un peu l'impression que c'est l'un ou l'autre...
Ca :
[code:1]PS> \"sarou\" | Repair-HomeDir[/code:1]
ca marche, mais ça :
[code:1]PS> Repair-HomeDir -Name sarou[/code:1]
Ca ne marche pas.
Une idée ?
Bonne journée,
sarou
Connexion ou Créer un compte pour participer à la conversation.
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
J'essaye de retravailler mon code là et bizarrement j'arrive à faire une fonction qui accepte que les objets AD en pipe, par contre, impossible d'utiliser le paramètre -Name
J'ai un peu l'impression que c'est l'un ou l'autre...
Ca :
[code:1]PS> \"sarou\" | Repair-HomeDir[/code:1]
ca marche, mais ça :
[code:1]PS> Repair-HomeDir -Name sarou[/code:1]
Ca ne marche pas.
Je viens de contourner ce problème.
Si je comprends bien, tout ce qui vient du Pipe nourrit la variable $_ alors qu'en utilisant le paramétre -Name, c'est évidemment la variable $Name qui reçoit l'objet.
Du coup j'ai ajouté la condition suivante avant mon Get-ADUser :
[code:1] if ($_)
{
$Name = $_
}
$User = (Get-ADUser -Identity $Name -Properties Name, HomeDirectory, SamAccountName)
[/code:1]
Ca fait un peu trick pourri non ?
Bon, en tout cas ça fonctionne dans les deux cas maintenant...
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Si tu souhaites utiliser ces paramètres pour porté une valeur vrai ou faux, utilise un Switch et pas une string contenant la conversion d'une valeur booléenne:Concernant :
[code:1]
[string]$Right=$true,
[string]$Owner=$true
[/code:1]
J'avoue ne pas saisir ta suggestion d'utiliser deux switchs.
Pourquoi serait-ce préférable à mes deux conditions if ? C'est best-practize ?
[code:1]
-Rigth -Owner
...
if ($Right) {vrai} else {faux}
[/code:1]
sarou écrit:
Oui, tu indiques un mode de liaison, par le pipeline OU par la ligne de commande, sinon PS léve une exception ParameterBindingException.J'essaye de retravailler mon code là et bizarrement j'arrive à faire une fonction qui accepte que les objets AD en pipe,
par contre, impossible d'utiliser le paramètre -Name
J'ai un peu l'impression que c'est l'un ou l'autre...
A moins d'utiliser le \"delay-bind ScriptBlock\" .
sarou écrit:
Oui, bien qu'avec la v2 on peut ne pas utiliser $_, car $Name est liée dans les 2 cas, ce qui n'était pas le cas avec la V1.Si je comprends bien, tout ce qui vient du Pipe nourrit la variable $_ alors qu'en utilisant le paramétre -Name, c'est évidemment la variable $Name qui reçoit l'objet.
sarou écrit:
Je ne sais pas, j'ai du mal à comprendre le besoin et le pb que tu rencontres.Ca fait un peu trick pourri non ?
Peut être que ta conception de l'entête de ta fonction est à revoir ?
Si $name est une string et que tu utilise le pipe, je ne comprends pas pourquoi tu utilises une boucle :
[code:1]
foreach ($UserName in $Name)
[/code:1]
Ici $Name ne sert qu'a appeler Get-User.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
Pour les switchs, tout ce que je veux c'est indiquer à la fonction si elle doit gérer les droits et la réappropriation ou l'un ou l'autre. Seul $true m'intéresse, je ne traite pas $false.
Voici la version corrigée :
[code:1]
Import-Module ActiveDirectory
Function global:test-func
{
#Parametres de la commande :
param([parameter(Mandatory=$true,ValueFromPipeline=$true,HelpMessage=\"Indiquez l'identifiant de l'utilisateur AD\"«»)]
[String]$Name,
[string]$Right=$true,
[string]$Owner=$true)
Process
{
try
{
if ($_)
{
$Name = $_
}
$User = (Get-ADUser -Identity $Name -Properties Name, HomeDirectory, SamAccountName)
}
#Récupération de l'erreur en cas d'utilisateur inexistant :
catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
{
Write-warning \"L'utilisateur $($User.Name) n'existe pas.\"
}
if ($User.HomeDirectory)
{
if ((Repair-HomeDir $($User.HomeDirectory)) -eq $true)
{
if ($Owner -eq $true)
{
Write-Host \"Traitement du proprietaire $($User.Name) sur le dossier $($User.HomeDirectory)\" -ForegroundColor Green
& C:\Windows\system32\icacls $($User.HomeDirectory) /setowner DOMAIN\$($user.SamAccountName) /T /C /Q
}
if ($Right -eq $true)
{
Write-Host \"Traitement des droits de l'utilisateur $($User.Name) sur le dossier $($User.HomeDirectory)\" -ForegroundColor Green
& C:\Windows\system32\icacls $($User.HomeDirectory) /grant DOMAIN\$($user.SamAccountName):`(OI`)`(CI`)F /T /C /Q
}
}
Else
{
Write-Host \"Le dossier HomeDir $($User.HomeDirectory) de l'utilisateur $($User.Name) n'existe pas\" -ForegroundColor Red
}
}
Else
{
Write-Host \"L'utilisateur $($User.Name) n'a pas de HomeDir\" -ForegroundColor Red
}
}
}
[/code:1]
Maintenant je vais tâcher de lui donner deux jeux de paramètres comme me l'a indiqué Janel, mais j'ai un peu l'impression que c'est loin de mes compétences.
@+
sarou
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
C'est bien l'objectif d'un Switch.Seul $true m'intéresse, je ne traite pas $false.
sarou écrit:
Ce n'est pas évident à coder sans spécifier clairement le comportement attendu.j'ai un peu l'impression que c'est loin de mes compétences.
Par exemple j'utiliserais plutot directement :
[code:1]Get-ADuser ... |Repair-Homedir[/code:1]
Ici tu connais le user, pas besoin de le rechercher, reste à définir comment tu le récupères via un paramètre Name/FullName à partir d'un objet de type autre que ADUser.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- ValueFromPipelineByPropertyName et obj differents