Page 1 sur 1

[R] Renommer en masse dossiers et partages

Posté : jeu. 01 août 2013 09:37
par denbaat
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.

Re: [..] Renommé en masse nom dossier et partage

Posté : jeu. 01 août 2013 10:08
par jguinch
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.

Re: [..] Renommé en masse nom dossier et partage

Posté : jeu. 01 août 2013 11:55
par denbaat
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.

Re: [..] Renommé en masse nom dossier et partage

Posté : jeu. 01 août 2013 14:38
par denbaat
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

Posté : jeu. 01 août 2013 15:32
par jguinch
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
► Afficher le texte

Re: [..] Renommé en masse nom dossier et partage

Posté : jeu. 01 août 2013 16:19
par denbaat
C'est parfait :D

Ç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 ;( :roll:

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

Posté : jeu. 01 août 2013 22:48
par jguinch
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 :
► Afficher le texte_Net_Share_ShareGetPermissions

Re: [..] Renommé en masse nom dossier et partage

Posté : ven. 02 août 2013 07:51
par Tlem
Eventuellement, WMI peut être utilisé !
http://www.developpez.net/forums/d22382 ... -partages/

Re: [..] Renommé en masse nom dossier et partage

Posté : ven. 02 août 2013 08:45
par jguinch
@Tlem : pourtant j'ai passé pas mal de temps à chercher, pas assez apparemment :oops: En tout cas merci, ça m'énervait de pas trouver.
Du coup, c'est beaucoup plus propre avec WMI :
► Afficher le texte_Net_Share_ShareGetPermissions

Re: [..] Renommé en masse nom dossier et partage

Posté : ven. 02 août 2013 08:58
par denbaat
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.

Re: [..] Renommé en masse nom dossier et partage

Posté : ven. 02 août 2013 11:34
par denbaat
C'est bon ça fonctionne avec 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
 
Je précise une chose (REDÉMARRAGE DU SERVEUR OBLIGATOIRE) pour prendre en compte la base de registre