Question
[Résolu] Fonction avec Arguments
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
Désolé du temps, je reviens de vacances.
Alors pour répondre à tes questions :
La fonction SearchLdap en elle même récupère tous les attributs. (mail, UID, etcc..) Tout est stocké dans un objet de mon interprétation.
Lorsque j'utilise SearchLdap -UID, c'est pour préciser en gros la fiche annuaire attachée à l'UID à récupérer et afficher.
Par contre si j'utilise SearchLdap -UID -Mail, ca serait pour récupérer uniquement l'adresse Mail de la fiche annuaire attaché à l'UID entrée.
Et donc oui, l'UID est bien unique. (il est propre à l'utilisateur)
De ce que je comprends, tu me dis qu'il faudrait que j'intègre cette variable aux critères de recherche? Mais si à la place du l'UID je sélectionne le Login qui lui aussi est unique?
En faite cela serait une fonction avec un argument d'entré (UID, Login) qui permet de récupérer la fiche annuaire du personnel en question et un ou des argument(s) de sortie si on souhaite visualiser que le mail ou autre.
Excuse moi avec le retour de vacances, faut que je me replonge dedans.
Francis
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Précédement (28/07/17 12:16) tu écrivais :Lorsque j'utilise SearchLdap -UID, c'est pour préciser en gros la fiche annuaire attachée à l'UID à récupérer et afficher.
xaviar écrit:
Si je comprend bien dans ton traitement l'appel à SearchLdap -UID renvoi un objet et cet appel est exécuté dans une boucle, c'est bien ça ?En faite l'idée de la fonction c'était dans un premier temps pour la conception d'un script de création de compte qui récupère des informations dans un Open Ldap pour renseigner/créer les comptes dans un ActiveDirectory.
C'est pourquoi je récupère toutes les informations, car après il y aura un traitement par boucle pour chaque entrée du LDAP. D'où le $objMaRechercheOpenLdap.FindAll().
Car de ce que je comprend, mal peut être, c'est que ta fonction SearchLdap recherche via FindAll un seul compte, elle ne peut donc afficher/traiter que les propriétés d'un seul objet.
Le FindAll renvoi n objets à chaque appel, alors que tu n'en recherches qu'un seul. Cela peut poser des pb réseau et/ou une surchage serveur je pense.
De par la conception en pipeline tu devrais avoir une fonction Get-LDap -UID | Format-Ldap ou qq chose dans le genre ( Get-LDap -UID | New-MyLdapObject).
Et ceci serait appelé ainsi
[code:1]
foreach ($UID in $Array_Of_UID)
{
Get-LDap -UID $uid | Format-Ldap
#ou
Get-LDap -UID $uid | New-MyLdapObject
}
[/code:1]
Dans le cas où UID est un tableau tu peux afficher + objets :
[code:1]
Get-LDap -UID $Array_Of_UID | Format-Ldap
#ou
Get-LDap -UID $Array_Of_UID | New-MyLdapObject
}
[/code:1]
Dans ton premier mail tu écrivais ceci :
[code:1]
SearchLdap -UID 12345 | Select-Object {$_.properties.item(\"Mail\"«»)}
[/code:1]
Et dans mon exemple basé Switch je proposais cela :
[code:1]
$t=@('mail','Service')
SearchLdap -UID 12345 -property $T
[/code:1]
Donc l'objectif est d'avoir qq chose comme ceci :
[code:1]
SearchLdap -UID 12345 -property $T | Select-Object -property $T
#MyLDapObject
#UID : 12345
#Mail : Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
#Service : XYZ
[/code:1]
Si tu veux simplifier, ta fonction SearchLdap peut intégrer la génération d'un nouveaul objet que tu manipules à ta guise par la suite.
Au final select-object serait intégré à la fonction :
[code:1]
SearchLdap -UID 12345 -property $T
#MyLDapObject
#UID : 12345
#Mail : Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
#Service : XYZ
[/code:1]
Ou si tu veux utiliser seulement des switch :
[code:1]
SearchLdap -UID 12345 -Mail -Service
#MyLDapObject
#UID : 12345
#Mail : Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
#Service : XYZ
[/code:1]
Dans ce cas tu récupères tous les switch de la ligne de commande et tu construis le tableau de propriétés :
[code:1]
$T= find all switch In $PSBoundParameter SAUF UID ou Login
#contenu de $T
$T
#Service
[/code:1]
xaviar écrit:
Dans ce cas UID et Login sont exclusif, on utilise des jeux de paramètre pour savoir quel traitement effectué :De ce que je comprends, tu me dis qu'il faudrait que j'intègre cette variable aux critères de recherche? Mais si à la place du l'UID je sélectionne le Login qui lui aussi est unique?
[code:1]
function SearchLDAP {
[CmdletBinding(DefaultParameterSetName = \"UID\"«»)]
param(
[Parameter(Mandatory=$True,position=0,ParameterSetName='UID')]
$UID,
[Parameter(Mandatory=$false,position=1,ParameterSetName='Login')]
$Login,
#appartient au deux jeux de paramètre, pas besoin de préciser le ou les noms du jeu dans ce cas
[switch] $Mail,
[switch] $Service
)
if ($PsCmdlet.ParameterSetName -eq 'UID')
{ #Appel avec l'UID ...}
else
{ #Appel avec le Login...}
...
}
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
En tout cas dans l'idée que je me faisais du script.
Pour répondre à tes questions :
J'ai pas encore planché sur le script de création de compte, pour l'instant il existe en VBS et j'ai dans l'idée (vu que je touche pas du tout à VBS) de le créer en Powershell.
Mais pour éviter des lignes de code à n'en plus finir, j'ai opter pour la création de plusieurs fonctions (SearchLdap, Groupes, InjectAD, etc....)
Donc en réfléchissant rapidement, j'aurai tendance à dire que dans le cas du script de création de compte, la boucle sur le searchldap serait bien sur le résultat d'un FindAll().
Disons que la fonction SearchLdap basique telle qu'elle était écrite me suffit largement pour la création des comptes et tout.
Par contre je voulais pouvoir avoir une fonction qui me permettrais d'interroger le OpenLdap comme j'interroge un AD. Je veux connaître le mail, le service, ...Paf SearchLdap -Argument et hop je récupère le tout.
Ce qui se rapproche beaucoup de ce que tu me proposes.
Je vais tester cela et te dis.
Je vais aussi regarder niveau LDAP si je génère pas trop de requête et de charge.
Grand merci en tout cas Laurent, tu m'a éclairé sur de nouvelles perspectives dans Powershell.
Je test de suite.
@+
Francis
Francis
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Une ébauche :l'intégration du select ou l'utilisation de la récupération des switch serait l'idéal.
[code:1]
function SearchLDAP {
[CmdletBinding(DefaultParameterSetName=\"UID\"«»)]
param(
[Parameter(Mandatory=$True,position=0,ParameterSetName=\"UID\"«»)]
$UID,
[Parameter(Mandatory=$True,position=1,ParameterSetName=\"Login\"«»)]
$Login,
[switch] $Mail,
[switch] $Service,
[switch] $Tel
)
function Get-UserData { \"Datas\"}
$Properties=($PSBoundParameters.GetEnumerator()|Where-Object {($_.Value -is [switch] )}).Key
#Todo si aucun switch n'est précisé, quel est le contenu de $Properties ?
#des valeur par défaut ou pas ?
$Properties
if ($PsCmdlet.ParameterSetName -eq 'UID')
{
$user=Get-UserData -UID
}
else
{
$user=Get-UserData -Login
}
Return $user|Select-Object -property $Properties
#ou en moins bien $User|Format-Table
}
SearchLDAP -UID 12 -Mail ##renvoi un nouvel objet
SearchLDAP -Login 'tt' -Mail ##renvoi un nouvel objet
SearchLDAP #renvoi l'objet $user 'complet'
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
Du coup par rapport à ton ébauche, la partie interrogation du LDAP (connexion, Récupération des objets..) serait placée dans la function Get-UserData ou ça serait une autre fonction?
Francis
Connexion ou Créer un compte pour participer à la conversation.
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
Tiens j'ai repris tous nos echanges depuis le début et j'ai écris cela sur la fin et le résultat correspond à ce que je souhaites, mais je souhaites en savoir plus sur ton ébauche quand même.
[code:1]
if ($PsCmdlet.ParameterSetName -eq 'UID')
{
$result = ($objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"uid\"«») -eq $UID})
$result
}
Else
{
$result = ($objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"login\"«») -eq $Login})
$result
}
if ($mail) {write-host \"Mail =\" $result.Properties.get_item(\"Mail\"«»)}
if ($Service) {write-host \"Service =\" $result.properties.get_item(\"service\"«»)}
}
[/code:1]
Le seul truc qui me chagrine, c'est que si je fais pas de $result dans mes If/Else, si je demande pas de -mail ou -service, j'ai rien qui s'affiche et inversement, si je fais $result, même avec mes arguments il affichent le résultat général.
@+
Francis
Francis
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Fonction avec Arguments