Forum Clubic

Script VBS ou commande pour gestion des droits NTFS

Bonjour,

Je suis actuellement à la recherche d’un script ou une commande qui me permet d’ajouter un utilisateur en controle total sur un dossier.
La difficulté est que le nom de l’utilisateur est le nom du dossier.

Explication :

J’ai un dossier dans lequel mes users ont leurs dossiers qui leurs sont propres.
Le dossier de chaque utilisateur est nommé par le nom du user.
Je doit pour chaque dossier d’utilisateur Ajouter les droits NTFS de ce users sur sont dossier.

J’ai vu les commandes Subinacl et CACLS.exe, le problème c’est comment faire pour lire le nom du dossier ?
Si je devais faire un Algo ce serai :

LIRE nom du dossier (Exemple le dossier s’appelle toto)
Pour Dossier toto ajouter droit NTFS pour user toto avec controle total sans toucher au autres droits
Les droits appliqués doivent bien entendu prendre compte des dossiers et fichiers descendant.

J’espère avoir été assez clair dans mes explications. Merci d’avance a ceux et celle qui pouront me filer un coup de main.

Salut,

Bon, je suis pas sur à 100% d’avoir compris où tu bloquais, et j’ai pas testé mon script, mais un truc comme ça, ça devrait s’approcher du résultat escompté :


strComputer = "."
Racine = "C:\scripts"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
set wShell = server.createObject("wscript.shell")

Set colSubfolders = objWMIService.ExecQuery _
    ("Associators of {Win32_Directory.Name='"& racine &"'} " _
        & "Where AssocClass = Win32_Subdirectory " _
            & "ResultRole = PartComponent")

' on parcourt les sous-répertoire du répertoire racine
For Each objFolder in colSubfolders
    'on extrait le nom du répertoire
    nomrep = Replace(objFolder.Name, racine & "\", "")

    'on construit la ligne de commande
    lignedecommande = "C:\Cacls.exe "& objFolder.Name &"/T /G " & nomrep & ":F"
    
    'et on l'exécute
    wShell.run lignedecommande 
Next

Pour la ligne de commande de cacls, je sais que c’est assez tordu et que la doc n’est pas clair, regarde sur le web tu devrais trouver ce qu’il faut (je suis pas sur que ce que j’ai marqué est bon pour la ligne de commande).

:diable: (c’est mon 666 post …) :diable:
Edité le 08/07/2008 à 16:39

Tout d abord merci pour votre aide !!!
Je suis entrain d’essayer de faire fonctionner le script, je vous tient informé.

Encore merci.

Bonjour,

J’ai une erreur au code que l’on ma proposé et que j’ai que légèrement modifié, et j’ai beau chercher je ne vois pas d’où ça pourrai venir.


strComputer = "."
Racine = "C:\general"
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set wShell = server.createObject("wscript.shell")

Set colSubfolders = objWMIService.ExecQuery _
 ("Associators of {Win32_Directory.Name='"& racine &"'} " _
 & "Where AssocClass = Win32_Subdirectory " _
 & "ResultRole = PartComponent")

' on parcourt les sous-répertoire du répertoire racine
For Each objFolder in colSubfolders
 'on extrait le nom du répertoire
 nomrep = Replace(objFolder.Name, racine & "\", "")

 'on construit la ligne de commande
 lignedecommande = "C:\Cacls.exe "& objFolder.Name &"/T /G " & nomrep & ":F"
 
 'et on l'exécute
 wShell.run lignedecommande 
Next

Mon dossier dans lequel se trouve les dossiers auquel on doit ajouter les droits est c:\general

Pour la ligne de commande j’ai trouvé comment utiliser Cacls. Par exemple, pour donner le droit d’accès en “Controle Total” à l’utilisateur “Administrateur” sur le répertoire “D:\test”, on utiliserait la commande suivante :

cacls d:\test /G administrateur:F (ensuite restera juste a valider un par un sinon ya la commande
cacls d:\test /G administrateur:F<c:\o.txt (le fichier texte contient un “o” et valide automatiquement)

L’erreur est la suivante :

Script : (chemin du script)
ligne : 5
Caract : 1
erreur : Objet requis :‘server’
code : 800A01A8
source erreur d’exection microsoft VBScript

Avez vous une idée ?
Edité le 09/07/2008 à 10:22

Oui désolé, problème de copier/coller, il faut remplacer la ligne 5 par ça :
Set wShell = createObject(“wscript.shell”)
=> vires “server.” devant createobject

Sinon pour la syntaxe “<o.txt” oui ça marche.

Merci mille fois

En effectuant un WScript.Echo nomrep, j’ai remarqué que La variable nomrep est la concaténation de Racine + le nom du repertoire.
Il n’y a pas moyen que nomrep soit égal uniquement au nom du répertoire sans le chemin ?

Merci d’avance.

Heu ben, en fait c’est à ça que sert :

nomrep = Replace(objFolder.Name, racine & "\", "")

Dans objfolder.name, je remplace l’expression “racine” + “” par du vide “” (donc en gros je supprime l’expression racine+"" de la chaine de départ). Effectivement, la fonction ne fait pas bien son boulot, car il y a un petit truc auquel je n’avais pas pensé sur le coup, cette ligne n’est donc pas tout à fait correct…Ou du moins, pas dans tous les cas…

Je te laisse chercher pourquoi car ce n’est vraiment pas compliqué, l’aide n’est pas particulièrement explicite sur cette fonction, mais quelques tests te permettront de découvrir pourquoi ça ne marche pas toujours. (Ce qui ne veut pas dire que la fonction ‘bug’ mais que telle que je l’ai employée, elle ne rempli pas complètement son rôle).
Edité le 10/07/2008 à 09:38

Bonjour et encore mille merci pour le coup de main !!

Tout d abord je tient a signaler que je ne met jamais les mains dans les scripts vbs (c’est une première) :slight_smile:
J’ai du passer par Moscou pour me rendre a Marseille, mais j’ai enfin résolus mon problème.

Je serai curieux par contre de connaitre la solution propre au problème.

Voila le résultat de mon dur labeur (lol) et ce que j’ai changé :


strComputer = "."

'Je ne sais pas si c'est obligatoire de déclarer les variables, mais bon...
dim Racine
dim nomrep
dim cptstring

'J'affecte mon dossier général
Racine = "C:\general"

Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set wShell = CreateObject("wscript.shell")

Set colSubfolders = objWMIService.ExecQuery _
 ("Associators of {Win32_Directory.Name='"& racine &"'} " _
 & "Where AssocClass = Win32_Subdirectory " _
 & "ResultRole = PartComponent")
 
'je compte les caractères de Racine et je rajoute 2 pour que ça marche mais je ne sais toujours pas pourquoi.
cptstring = Len(Racine) + 2


'début de la boucle pour chaque dossier
For Each objFolder in colSubfolders

'Je prend le reste de la chaine a partir de cptstring et j'affecte le résultat dans la variable nomrep
nomrep = mid(objFolder.Name,cptstring)

'contruction de la ligne de commande
lignedecommande = "C:\Cacls.exe "& objFolder.Name &" /T /G " & nomrep & ":F"

'execution de la ligne de commande
wShell.run lignedecommande 

Next

Edité le 10/07/2008 à 15:09

Bon, c’est pas mal pour quelqu’un qui n’avait pas touché au vbs !

Tu es obligé d’ajouter 2 parce que tu as besoin d’obtenir “c:\general” or dans racine on avait stocké “c:\general”
Donc il faut ajouter “” (soit 1 caractère), mais dans la mémoire le caractère spécial “” est doublé, il faut donc obtenir “C:\general\” or dans la mémoire on a : “c:\general” (+ “\” = + 2 caractères).

Par contre je ne suis pas sur à 100% que ton script fonctionnera à chaque fois. Mais bon, pas le temps de tester dans le détail.

Personnellement, je ferais ceci :
la ligne

nomrep = Replace(objFolder.Name, racine & "\", "")

ne fonctionnait pas car “Replace” différencie la casse (c: est différent de C:) donc il ne trouvait pas “C:\general” parce qu’il fallait chercher “c:\general”.

Une solution très rapide aurait été de virer la majuscule au moment de l’initialisation de la variable racine = “c:\general”…
Mais… bon comment être sur que ça marchera tout le temps ?

Donc une meilleure solution consiste à aller chercher les informations où elles seront forcément bonnes, on va donc écrire :


Nomrep = Replace(objFolder.Name, objFolder.drive & objFolder.path, "")

Comme objfolder.drive = “c:” et objfolder.path = “\general” on reconstitue le “c:\general” que l’on souhaitait obtenir.

Pour tes autres questions :

Oui il est préférable de déclarer les variables.
Et tu peux ajouter aussi:
option explicit tout en haut de ton script, (ça oblige à déclarer les variables => ça donne une erreur si tu essaies d’utiliser une variable sans l’avoir déclarée)
C’est préférable pour détecter les erreurs dans les noms de variable (style tu utilises la variable “tmp” alors qu’à un autre endroit tu utilises “temp” : pas facile de s’en rendre compte quand le script est long… là au moins ça plantera.)

Il faut aussi normalement fermer les objets (ceux déclarés par “Set”) que tu as utilisé : exemple dans ton cas :
à la fin du script tu marques :
Set wshell = nothing
pareil pour les autres.
Edité le 10/07/2008 à 16:24