Question Liste des groupes d'un utilisateur

Plus d'informations
il y a 16 ans 9 mois #411 par Guillaume MAISON
Bonjour,

je suis en train de m'intéresser très fortement au PowerShell.

du fait de postes clients ... hasardeux, je suis obligé de transformer certains trucs bien pratiques avec les GPO en scripts... j'ai donc écris quelques cripts en VBScript pour mapper des lecteurs réseaux en fonction de l'appartenance à tel ou tel groupe. Ca marche à la perfection.

Maintenant, j'aimerais pouvoir le faire également en PowerShell.

J'ai trouvé ici les scripts pour lister les utilisateurs d'un groupe mais je n'ai pas trouvé l'autre possibilité avoir les groupes d'un utilisateur (et bien sûr obtenir le nom de l'utilisateur courant)

l'algorithme serait celui-ci (et si ce script fonctionne, je souhaiterait fortement le mettre dans la liste des scripts présents ici ;) :
[code:1]
Récupérer les groupes de l'utilisateur courant

Si Utilisateur.MembreDe.Trouve(Groupe1) Alors
Créer lecteur réseau pour membres du Groupe1
Affecter Imprimante1Groupe1
Affecter Imprimante2Groupe1
Fin Si
Si Utilisateur.MembreDe.Trouve(Groupe2) Alors
Créer lecteur réseau pour membres du Groupe2
Affecter Imprimante1Groupe1
Fin Si

etc...

[/code:1]

Et on pourrait imaginer beaucoup d'autres choses... comme l'exécution automatique de programmes d'installation en fonction de beaucoup de choses.

Voilà :)

Merci d'avance,

Guillaume

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #412 par Arnaud Petitjean
Bonjour Chtonk et bienvenue à toi sur le forum ! ;)

J'ai fait un petit script qui je pense répond à ton besoin. Regarde ceci :

[code:1]
# Récupération du nom de l'utilisateur connecté
function QuiEstConnecte
{
$currentuser = [system.security.principal.windowsidentity]::getcurrent()
$name = $currentuser.name.Substring($currentuser.name.lastindexof(\"\\"«»)+1)
return $name
}

function EstDansGroupeNT ([string]$groupe_choisi,$user)
{

$EstDansGroupe = $false
$groupe = ([ADSI]\"LDAP://CN=$($groupe_choisi),OU=Groupes,DC=powershell-scripting,DC=com\"«»)
foreach ($i in $groupe.member)
{
if($i.length -gt 1)
{
$nom_courant = $i.substring(3,$i.IndexOf(\",\"«»)-3)
if ($nom_courant -eq $user)
{
$EstDansGroupe = $true
}
}
}
return $EstDansGroupe
}

### Début du programme

$user = QuiEstConnecte
if ( (EstDansGroupeNT \"Admins du domaine\" $user) -eq $true )
{
Créer lecteur réseau pour membres du Groupe1
Affecter Imprimante1Groupe1
Affecter Imprimante2Groupe1
}
else
{
Faire autre chose
}
[/code:1]

Je l'ai un peu modifié en live pour que ça colle au mieux à ton besoin, dis moi si ça marche ;)

@++

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #414 par Guillaume MAISON
Arnaud écrit:

Bonjour Chtonk et bienvenue à toi sur le forum ! ;)


Bonjour et merci pour l'accueil et la réponse ! :)


J'ai fait un petit script qui je pense répond à ton besoin. Regarde ceci :

[code:1]
# Récupération du nom de l'utilisateur connecté
function QuiEstConnecte
{
$currentuser = [system.security.principal.windowsidentity]::getcurrent()
$name = $currentuser.name.Substring($currentuser.name.lastindexof(\"\\"«»)+1)
return $name
}
[/code:1]

Mon souci est là, le Name retourné est celui du login.

[code:1]
function EstDansGroupeNT ([string]$groupe_choisi,$user)
{

$EstDansGroupe = $false
$groupe = ([ADSI]\"LDAP://CN=$($groupe_choisi),OU=Groupes,DC=powershell-scripting,DC=com\"«»)
foreach ($i in $groupe.member)
{
if($i.length -gt 1)
{
$nom_courant = $i.substring(3,$i.IndexOf(\",\"«»)-3)
if ($nom_courant -eq $user)
[/code:1]

Alors qu'ici le nom_courant est le nom complet (prénom + nom). Et il ne le trouve jamais...


Je l'ai un peu modifié en live pour que ça colle au mieux à ton besoin, dis moi si ça marche ;)

Arnaud


Et donc j'ai essayé de chercher mais la doc du .Net n'est pas assez orientée opérationnelle, juste une référence.

Je vais continuer de chercher...

Merci pour le coup de main en tout cas !

Cordialement,

Guillaume

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #415 par Arnaud Petitjean
Quelle est la propriété de l'Active Directory que tu souhaites remonter ? Le DisplayName ?

Si c'est le cas, il faut que tu fasses une requête LDAP auprès d'AD afin de récupérer le champ AD qui t'interesses à partir du nom de l'utilisateur connecté.

Tu peux essayer de te baser sur le script suivant : Récupérer la date de dernière connexion de tous les utilisateurs AD .

Sinon pour ma fonction EstDansGroupe, je crois qu'elle ne marche qu'avec les groupes Globaux (ou alors c'est avec les locaux).

Bon courage, et tiens nous au courant de la suite. ;)

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #427 par Guillaume MAISON
Bonjour et merci pour les indications.

Je crois bien que j'ai réussi et voici le résultat de mes recherches et tests.

Je rappelle que mon besoin était de savoir, pour l'utilisateur connecté, quels sont ses groupes d'appartenance et en fonction de faire certaines actions. Dans le script ci-dessous, il s'agit tout simplement de créer un lecteur réseau par groupe.

[code:1]
# Récupération du nom de l'utilisateur connecté
function QuiEstConnecte() {
$lCurrentUser = [system.security.principal.windowsidentity]::getcurrent()
$name = $lCurrentUser.name.Substring($lCurrentUser.name.lastindexof(\"\\"«»)+1)
return $name
}

# Détermination si l'utilisateur courant est bien dans le groupe demandé
function EstDansGroupe ([string] $groupechoisi) {
$IsIn = $false
$lCurUser =QuiEstConnecte
$ldapQuery = \"(samaccountname=\"+$lCurUser+\"«»)\"
$de = new-object system.directoryservices.directoryentry
$ads = new-object system.directoryservices.directorysearcher -argumentlist $de,$ldapQuery
$users = $ads.findall()
$user = $users[0]
foreach ($groupe in $user.properties.memberof) {
if (($groupe.tolower()).IndexOf(\"cn=\"+$groupechoisi.tolower()) -ge 0) {
$IsIn=$true
break
}
}
return $IsIn
}

$Compta_Group = \"compta\"
$Compta_Share = \"Compta\"

$Direction_Group = \"direction\"
$Direction_Share = \"Direction\"

$Commun_group = \"commun\"
$Commun_Share = \"Commun\"

$Users_Group = \"users\"
$users_Share = \"Users\"

$Serveur = \"SERVER\"


### Début du programme
$CurrentUser =QuiEstConnecte
$obj = New-Object -com Wscript.Network

if (EstDansGroupe($Compta_group)) {
Write-Host $CurrentUser \" appartient au groupe \" $Compta_Group
$obj.MapNetworkDrive(\"Z:\", \"\\\"+$Serveur+\"\\"+$Compta_Share)
}

if (EstDansGroupe($Direction_group)) {
Write-Host $CurrentUser \" appartient au groupe \" $Direction_Group
$obj.MapNetworkDrive(\"Y:\", \"\\\"+$Serveur+\"\\"+$Direction_Share)
}

if (EstDansGroupe($Commun_group)) {
Write-Host $CurrentUser \" appartient au groupe \" $Commun_Group
$obj.MapNetworkDrive(\"X:\", \"\\\"+$Serveur+\"\\"+$Commun_Share)
}

if (EstDansGroupe($Users_group)) {
Write-Host $CurrentUser \" appartient au groupe \" $Users_Group
$obj.MapNetworkDrive(\"W:\", \"\\\"+$Serveur+\"\\"+$Users_Share+\"\\"+$CurrentUser)
}

[/code:1]

Je rappelle que ce script est donné tel que et ne
saurait engager la responsabilité de son auteur pour une utilisation autre que celle rappelé en début de message.

Beaucoup de choses ne sont pas dépendantes de ce script, comme les droits affectés aux partages, au dossiers et fichiers.

Use des améliorations à apporter serait de ne pas passer par le WScript.Network pour effectuer cette connexion car, si j'ai bien lu je ne sais plus où, le WScript est amené à disparaître non ? au profit de PowerShell ...

Cordialement,<br><br>Message édité par: chtonk, à: 4/06/07 13:35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #428 par Arnaud Petitjean
Parfait ! Ton script a l'air plutôt bien ;)

Le plus simple et le plus courant est bien d'utiliser l'objet COM WScript.
Sinon effectivement Microsoft a bien annoncé la mort de VBScript mais pas forcément de WSH, ce sont 2 choses différentes.

Toutefois j'ai trouvé une méthode alternative (100% PowerShell) pour monter un lecteur réseau sur un partage qui peut t'intéresser.
Regarde ici : mow001.blogspot.com/2006/05/powershell-m...ive-of-unc-path.html

Merci pour ta contribution. :woohoo:

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

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