IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

lettre de lecteur réseau dynamique [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 75
    Points : 53
    Points
    53
    Par défaut lettre de lecteur réseau dynamique
    Bonjour,

    J'ai un script ps qui me permet de connecter un lecteur réseau selon le groupe d'appartenance de l'utilisateur. (lancé par GPO au logon)

    Chaque partage est attribué avec la lettre de lecteur W (j'ai trop de partage pour affecter une lettre différente à chaque partage)

    mon problème est qu'il est possible qu'un utilisateur appartienne à 2 groupes différents, à ce moment là, il aurait 2 lecteurs W: => impossible.

    est-il possible d'affecter une lettre de lecteur dynamiquement ? par exemple de lister les lecteurs déjà présents et d'y affecter une lettre à la suite ?

    voici mon bout de script qui permet de créer le lecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (EstDansGroupe($Shop_group)) {
       Write-Host $CurrentUser " appartient au groupe " $Shop_Group
       $obj.MapNetworkDrive("W:", "\\"+$Serveur+"\"+$Shop_Share)
    }
    j'ai déjà fait pas mal de recherche sur le net et je n'arrive pas à trouver.

    merci d'avance

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    il faut déjà regarder la liste des membres de l'objet que tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $m=New-Object -ComObject WScript.Network
    $m|Get-Member
    On peut supposer que la méthode suivante réponde à ton besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $M.EnumNetworkDrives()

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    bonjour et merci pour ta réponse.

    en ce qui concerne la méthode $M.EnumNetworkDrives() que tu proposes voilà ce que j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $CurrentUser =QuiEstConnecte
    $mappedDrives = @{}
    $obj = New-Object -com Wscript.Network
    $Letter = $obj.EnumNetworkDrives()
    $Count = $Letter.count()
    
    for ($i=0; $i -lt $Count; $i = $i+2)
    {
    	$Drive = $Letter.item($i)
    	$Path = $Letter.item($i+1)
    #	$mappedDrives[$Drive] = $Path
    }
    if (EstDansGroupe($BCOM_group)) {
       Write-Host $CurrentUser " appartient au groupe " $Shop_Group
       $obj.MapNetworkDrive($Path,"\\"+$Serveur+"\"+$SHOP_Share)
    }
    bien evidemment cela ne fonctionne pas, mon $Path n'est pas accepté ...
    je suis complètement débutante en powershell, j'ai essayé de faire cette adaptation par rapport aux infos trouvées sur le net mais là ... j'ai vraiment du mal

    pourrais-tu m'éclairer un peu sur mes erreurs ?

    merci d'avance

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Tu peux essayer quelque chose comme ça !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    $serveur = ""
    $letters = @('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z')
    $obj = New-Object -com Wscript.Network
    $obj.EnumNetworkDrives() | % { if ($_ -match ":") { 
            if ( $_ -match 'Z') { Write-Host "Plus de lettres dispo" }
            else { $lastletter = $_ }
        } 
    } 
    
    $i = 0
    $letters | % {
        $i++  
        if ($_ -eq $lastletter ) { 
            $i++
            $LettreLecteur = $letters[$i]
        }
     }
    
    if (EstDansGroupe($BCOM_group)) {
       Write-Host $CurrentUser " appartient au groupe " $Shop_Group
       $obj.MapNetworkDrive($LettreLecteur,"\\"+$Serveur+"\"+$SHOP_Share)
    }
    J'ai pas testé la partie qui crée le lecteur réseau étant donné que je peux pas le faire au boulot

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par FloFlo12 Voir le message
    pourrais-tu m'éclairer un peu sur mes erreurs ?
    Quels messages d'erreur as-tu ?
    Citation Envoyé par SiSMik Voir le message
    Tu peux essayer quelque chose comme ça !
    Une simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Char[]]$Letters = [char]'A'..[Char]'Z'

  6. #6
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,


    Citation Envoyé par Laurent Dardenne Voir le message
    Une simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Char[]]$Letters = [char]'A'..[Char]'Z'
    joli

    une autre variante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Letters=65..90 -as [char[]]

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Une simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Char[]]$Letters = [char]'A'..[Char]'Z'
    Ouais j'avais bien pensé à un truc du style, mais je voyais pas comment définir le type "lettre" puis c'était juste avant de partir du boulot donc... bon hein

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    une autre variante:
    Celle-ci semble plus rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    trace-command -name TypeConversion  {$Letters=65..90 -as [char[]]} -pshost #-option executionflow
    trace-command -name TypeConversion  {[Char[]]$Letters = [char]'A'..[Char]'Z'} -pshost #-option executionflow
    Citation Envoyé par SiSMik Voir le message
    Ouais j'avais bien pensé à un truc du style, mais je voyais pas comment définir le type "lettre" puis c'était juste avant de partir du boulot donc... bon hein
    Pas de soucis, ce n'est pas le plus important
    Allez, un mixte des deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    trace-command -name TypeConversion  {[char[]]$L='ABCDEFGHIJKLMNOPQRSTUVWXYZ'} -pshost #-option executionflow

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pour info la méthode EnumNetworkDrives() de l'objet COM Wscript.Network peut ne pas lister tous les drives :
    C:\net use
    Les nouvelles connexions seront mémorisées.

    État Local Distant Réseau
    -------------------------------------------------------------------------------
    OK F: \\@IP\X$ Réseau Microsoft Windows
    Déconnectée N: \\@IP\Y$ Réseau Microsoft Windows
    Déconnectée O: \\@IP\Z$ Réseau Microsoft Windows
    Non disponib P: \\@IP\W$ Réseau Microsoft Windows

    La commande s'est terminée correctement.
    Ici le lecteur P n'est pas listé.

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    bonjour à tous et merci de vos réponses je vois que ça vous a inspiré

    alors en faite voilà ce que j'ai fait (enfin je n'ai aucun mérite, j'ai assemblé des bouts de codes trouvé sur le net) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # Récupération de la première lettre de lecteur disponible
    function Drive {
    $letters = 67..90 | ForEach-Object { ([char]$_)+":" }
    @($letters | Where-Object { (New-Object System.IO.DriveInfo($_)).DriveType -eq 'NoRootDirectory' }
    )[0]
    }
    ### Début du programme
    $CurrentUser =QuiEstConnecte
    $obj = New-Object -com Wscript.Network
    $Lecteur = Drive
    
    
    if (EstDansGroupe($BCOM_group)) {
    #   Write-Host $CurrentUser " appartient au groupe " $Shop_Group
       $obj.MapNetworkDrive($Lecteur,"\\"+$Serveur+"\"+$Shop_Share)
    }
    cela me permet d'affecter à mon mappage la 1ère lettre dispo. Par contre je ne voulais pas que ça me prenne A: ou B: donc j'ai commencé la recherche à 67.

    j'ai tout testé et ça marche nickel. En espérant que ça puisse en aider d'autre

    merci à vous en tout cas pour votre aide !

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Bon enfin de compte, ça ne résout pas mon problème premier ...

    lorsque j'ajoute un utilisateur dans un second groupe il ne me crée pas se groupe car le lettre de lecteur est déjà utilisé. Normal il reprend le même résultat retourné par ma fonction Drive.

    croyez-vous que je devrais mettre cette fonction en début du "if" pour l'ajout du lecteur ? (entre $Lecteur= Drive et if (EstDansGroupe($BCOM_group)) )

    je ne trouve pas ça propre mais je ne vois pas comment le faire ...

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Bon j'ai trouvé ma solution, je vous redonne le tout complété une fois bien testé parcequ ej'ai un autre problème ...

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    ça y est ça marche, voilà le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # Récupération de la première lettre de lecteur disponible
    function Drive {
    $letters = 67..90 | ForEach-Object { ([char]$_)+":" }
    @($letters | Where-Object { (New-Object System.IO.DriveInfo($_)).DriveType -eq 'NoRootDirectory' }
    )[0]
    }
    ### Début du programme
    $CurrentUser =QuiEstConnecte
    $obj = New-Object -com Wscript.Network
    $Lecteur = Drive 
    
    
    if (EstDansGroupe($SHOP_group)) {
       Write-Host $CurrentUser " appartient au groupe " $SHOP_Group
       $obj.MapNetworkDrive($Lecteur,"\\"+$Serveur+"\"+$SHOP_Share)
       $Lecteur=Drive
    }
    if (EstDansGroupe($Second_group)) {
       Write-Host $CurrentUser " appartient au groupe " $Second_Group
       $obj.MapNetworkDrive($Lecteur,"\\"+$Serveur+"\"+$Second_Share) 
       $Lecteur=Drive
    }
    une fois intégré à ma GPO au logon, il me crée bien les lecteurs rzo correspondant à mon groupe. Et comme je n'ai pas ajouté le persistent, il revérifi à chaque logon.


    merci de votre aide

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Le plus courts possible?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function search-lastdrive{    
        $UsedLetters = $(Get-PSDrive).name 
        for($j=90;$j -gt 67;$j--)
        {
            $letter=[char]$j
            if($UsedLetters -notcontains $letter)
            {
                return  $letter
            }
        }
    }	
    search-lastdrive

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment accéder à un lecteur réseau qui n'a pas de lettre ?
    Par Patrick075 dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 11/03/2014, 12h16
  2. lettre du lecteur réseau
    Par amnorian dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/05/2011, 10h06
  3. Connaître la lettre dédiée à un lecteur réseau.
    Par pcvesoul dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 14/02/2006, 13h53
  4. [exporter] Exporter la base vers lecteur réseau..
    Par terziann dans le forum Administration
    Réponses: 3
    Dernier message: 15/11/2005, 12h02
  5. [Lecteur] Lettre du lecteur de CD
    Par petit scarabée dans le forum Installation, Déploiement et Sécurité
    Réponses: 6
    Dernier message: 05/09/2002, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo