Question
Login script
- Nicolas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 10 ans 7 mois #20641
par Nicolas
Login script a été créé par Nicolas
Bonjour à tous,
Je veux transformer mon login script batch en powershell mais je rencontre quelques problèmes.
Voici mon code en français :
Si l'utilisateur \"toto\" appartient au groupe \"truc\"
alors je mappe une lettre réseau.
Voila ce que je sais faire :
Mapper une lettre -> ok
[code:1]New-PSDrive -Name Y -PSProvider FileSystem -Root \\ros00006\commun_gham -Persist[/code:1]
Récupérer l'information du compte du Domaine qui est connecté au pc :
[code:1]$env:username[/code:1]
(me renvois le SAM)
Et lister les groupes à qui j'appartiens :
[code:1]([ADSI]\"LDAP://CN=HUHU HIHI,OU=SERVICE INFORMATIQUE,OU=Utilisateurs,OU=RORO,OU=BABA,OU=REGION,DC=OUPS,DC=fr\"«»).memberof [/code:1]
Mais j'ai plusieurs Hic !
Le premier : Je dois renseigner le CN pour avoir un retour sur les groupes à qui j'appartiens.
Comme je récupère le SAM avec [code:1]$env:username[/code:1] il y a t-il un moyen de renseigner le SAM au lieu du CN ?
Le deuxième : Sera de faire le IF
Je verrais le code comme ceci même si je sais que cela ne fonctionne pas :
[code:1]if($env:Username \"appartient à\" LDAP://&chemin .memberof)
{
New-PSDrive -Name Y -PSProvider FileSystem -Root \\ros00006\commun_gham -Persist
}
[/code:1]
Avez-vous une idée pour rassembler tous ces bouts de codes ? Et savoir si je suis dans la bonne voie ?
Merci d'avance,
Je veux transformer mon login script batch en powershell mais je rencontre quelques problèmes.
Voici mon code en français :
Si l'utilisateur \"toto\" appartient au groupe \"truc\"
alors je mappe une lettre réseau.
Voila ce que je sais faire :
Mapper une lettre -> ok
[code:1]New-PSDrive -Name Y -PSProvider FileSystem -Root \\ros00006\commun_gham -Persist[/code:1]
Récupérer l'information du compte du Domaine qui est connecté au pc :
[code:1]$env:username[/code:1]
(me renvois le SAM)
Et lister les groupes à qui j'appartiens :
[code:1]([ADSI]\"LDAP://CN=HUHU HIHI,OU=SERVICE INFORMATIQUE,OU=Utilisateurs,OU=RORO,OU=BABA,OU=REGION,DC=OUPS,DC=fr\"«»).memberof [/code:1]
Mais j'ai plusieurs Hic !
Le premier : Je dois renseigner le CN pour avoir un retour sur les groupes à qui j'appartiens.
Comme je récupère le SAM avec [code:1]$env:username[/code:1] il y a t-il un moyen de renseigner le SAM au lieu du CN ?
Le deuxième : Sera de faire le IF
Je verrais le code comme ceci même si je sais que cela ne fonctionne pas :
[code:1]if($env:Username \"appartient à\" LDAP://&chemin .memberof)
{
New-PSDrive -Name Y -PSProvider FileSystem -Root \\ros00006\commun_gham -Persist
}
[/code:1]
Avez-vous une idée pour rassembler tous ces bouts de codes ? Et savoir si je suis dans la bonne voie ?
Merci d'avance,
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 7 mois #20642
par Philippe
Réponse de Philippe sur le sujet Re:Login script
salut nicolas
[code:1]$SAMName = $env:username
$root = [ADSI]''
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
$searcher.filter = \"(&(objectClass=user)(sAMAccountName= $SAMName))\"
$userpath = ($searcher.findall()).path
([ADSI]\"$userpath\"«»).memberof [/code:1]
ce code te renvoie la liste de groupe auquel appartient l'utilisateur courant
ton code compare le nom de l'utilisateur à quoi ? : LDAP://&chemin .memberof) le nom d'un groupe ?
je pense que tu veux faire ceci :
[code:1]
#liste des groupes de l'utilisateur au format distinguishedName
$grDN = ([ADSI]\"$userpath\"«»).memberof
# vérifie si ce groupe fait partie des groupes de l'utilisateur et si oui crée le drive
if ($grDN -contains \"CN=nom du groupe,OU=Droit windows divers,OU=Groupe,DC=domaine,DC=fr\"«») {
Write-Host \"appartient au groupe \"
#New-PSDrive ...
}[/code:1]
ce bout de récupère la liste des groupe de l'utilisateur puis compare cette liste au distinguishedName d'un groupe précis et fait une action (New-PSDrive par exemple)
si tu a plusieurs groupe et lecteur a créé, tu peut utilisé le switch plutôt que le if ! a toi de voir
j'espère que c'est clair<br><br>Message édité par: 6ratgus, à: 18/08/15 15:13
oui assez simplement via un filtre et une requête ldap :l y a t-il un moyen de renseigner le SAM au lieu du CN ?
[code:1]$SAMName = $env:username
$root = [ADSI]''
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
$searcher.filter = \"(&(objectClass=user)(sAMAccountName= $SAMName))\"
$userpath = ($searcher.findall()).path
([ADSI]\"$userpath\"«»).memberof [/code:1]
ce code te renvoie la liste de groupe auquel appartient l'utilisateur courant
la je manque d'info.Le deuxième : Sera de faire le IF
Je verrais le code comme ceci même si je sais que cela ne fonctionne pas :
ton code compare le nom de l'utilisateur à quoi ? : LDAP://&chemin .memberof) le nom d'un groupe ?
je pense que tu veux faire ceci :
[code:1]
#liste des groupes de l'utilisateur au format distinguishedName
$grDN = ([ADSI]\"$userpath\"«»).memberof
# vérifie si ce groupe fait partie des groupes de l'utilisateur et si oui crée le drive
if ($grDN -contains \"CN=nom du groupe,OU=Droit windows divers,OU=Groupe,DC=domaine,DC=fr\"«») {
Write-Host \"appartient au groupe \"
#New-PSDrive ...
}[/code:1]
ce bout de récupère la liste des groupe de l'utilisateur puis compare cette liste au distinguishedName d'un groupe précis et fait une action (New-PSDrive par exemple)
si tu a plusieurs groupe et lecteur a créé, tu peut utilisé le switch plutôt que le if ! a toi de voir
j'espère que c'est clair<br><br>Message édité par: 6ratgus, à: 18/08/15 15:13
Connexion ou Créer un compte pour participer à la conversation.
- Nicolas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 10 ans 7 mois #20645
par Nicolas
Réponse de Nicolas sur le sujet Re:Login script
Bonjour 6ratgus !
Merci à toi pour ta réponse.
Je n'arrive pas à faire fonctionné le premier bout de code même en mettant le chemin LDAP dans la variable root.
Donc si je comprend bien ce que tu m'as répondus et la fonction du code.
Dans un premier temps on récupère CN pour le \"transformer\" en SamAccountname ?
Ensuite il scrute l'utilisateur et nous sort tous les groupes auquel il appartient et stocke le résultat dans la variable [code:1]$grDN[/code:1]
Puis on fait notre condition.
Si c'est ça, c'est clair pour moi.
Je pense que les switchs seront plus appropriés dans ce genre de situation. Je vais aller voir fonctionne ceci
Peut-être des switch case comme en C..
Encore merci
Merci à toi pour ta réponse.
Je n'arrive pas à faire fonctionné le premier bout de code même en mettant le chemin LDAP dans la variable root.
Donc si je comprend bien ce que tu m'as répondus et la fonction du code.
Dans un premier temps on récupère CN pour le \"transformer\" en SamAccountname ?
Ensuite il scrute l'utilisateur et nous sort tous les groupes auquel il appartient et stocke le résultat dans la variable [code:1]$grDN[/code:1]
Puis on fait notre condition.
Si c'est ça, c'est clair pour moi.
Je pense que les switchs seront plus appropriés dans ce genre de situation. Je vais aller voir fonctionne ceci
Peut-être des switch case comme en C..
Encore merci
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 7 mois #20646
par Philippe
j'ai un peu modifié mon code avec findone au lieu de findall, qui ne retourne que le premier objet trouvé. vu qu'il n'y qu'un seul sAMAccountName par domaine c'est pas un problème ici
et je récupère les groupes dans la même opération et donc plus qu'une requête LDAP vers le serveur AD
[code:1]
$SAMName = $env:username # nom de l'utilisateur courant
# pour les tests tu peut faire $SAMName = \"nicolas\"
$root = [ADSI]'' # si plusieurs domaine on précise lequel sinon on laisse vide
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
# le filtre avoir un user avec sAMAccountName égale à $SAMName
$searcher.filter = \"(&(objectClass=user)(sAMAccountName= $SAMName))\"
#liste des groupes de l'utilisateur au format distinguishedName
$grDN = ($searcher.findone()).properties.memberof
[/code:1]
[code:1]
foreach ($x in $grDN) {
switch ($x) {
'CN=G_ADMIN,OU=Droit windows divers,OU=Groupe,DC=domaine,DC=lan' {
Write-Host \"appartient au groupe G_ADMIN\"
# new-psdrive
}
{$_ -in 'A','B','C'} {
Write-Host \"appartient au groupe A ou B ou C\"
# new-psdrive
}
'value3' {
Write-Host \"appartient au groupe 3\"
# new-psdrive
}
Default {
Write-Host \"et le fameux groupe par defaut\"
# new-psdrive
}
}
}
[/code:1]
Réponse de Philippe sur le sujet Re:Login script
tu peut être plus précis ? à tu un message d'erreur ?Je n'arrive pas à faire fonctionné le premier bout de code même en mettant le chemin LDAP dans la variable root.
j'ai un peu modifié mon code avec findone au lieu de findall, qui ne retourne que le premier objet trouvé. vu qu'il n'y qu'un seul sAMAccountName par domaine c'est pas un problème ici
et je récupère les groupes dans la même opération et donc plus qu'une requête LDAP vers le serveur AD
[code:1]
$SAMName = $env:username # nom de l'utilisateur courant
# pour les tests tu peut faire $SAMName = \"nicolas\"
$root = [ADSI]'' # si plusieurs domaine on précise lequel sinon on laisse vide
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
# le filtre avoir un user avec sAMAccountName égale à $SAMName
$searcher.filter = \"(&(objectClass=user)(sAMAccountName= $SAMName))\"
#liste des groupes de l'utilisateur au format distinguishedName
$grDN = ($searcher.findone()).properties.memberof
[/code:1]
oui mais voici un exemple pour être plus clair ...Peut-être des switch case comme en C..
[code:1]
foreach ($x in $grDN) {
switch ($x) {
'CN=G_ADMIN,OU=Droit windows divers,OU=Groupe,DC=domaine,DC=lan' {
Write-Host \"appartient au groupe G_ADMIN\"
# new-psdrive
}
{$_ -in 'A','B','C'} {
Write-Host \"appartient au groupe A ou B ou C\"
# new-psdrive
}
'value3' {
Write-Host \"appartient au groupe 3\"
# new-psdrive
}
Default {
Write-Host \"et le fameux groupe par defaut\"
# new-psdrive
}
}
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Nicolas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 10 ans 7 mois #20651
par Nicolas
Réponse de Nicolas sur le sujet Re:Login script
Salut 6ratgus.
Mon script fonctionne bien en local.
Mais l'exécution de mon script au démarrage de session et qui se trouve sur mon contrôleur de domaine ne se passe pas comme prévu.
Voici l'avertissement :
[code:1]N'exécutez que des scripts que vous approuvez. Bien que les scripts en
provenance d'Internet puissent être utiles, ce script est susceptible
d'endommager votre ordinateur. Voulez-vous exécuter
Z:\Logon\toto.ps1 ?
[N] Ne pas exécuter [O] Exécuter une fois Suspendre [?] Aide
(la valeur par défaut est « N ») :[/code:1]
Mon .bat ressemble à ceci :
[code:1]powershell -command \"& {Set-ExecutionPolicy unrestricted -force}\"
powershell C:\Desktop\test.ps1
powershell -command \"& {Set-ExecutionPolicy restricted -force}\"[/code:1]
En faisant mes recherches sur Google je suis tombé sur ce topic :
J'ai lu le sujet et ouvert le lien de Laurent mais je ne comprend pas bien la démarche.
Je comprend que l'exécution de mon script ce fait comme-ci c'était un script qui avait été DL sur le net.
Donc si je comprend bien 2 solutions s'offre à moi :
- Signé mon script
- Ou changer la clef de registre ? UNCAsintranet
J'ai essayé le deuxième mais la valeur reviens par défaut à 1.
Mon script fonctionne bien en local.
Mais l'exécution de mon script au démarrage de session et qui se trouve sur mon contrôleur de domaine ne se passe pas comme prévu.
Voici l'avertissement :
[code:1]N'exécutez que des scripts que vous approuvez. Bien que les scripts en
provenance d'Internet puissent être utiles, ce script est susceptible
d'endommager votre ordinateur. Voulez-vous exécuter
Z:\Logon\toto.ps1 ?
[N] Ne pas exécuter [O] Exécuter une fois
(la valeur par défaut est « N ») :[/code:1]
Mon .bat ressemble à ceci :
[code:1]powershell -command \"& {Set-ExecutionPolicy unrestricted -force}\"
powershell C:\Desktop\test.ps1
powershell -command \"& {Set-ExecutionPolicy restricted -force}\"[/code:1]
En faisant mes recherches sur Google je suis tombé sur ce topic :
J'ai lu le sujet et ouvert le lien de Laurent mais je ne comprend pas bien la démarche.
Je comprend que l'exécution de mon script ce fait comme-ci c'était un script qui avait été DL sur le net.
Donc si je comprend bien 2 solutions s'offre à moi :
- Signé mon script
- Ou changer la clef de registre ? UNCAsintranet
J'ai essayé le deuxième mais la valeur reviens par défaut à 1.
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 7 mois #20652
par Philippe
Réponse de Philippe sur le sujet Re:Login script
pour ce problème de message, comme l'explique Laurent la seule solution est de rajouter ton nom de domaine au site de confiance de IE comme
expliqué ici
cette manip est a faire sur tous les ordinateurs qui vont lancé le script au démarrage !!
c'est IE qui gère la sécurité de Windows,
tu aura au passage moins de messages d'avertissements lors d'une action comme le copier/coller depuis un serveur vers ton poste !
si tu a un domaine tu peut faire une GPO utilisateur mais attention tu risque de supprimé les sites rajoutés par l'utilisateurs si tu utilise l'option classic via stratégies/modeles d'administration/composants Windows/internet explorer/onglet securité/liste des attributions de sites aux zones.
Pour ma part, j'ai choisi de faire l'ajout via une GPO registry avec les paramètres ci-dessous :
Ruche HKEY_CURRENT_USER
Chemin d’accès à la clé Software/Microsoft/Windows/CurrentVersion/Internet Settings/ZoneMap/Domains/mondomaine.com
Nom de la valeur *
Type de la valeur REG_DWORD
Données de la valeur 0x2 (2)
mais avant tous, travaille tu dans un domaine AD ?<br><br>Message édité par: 6ratgus, à: 20/08/15 16:51
cette manip est a faire sur tous les ordinateurs qui vont lancé le script au démarrage !!
c'est IE qui gère la sécurité de Windows,
tu aura au passage moins de messages d'avertissements lors d'une action comme le copier/coller depuis un serveur vers ton poste !
si tu a un domaine tu peut faire une GPO utilisateur mais attention tu risque de supprimé les sites rajoutés par l'utilisateurs si tu utilise l'option classic via stratégies/modeles d'administration/composants Windows/internet explorer/onglet securité/liste des attributions de sites aux zones.
Pour ma part, j'ai choisi de faire l'ajout via une GPO registry avec les paramètres ci-dessous :
Ruche HKEY_CURRENT_USER
Chemin d’accès à la clé Software/Microsoft/Windows/CurrentVersion/Internet Settings/ZoneMap/Domains/mondomaine.com
Nom de la valeur *
Type de la valeur REG_DWORD
Données de la valeur 0x2 (2)
mais avant tous, travaille tu dans un domaine AD ?<br><br>Message édité par: 6ratgus, à: 20/08/15 16:51
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.059 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Login script