[R] Renommer en masse dossiers et partages
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
[R] Renommer en masse dossiers et partages
Bonjour,
Alors voila, j'aimerais avoir un script pouvant renommer en masse des dossiers partagés, renommer le dossier et renommer le partage.
Actuellement j'ai 500 dossiers au nom des utilisateur, mais mal nommé il y a 6 ans, ce qui me bloque pour mes futurs scripts.
Les dossiers aujourd’hui ce nomme : PRENOM_NOM et le partage PRENOM_NOM$
Et j'aimerais renommer tous en : PRENOM.NOM et le partage PRENOM.NOM$
J'aimerais le faire seule, mais je ne sais pas par où commencer. Le point bloquant pour moi sera de détecter le "_" et de le transformer en "."
Merci d'avance.
Alors voila, j'aimerais avoir un script pouvant renommer en masse des dossiers partagés, renommer le dossier et renommer le partage.
Actuellement j'ai 500 dossiers au nom des utilisateur, mais mal nommé il y a 6 ans, ce qui me bloque pour mes futurs scripts.
Les dossiers aujourd’hui ce nomme : PRENOM_NOM et le partage PRENOM_NOM$
Et j'aimerais renommer tous en : PRENOM.NOM et le partage PRENOM.NOM$
J'aimerais le faire seule, mais je ne sais pas par où commencer. Le point bloquant pour moi sera de détecter le "_" et de le transformer en "."
Merci d'avance.
Modifié en dernier par denbaat le ven. 02 août 2013 11:48, modifié 1 fois.
Re: [..] Renommé en masse nom dossier et partage
Salut
Tout d'abord, il faudra lister les répertoires. Pour ça, tu peux utiliser FileFindFirstFile/FileFindNextFile ou _FileListToArray.
Pour renommer les dossiers, DirMove.
Pour remplacer le "_" par ".", StringReplace ou StringRegExpReplace (un peu plus compliqué)
Pour renommer les partages, tu peux regarder les fonctions _NetSshare_xxx, mais je ne sais pas si tu pourras renommer les partages. Le plus simple sera de supprimer les partages _Net_Share_ShareDel et les recréer _Net_Share_ShareAdd.
Comme tu souhaites le faire seul, je n'ai pas mis de code. Si tu as besoin d'un peu de code on pourra t'en donner, pas de soucis.
Tout d'abord, il faudra lister les répertoires. Pour ça, tu peux utiliser FileFindFirstFile/FileFindNextFile ou _FileListToArray.
Pour renommer les dossiers, DirMove.
Pour remplacer le "_" par ".", StringReplace ou StringRegExpReplace (un peu plus compliqué)
Pour renommer les partages, tu peux regarder les fonctions _NetSshare_xxx, mais je ne sais pas si tu pourras renommer les partages. Le plus simple sera de supprimer les partages _Net_Share_ShareDel et les recréer _Net_Share_ShareAdd.
Comme tu souhaites le faire seul, je n'ai pas mis de code. Si tu as besoin d'un peu de code on pourra t'en donner, pas de soucis.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Re: [..] Renommé en masse nom dossier et partage
Merci, je travail dessus, et je te tien au courant de l'avancement si j'ai besoin d'aide.
Je suis obliger de recréer les partages, car le rename des dossiers détruit le partage.
Je suis obliger de recréer les partages, car le rename des dossiers détruit le partage.
Re: [..] Renommé en masse nom dossier et partage
J'ai bloque sur un truc, j'ai bien recréé mon partage, mais je n'arrive pas à remettre des autorisations de partage. A la création j'ai même pas le "tout le monde" par Default, c'est vide.
Re: [..] Renommé en masse nom dossier et partage
Ah oui, j'y pensais plus...
Du coup, le plus simple sera de créer les partages en faisant appel à la ligne de commande.
Regarde "net share /?" sous DOS.
Exemple de commande DOS : net share NOM.PRENOM$=d:\NOM.PRENOM$ /grant:"NOM.PRENOM",FULL
Du coup, le plus simple sera de créer les partages en faisant appel à la ligne de commande.
Regarde "net share /?" sous DOS.
Exemple de commande DOS : net share NOM.PRENOM$=d:\NOM.PRENOM$ /grant:"NOM.PRENOM",FULL
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Re: [..] Renommé en masse nom dossier et partage
C'est parfait 
Ça fonctionne
Par contre, je voudrais pas trop abusé. Mais j'aurais un dernier besoin. j'expliquer un peu la situation avant.
Nous donnons la possibilité aux utilisateurs (sur leur session) d'avoir un dossier personnel de travail, et nous donnons cette possibilité la aussi au compte windows des machines de production.
exemple :
JEAN.DUPOND monte le partage \\serveur1\jean.dupond$ ce partage possède comme autorisation le user AD jean.dupond en contrôle total
Mais pour une machine de production cela peux être différent. et malheureusement les dossier USER et USER PROD sont au même endroit.
MACHINE1 monte le partage \\serveur1\machine1$ ce partage possède comme autorisation le user AD machine1 en contrôle total ET un groupe GROUPE_USER_PROD
Donc avec le script ci-dessous, je triche un peu en récupérant le non du dossier qui à le même nom sur le user dans l'AD. sauf que pour mon partage MACHINE1$ je suis niqué et je me retrouve avec comme autorisation le user machine1 seulement.
Donc je vais devoir arriver à listé les nom des USER ou GROUPE (et non partage) dans les autorisations pour pouvoir les mettre ensuite dans le new partage ;(
Voici mon code actuel
Ça fonctionne
Par contre, je voudrais pas trop abusé. Mais j'aurais un dernier besoin. j'expliquer un peu la situation avant.
Nous donnons la possibilité aux utilisateurs (sur leur session) d'avoir un dossier personnel de travail, et nous donnons cette possibilité la aussi au compte windows des machines de production.
exemple :
JEAN.DUPOND monte le partage \\serveur1\jean.dupond$ ce partage possède comme autorisation le user AD jean.dupond en contrôle total
Mais pour une machine de production cela peux être différent. et malheureusement les dossier USER et USER PROD sont au même endroit.
MACHINE1 monte le partage \\serveur1\machine1$ ce partage possède comme autorisation le user AD machine1 en contrôle total ET un groupe GROUPE_USER_PROD
Donc avec le script ci-dessous, je triche un peu en récupérant le non du dossier qui à le même nom sur le user dans l'AD. sauf que pour mon partage MACHINE1$ je suis niqué et je me retrouve avec comme autorisation le user machine1 seulement.
Donc je vais devoir arriver à listé les nom des USER ou GROUPE (et non partage) dans les autorisations pour pouvoir les mettre ensuite dans le new partage ;(
Voici mon code actuel
Code : Tout sélectionner
#include <File.au3>
#include <Array.au3>
#include <NetShare.au3>
Local $vflist
Local $replace
Local $folderlist
$path="E:\USER\"
; ###Actualisation de la variable Lister tous les dossiers###
$folderlist = _FileListToArray($path)
For $i=1 to $folderlist[0]
; ###Remplace le caractere "_" par "."###
$replace = StringReplace($folderlist[$i], "_", ".")
; ###Renomme le dossier###
DirMove($path & $folderlist[$i], $path & $replace)
Next
; ###Ré-actualisation de la variable Lister tous les dossiers###
$folderlist = _FileListToArray($path)
For $i=1 to $folderlist[0]
; ###Partage le dossier###
RunWait(@ComSpec & ' /c net share ' & $folderlist[$i] & "$" & '=' & $path & $folderlist[$i] & ' /grant:"' & $folderlist[$i] & '",FULL', @SystemDir)
Next
Re: [..] Renommé en masse nom dossier et partage
Pour lister les autorisations de partage, c'est moins évident...
J'ai cherché un peu mais rien trouvé qui permettrait de faire ça avec AutoIt sans passer par une commande externe.
En tête, j'ai deux idées de commandes qui nous donnerons les infos, mais il faudra rediriger la sortie de commande vers un fichier et le parser :
- net share <partage> - inconvénient : dépend de la langue du système
- subinacl (à télécharger) : subinacl /share <partage> - inconvénient : un peu plus pénible à décortiquer
Dans ces deux cas, il faudra lire le résultat et faire des découpages pour récupérer les infos qui nous intéressent.
J'ai bricolé un petit truc si ça te tente, testé uniquement sous Windows 7x64 FR :
J'ai cherché un peu mais rien trouvé qui permettrait de faire ça avec AutoIt sans passer par une commande externe.
En tête, j'ai deux idées de commandes qui nous donnerons les infos, mais il faudra rediriger la sortie de commande vers un fichier et le parser :
- net share <partage> - inconvénient : dépend de la langue du système
- subinacl (à télécharger) : subinacl /share <partage> - inconvénient : un peu plus pénible à décortiquer
Dans ces deux cas, il faudra lire le résultat et faire des découpages pour récupérer les infos qui nous intéressent.
J'ai bricolé un petit truc si ça te tente, testé uniquement sous Windows 7x64 FR :
► Afficher le texte_Net_Share_ShareGetPermissions
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
- Tlem
- Site Admin

- Messages : 11824
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Renommé en masse nom dossier et partage
Eventuellement, WMI peut être utilisé !
http://www.developpez.net/forums/d22382 ... -partages/
http://www.developpez.net/forums/d22382 ... -partages/
Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Re: [..] Renommé en masse nom dossier et partage
@Tlem : pourtant j'ai passé pas mal de temps à chercher, pas assez apparemment
En tout cas merci, ça m'énervait de pas trouver.
Du coup, c'est beaucoup plus propre avec WMI :
Du coup, c'est beaucoup plus propre avec WMI :
► Afficher le texte_Net_Share_ShareGetPermissions
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Re: [..] Renommé en masse nom dossier et partage
Merci pour vos réponses.
J'ai peut être une idée plus simple pour moi
, je vais travaillé dessus et je vous tien au courant.
du coté de la base de registre.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\security\
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\
l'idée et de récupérer la valeur de la REG_BINARY dans security au nom de l'ancien nom de partage, et de recréer la clé sous le nouveau nom avec la valeur récupérer.
J'ai peut être une idée plus simple pour moi
du coté de la base de registre.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\security\
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\
l'idée et de récupérer la valeur de la REG_BINARY dans security au nom de l'ancien nom de partage, et de recréer la clé sous le nouveau nom avec la valeur récupérer.
Re: [..] Renommé en masse nom dossier et partage
C'est bon ça fonctionne avec la base de registre 
Au final le script a totalement changé
Je précise une chose (REDÉMARRAGE DU SERVEUR OBLIGATOIRE) pour prendre en compte la base de registre
Au final le script a totalement changé
Code : Tout sélectionner
#include <File.au3>
#include <Array.au3>
Local $replace, $folderlist, $regfoldershare, $replace, $replace_regfoldershare
$path="E:\USER\"
$folderlist = _FileListToArray($path)
For $i=1 to $folderlist[0]
$regfoldersharesecurity = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\security\",$folderlist[$i] & "$")
$regfoldershare = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\",$folderlist[$i] & "$")
$replace_regfoldershare = StringReplace($regfoldershare,"_",".")
$replace = StringReplace($folderlist[$i], "_", ".")
DirMove($path & $folderlist[$i], $path & $replace)
RegDelete("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\security",$folderlist[$i] & "$")
RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\security",$replace & "$","REG_BINARY",$regfoldersharesecurity )
RegDelete("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares",$folderlist[$i] & "$")
RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares",$replace & "$","REG_MULTI_SZ",$replace_regfoldershare )
Next


