Question
ValueFromPipelineByPropertyName et obj differents
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 19
- Remerciements reçus 0
il y a 15 ans 1 mois #8601
par EdouardG
ValueFromPipelineByPropertyName et obj differents a été créé par EdouardG
Salut à tous,
Tout d'abord merci pour votre site et vos tutos qui sont souvent une source d'inspiration pour moi !
Je suis admin sys & réseau dans un centre de recherche, et je suis plutôt spécialisé dans les DataCenter et la virtualisation.
J'ai suivi une formation PowerShell en décembre et j'ai déjà conçu quelques scripts avec des interactions NAS et AD, j'aimerais vous les soumettre à l'occasion.
Je viens de lire le document sur les fonctions avancées. C'est plutôt complexe, même sur internet les infos se font assez rares j'ai l'impression, en tout cas il m'a beaucoup apporté (même si je suis très loin d'avoir tout compris).
Là je travaille sur une fonction toute bête : Repair-HomeDir
Cette fonction répare les droits sur les HomeDirectory des utilisateurs Active Directory et j'aimerais pouvoir piper des objets dans cette fonction.
Pour le moment le pipe fonction bien avec une entrée de type Get-ADUser, j'aimerais également que cette fonction puisse recevoir une entrée de type Get-ChildItem. (je pars du postulat suivant : les noms de dossiers en entrée sont égales au SamAccountName AD de l'utilisateur).
Ca ne fonctionne pas avec Get-ChildItem, puisqu'il faut que je l'appelle, dans la commande Get-ADUser, avec sa propriété Name.
Sauf que je ne vois pas comment faire ça sans enchainer les conditions pour détecter le type d'objet.
Voici le code :
[code:1]Function global:Repair-Homedir
{
#Parametres de la commande :
param([parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,HelpMessage=\"Indiquez l'identifiant de l'utilisateur AD\"«»)]
[Alias('SamAccountName')]
[String]$Name,
[string]$Right=$true,
[string]$Owner=$true)
$Name =@($input)
Import-Module ActiveDirectory
foreach ($UserName in $Name)
{
Write-Host $UserName
try
{
$User = (Get-ADUser -Identity $($UserName.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 ((Test-Path $($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
}
}
}
<#
.SYNOPSIS
Permet de réparer les HomeDirectory des utilisateurs AD.
.DESCRIPTION
Repair-HomeDir est une fonction qui permet de réparer les droits de l'HomeDirectory d'un utilisateur. Il rend la propriete à l'utilisateur et lui ajoute le contrôle total. La fonction réparera les droits sur le dossier indiqué dans la variable HomeDir de son profil Active Directory.
.PARAMETER Name
Indiquez le nom de l'utilisateur ou l'identifiant d'un utilisateur Active Directory. Cette information peut être reçue via Pipe.
.PARAMETER Right
Indiquez false ou true, valeur par défaut true.
Si true, la fonction remettra les droits contrôle total sur l'ensemble du HomeDirectory de l'utilisateur.
.PARAMETER Owner
Indiquez false ou true, valeur par défaut true, c'est à dire que la vérification sera toujours effectuée par défaut.
Si true, la fonction remettra l'utilisateur proprietaire de son HomeDirectory.
.INPUTS
Le nome des utilisateurs AD peut être reçu via le Pipe.
.OUTPUTS
La sortie peut être redirigée.
.EXAMPLE
C:\PS> Repair-HomeDir -Name user
Cette commande reappliquera les droits de l'utilisateur edgarcia sur son HomeDir : contrôle total et proprietés.
.EXAMPLE
C:\PS> Repair-HomeDir -Name user -Owner false
Cette commande reappliquera les droits de l'utilisateur sur contrôle total mais ne corrigera pas l'appropriation de ses fichiers.
.EXAMPLE
C:\PS> Get-ADUser * - SearchBase \"OU=Utilisateurs, DC=Domaine,DC=Local\" -SearchScope SubTree -Properties Name, SamAccountName, HomeDirectory | Repair-HomeDir
Cette commande reappliquera les droits de tous les utilisateur de l'OU Utilisateurs.
.NOTES
#>[/code:1]
Merci pour votre aide !
Bonne soirée,
-sarou-
Tout d'abord merci pour votre site et vos tutos qui sont souvent une source d'inspiration pour moi !
Je suis admin sys & réseau dans un centre de recherche, et je suis plutôt spécialisé dans les DataCenter et la virtualisation.
J'ai suivi une formation PowerShell en décembre et j'ai déjà conçu quelques scripts avec des interactions NAS et AD, j'aimerais vous les soumettre à l'occasion.
Je viens de lire le document sur les fonctions avancées. C'est plutôt complexe, même sur internet les infos se font assez rares j'ai l'impression, en tout cas il m'a beaucoup apporté (même si je suis très loin d'avoir tout compris).
Là je travaille sur une fonction toute bête : Repair-HomeDir
Cette fonction répare les droits sur les HomeDirectory des utilisateurs Active Directory et j'aimerais pouvoir piper des objets dans cette fonction.
Pour le moment le pipe fonction bien avec une entrée de type Get-ADUser, j'aimerais également que cette fonction puisse recevoir une entrée de type Get-ChildItem. (je pars du postulat suivant : les noms de dossiers en entrée sont égales au SamAccountName AD de l'utilisateur).
Ca ne fonctionne pas avec Get-ChildItem, puisqu'il faut que je l'appelle, dans la commande Get-ADUser, avec sa propriété Name.
Sauf que je ne vois pas comment faire ça sans enchainer les conditions pour détecter le type d'objet.
Voici le code :
[code:1]Function global:Repair-Homedir
{
#Parametres de la commande :
param([parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,HelpMessage=\"Indiquez l'identifiant de l'utilisateur AD\"«»)]
[Alias('SamAccountName')]
[String]$Name,
[string]$Right=$true,
[string]$Owner=$true)
$Name =@($input)
Import-Module ActiveDirectory
foreach ($UserName in $Name)
{
Write-Host $UserName
try
{
$User = (Get-ADUser -Identity $($UserName.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 ((Test-Path $($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
}
}
}
<#
.SYNOPSIS
Permet de réparer les HomeDirectory des utilisateurs AD.
.DESCRIPTION
Repair-HomeDir est une fonction qui permet de réparer les droits de l'HomeDirectory d'un utilisateur. Il rend la propriete à l'utilisateur et lui ajoute le contrôle total. La fonction réparera les droits sur le dossier indiqué dans la variable HomeDir de son profil Active Directory.
.PARAMETER Name
Indiquez le nom de l'utilisateur ou l'identifiant d'un utilisateur Active Directory. Cette information peut être reçue via Pipe.
.PARAMETER Right
Indiquez false ou true, valeur par défaut true.
Si true, la fonction remettra les droits contrôle total sur l'ensemble du HomeDirectory de l'utilisateur.
.PARAMETER Owner
Indiquez false ou true, valeur par défaut true, c'est à dire que la vérification sera toujours effectuée par défaut.
Si true, la fonction remettra l'utilisateur proprietaire de son HomeDirectory.
.INPUTS
Le nome des utilisateurs AD peut être reçu via le Pipe.
.OUTPUTS
La sortie peut être redirigée.
.EXAMPLE
C:\PS> Repair-HomeDir -Name user
Cette commande reappliquera les droits de l'utilisateur edgarcia sur son HomeDir : contrôle total et proprietés.
.EXAMPLE
C:\PS> Repair-HomeDir -Name user -Owner false
Cette commande reappliquera les droits de l'utilisateur sur contrôle total mais ne corrigera pas l'appropriation de ses fichiers.
.EXAMPLE
C:\PS> Get-ADUser * - SearchBase \"OU=Utilisateurs, DC=Domaine,DC=Local\" -SearchScope SubTree -Properties Name, SamAccountName, HomeDirectory | Repair-HomeDir
Cette commande reappliquera les droits de tous les utilisateur de l'OU Utilisateurs.
.NOTES
#>[/code:1]
Merci pour votre aide !
Bonne soirée,
-sarou-
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 1 mois #8602
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:ValueFromPipelineByPropertyName et obj differents
C'est la fin de la journée, je n'ai donc peut-être pas bien compris la question...
A priori ta fonction accepte bien les répertoires fournis en entrée par un gci. Qu'est-ce que tu veux faire qui ne marche pas ?
Si je réduis ta fonction au strict minimum pour un test, ça me donne :
[code:1]
function global:Repair-Homedir
{
param(
[parameter(Position=0,
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
HelpMessage=\"Indiquez l'identifiant de l'utilisateur AD\"«»)]
[Alias('SamAccountName')]
[String]$Name
)
$Name =@($input)
foreach ($UserName in $Name)
{
$UserName
}
}
dir | repair-homedir
user1
user2
user3
...
[/code:1]
J'ai évidemment changé les noms de répertoire pour figurer des noms d'utilisateurs, mais le principe reste le même.
A priori ta fonction accepte bien les répertoires fournis en entrée par un gci. Qu'est-ce que tu veux faire qui ne marche pas ?
Si je réduis ta fonction au strict minimum pour un test, ça me donne :
[code:1]
function global:Repair-Homedir
{
param(
[parameter(Position=0,
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
HelpMessage=\"Indiquez l'identifiant de l'utilisateur AD\"«»)]
[Alias('SamAccountName')]
[String]$Name
)
$Name =@($input)
foreach ($UserName in $Name)
{
$UserName
}
}
dir | repair-homedir
user1
user2
user3
...
[/code:1]
J'ai évidemment changé les noms de répertoire pour figurer des noms d'utilisateurs, mais le principe reste le même.
Connexion ou Créer un compte pour participer à la conversation.
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 19
- Remerciements reçus 0
il y a 15 ans 1 mois #8611
par EdouardG
Réponse de EdouardG sur le sujet Re:ValueFromPipelineByPropertyName et obj differents
Salut Janel et merci pour ta réponse.
En fait dans la version de la fonction que j'ai posté, le pipe fonctionne avec GCI mais pas avec Get-ADUser.
J'aimerais simplement que la fonction puisse accepter tout ce qui arrive (enfin tout, GCI et GADU suffiraient).
Et, question subsidiaire pour ma culture personnelle
, est-ce que le script semble correct ? Quelles sont les possibilités d'améliorations ?
Bonne journée,
Sarou
En fait dans la version de la fonction que j'ai posté, le pipe fonctionne avec GCI mais pas avec Get-ADUser.
J'aimerais simplement que la fonction puisse accepter tout ce qui arrive (enfin tout, GCI et GADU suffiraient).
Et, question subsidiaire pour ma culture personnelle
Bonne journée,
Sarou
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 1 mois #8612
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:ValueFromPipelineByPropertyName et obj differents
Je n'ai pas le temps de tester ton script avant la semaine prochaine, mais il est possible, voire probable, que ça ne marche pas avec Get-ADUser parce que la propriété samAccountName sur laquelle ta fonction devrait se rattacher à chaque objet, n'est mentionnée dans ta fonction que comme alias du paramètre $name.
En fait, tu aurais tout intérêt à créer deux jeux de paramètres dans ta fonction :
* Un jeu de paramètres \"Directory\" qui accepte en entrée un nom de répertoire (paramètre $name de type String),
* Un jeu de paramètres \"ADUser\" qui accepte en entrée soit un nom de compte (paramètre $samAccountName de type String), soit carrément un objet ADUser (type exact à vérifier selon ce qui est retourné par Get-ADUSer).
Tu peux déclarer un jeu de paramètres par défaut en ajoutant la ligne suivante en début de script (ou de fonction) :
[code:1]
[CmdletBinding(DefaultParameterSetName=\"Directory\"«»)]
[/code:1]<br><br>Message édité par: janel, à: 28/01/11 13:29
En fait, tu aurais tout intérêt à créer deux jeux de paramètres dans ta fonction :
* Un jeu de paramètres \"Directory\" qui accepte en entrée un nom de répertoire (paramètre $name de type String),
* Un jeu de paramètres \"ADUser\" qui accepte en entrée soit un nom de compte (paramètre $samAccountName de type String), soit carrément un objet ADUser (type exact à vérifier selon ce qui est retourné par Get-ADUSer).
Tu peux déclarer un jeu de paramètres par défaut en ajoutant la ligne suivante en début de script (ou de fonction) :
[code:1]
[CmdletBinding(DefaultParameterSetName=\"Directory\"«»)]
[/code:1]<br><br>Message édité par: janel, à: 28/01/11 13:29
Connexion ou Créer un compte pour participer à la conversation.
- EdouardG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 19
- Remerciements reçus 0
il y a 15 ans 1 mois #8618
par EdouardG
Réponse de EdouardG sur le sujet Re:ValueFromPipelineByPropertyName et obj differents
Hello,
Merci pour ta réponse !
La script fonctionne, il n'y a pas de soucis, j'en avais besoin rapidement en exploitation, il vient de me récupérer les droits de toute une arbo de Home dont les acl avaient mystérieusement sautées. J'aimerais juste qu'il soit bien propre et fonctionnel pour le déployer d'une façon un peu plus large.
Je vais creuser les jeux de paramètres et CmdletBinding (qui reste assez obscur à mon niveau pour le moment).
Merci encore !
Bon week-end,
Sarou
Merci pour ta réponse !
La script fonctionne, il n'y a pas de soucis, j'en avais besoin rapidement en exploitation, il vient de me récupérer les droits de toute une arbo de Home dont les acl avaient mystérieusement sautées. J'aimerais juste qu'il soit bien propre et fonctionnel pour le déployer d'une façon un peu plus large.
Je vais creuser les jeux de paramètres et CmdletBinding (qui reste assez obscur à mon niveau pour le moment).
Merci encore !
Bon week-end,
Sarou
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 1 mois #8619
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:ValueFromPipelineByPropertyName et obj differents
Salut,
sarou écrit:
A priori sa présence modifie le comportement de la liaison de paramètres en reproduisant celui des cmdlets (C#/VB.NET/..), mais j'ai parfois un peu de mal à voir un changement...
Concernant le code de la fonction, déjà elle est lisible et structurée, du pain bénit pour la maintenance
De mon côté il y a un truc qui chiffonne dans la signature de ta fonction :
[code:1]
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
[/code:1]
Je ne sais pas (plus ?) lequel prime.
Soit on \"récupère\" un objet, soit une propriété d'un objet.
On peut retrouver cette configuration sur plusieurs paramètres, on paramètre une fonction à partir de certains membres d'un objet, mais si on récupère l'objet dans son intégralité il n'est pas nécessaire de préciser ses membres en tant que paramètres.
Ou alors, comme le dit Janel, en fin de journée il y a des trucs qui nous échappent
Ensuite ici :
[code:1]
[string]$Right=$true,
[string]$Owner=$true
[/code:1]
La déclaration de deux switch est à étudier, la fatigue sûrement
.
[code:1]
$Name =@($input)
[/code:1]
Et là, je décroche:silly:
A moins que tu ais oublié de déclarer, dans ta fonction, le bloc Process, ce qui m'arrive souvent.
De ce que j'ai compris de PS, c'est que la variable $Input n'a d'usage que dans le bloc End d'une fonction .
sarou écrit:
sarou écrit:
T'es pas le seulCmdletBinding (qui reste assez obscur à mon niveau pour le moment).
A priori sa présence modifie le comportement de la liaison de paramètres en reproduisant celui des cmdlets (C#/VB.NET/..), mais j'ai parfois un peu de mal à voir un changement...
Concernant le code de la fonction, déjà elle est lisible et structurée, du pain bénit pour la maintenance
De mon côté il y a un truc qui chiffonne dans la signature de ta fonction :
[code:1]
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
[/code:1]
Je ne sais pas (plus ?) lequel prime.
Soit on \"récupère\" un objet, soit une propriété d'un objet.
On peut retrouver cette configuration sur plusieurs paramètres, on paramètre une fonction à partir de certains membres d'un objet, mais si on récupère l'objet dans son intégralité il n'est pas nécessaire de préciser ses membres en tant que paramètres.
Ou alors, comme le dit Janel, en fin de journée il y a des trucs qui nous échappent
Ensuite ici :
[code:1]
[string]$Right=$true,
[string]$Owner=$true
[/code:1]
La déclaration de deux switch est à étudier, la fatigue sûrement
[code:1]
$Name =@($input)
[/code:1]
Et là, je décroche:silly:
A moins que tu ais oublié de déclarer, dans ta fonction, le bloc Process, ce qui m'arrive souvent.
De ce que j'ai compris de PS, c'est que la variable $Input n'a d'usage que dans le bloc End d'une fonction .
sarou écrit:
Ce n'est que de la technique, tout le monde peut l'apprendre. Tu verras dans 6 mois/un an qu'il n'y a rien de complexe là dedans.<br><br>Message édité par: Laurent Dardenne, à: 28/01/11 21:36Je viens de lire le document sur les fonctions avancées. C'est plutôt complexe,
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.107 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- ValueFromPipelineByPropertyName et obj differents