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
Code : Tout sélectionner
$username = "NOM.PRENOM"
$sharename = $username & "$"
$folderpath = "d:\"
RunWait(@ComSpec & ' /c net share ' & $sharename & '=' & $folderpath & $sharename & ' /grant:"' & $username & '",FULL', @SystemDir)
Re: [..] Renommé en masse nom dossier et partage
Posté : jeu. 01 août 2013 16:19
par denbaat
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
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
Code : Tout sélectionner
#Include <Array.au3> ; uniquement pour _ArrayDisplay
$sharename = "photos"
$shareinfos = _Net_Share_ShareGetPermissions("photos")
_ArrayDisplay($shareinfos)
Func _Net_Share_ShareGetPermissions($sShareName)
Local $sTmpFile = @TempDir & "\perms_" & @HOUR & @MIN & @SEC & ".txt"
Local $aResult[1][2], $aTmp, $aSplit
Local $iFirst = -1
Local $iLast = -1
Local $iIndex = 0
Local $line
RunWait(@ComSpec & ' /c net share "' & $sShareName & '" > "' & $sTmpFile & '"', @SystemDir, @SW_HIDE)
Local $content = FileRead($sTmpFile)
If @error Then Return 0
FileDelete($sTmpFile)
$content = _OEM2ANSI($content)
$content = StringRegExpReplace($content, " {2,}", "|")
$content = StringReplace($content, @CR, "")
$content = StringReplace($content, @LF & "|", @LF)
$aTmp = StringSplit($content, @LF)
For $i = $aTmp[0] To 1 Step -1
If $aTmp[$i] <> "" AND $iLast = 0 Then $iLast = $i
If $aTmp[$i] <> "" AND $iLast = -1 Then $iLast = 0
If StringInStr($aTmp[$i], "|") And $iLast <> -1 Then
$iFirst = $i
ExitLoop
EndIf
Next
If $iFirst = -1 OR $iLast = -1 Then Return 0
For $i = $iFirst To $iLast
$line = StringRegExpReplace($aTmp[$i], ".*\|", "")
$aSplit = StringSplit($line, ",")
If $aSplit[0] = 2 Then
$iIndex += 1
Redim $aResult[$iIndex][2]
$aResult[$iIndex - 1][0] = $aSplit[1]
$aResult[$iIndex - 1][1] = StringReplace($aSplit[2], " ", "")
EndIf
Next
If $iIndex = 0 Then Return 0
Return $aResult
EndFunc
Func _OEM2ANSI($what)
$ret = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $what, 'str', '')
Return $ret[2]
EndFunc ;==>_OEM2ANS
Re: [..] Renommé en masse nom dossier et partage
Posté : ven. 02 août 2013 07:51
par Tlem
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

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
Code : Tout sélectionner
#include <Array.au3>
$infos = _Net_Share_ShareGetPermissions("install")
_ArrayDisplay($infos)
Func _Net_Share_ShareGetPermissions($sShareName)
Local $strComputer = "."
Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
Local $colItems = $objWMIService.ExecQuery("Select * from Win32_Share Where name='" & $sShareName & "'")
Local $wmiSecurityDescriptor
Local $aResult[1][2] = [[0]]
Local $iIndex = 0
If NOT IsObj($colItems) Then Return 0
For $objItem in $colItems
If $objitem.Type = 0 then
Local $wmiFileSecSetting = ObjGet("winmgmts:Win32_LogicalShareSecuritySetting.Name='" & $objItem.Name & "'")
Local $RetVal = $wmiFileSecSetting.GetSecurityDescriptor($wmiSecurityDescriptor)
If @error <> 0 Then Return 0
Local $DACL = $wmiSecurityDescriptor.DACL
For $wmiAce in $DACL
$iIndex += 1
Redim $aResult[$iIndex][2]
$Trustee = $wmiAce.Trustee
$Domain = $Trustee.Domain
If $Domain = "" Then $Domain = @ComputerName
$aResult[$iIndex - 1][0] = $Domain & "\" & $Trustee.Name
$aResult[$iIndex - 1][1] = "SPECIAL"
Switch Number($wmiAce.AccessMask)
Case 2032127
$aResult[$iIndex - 1][1] = "FULL"
Case 1245631
$aResult[$iIndex - 1][1] = "CHANGE"
Case 1179817
$aResult[$iIndex - 1][1] = "READ"
EndSwitch
Next
EndIf
Next
Return $aResult
EndFunc
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