Question ValueFromPipelineByPropertyName et obj differents

Plus d'informations
il y a 15 ans 1 mois #8630 par EdouardG
Salut Laurent et merci pour ta réponse et tes éclaircissements !

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.

Plus d'informations
il y a 15 ans 1 mois #8631 par EdouardG
Salut Laurent et merci pour ta réponse et tes éclaircissements !

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.

Plus d'informations
il y a 15 ans 1 mois #8632 par EdouardG
sarou écrit:

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.

Plus d'informations
il y a 15 ans 1 mois #8633 par Laurent Dardenne
sarou écrit:

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 ? :)

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:
[code:1]
-Rigth -Owner
...
if ($Right) {vrai} else {faux}
[/code:1]
sarou écrit:

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...

Oui, tu indiques un mode de liaison, par le pipeline OU par la ligne de commande, sinon PS léve une exception ParameterBindingException.
A moins d'utiliser le \"delay-bind ScriptBlock\" .
sarou écrit:

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.

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.
sarou écrit:

Ca fait un peu trick pourri non ?

Je ne sais pas, j'ai du mal à comprendre le besoin et le pb que tu rencontres.
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.

Plus d'informations
il y a 15 ans 1 mois #8636 par EdouardG
J'ai supprimé le Foreach, il est remplacé par Process {} maintenant.

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.

Plus d'informations
il y a 15 ans 1 mois #8638 par Laurent Dardenne
sarou écrit:

Seul $true m'intéresse, je ne traite pas $false.

C'est bien l'objectif d'un Switch.
sarou écrit:

j'ai un peu l'impression que c'est loin de mes compétences.

Ce n'est pas évident à coder sans spécifier clairement le comportement attendu.
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.

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