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

VBScript Discussion :

Manipuler les droits d'accès à un fichier


Sujet :

VBScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut Manipuler les droits d'accès à un fichier
    Bonjour,
    J'aimerai pouvoir ajouter un utilisateur dans les droits d'accès d'un fichier (l'opération clic droit sur un fichier->Propriétés->Onglet "Sécurité"->"Ajouter...") par le biais d'un script.
    J'ai trouvé plusieurs choses intéressantes, mais uniquement en VB.NET ou en C#, alors qu'il faudrait que je passe par de l'ASP (language de Script VBS)...
    Est-ce possible de faire cela en VBScript ??

    Merci d'avance,

    Joseph

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    oui

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    , ced600...

    Les classes WMI qu'il faut manipuler pour faire ce que je voulais sont :
    - Win32_LogicalFileSecuritySetting
    - Win32_SecurityDescriptor
    - Win32_Ace
    - Win32_Trustee
    Un coup de msdn et le tour est joué...

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Tout à fait, tu as fait ce qu'il fallait faire, c'est pour cela que la réponse à la question ne nécessité qu'un "oui"

    Par contre si tu as des problèmes dans l'utilisation des classes WMI, n'hésites pas à poster le problème, je serais un peu plus locace

    Je te conseille de faire un tour dans la partie contribution, j'y parle de WMICreator, il te sera très utile dans l'accomplissement de ta tache.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Oui, j'ai fini par trouver effectivement, mais il n'y aurait pas eu de mal à ce qu'on m'oriente simplement vers ces classes, ou tout simplement me dire que c'était possible de réaliser ce que je voulais faire avec WMI, sans pour autant me pondre le code tout prêt...
    Question de gain de temps, vous connaissez un élèment de solution a mon problème, je ne demande à personne de "chercher" à ma place.
    Quand je post pour un problème que je n'arrive pas a résoudre, je n'attend pas non plus bêtement qu'on me réponde pour avancer dans mon travail, je cherche en même temps à côté.
    Mais bon, de base vous saviez que WMI était ma solution, moi non, une petite phrase aurait pu me faire gagner pas mal de temps...

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Oui, j'ai fini par trouver effectivement, mais il n'y aurait pas eu de mal à ce qu'on m'oriente simplement vers ces classes, ou tout simplement me dire que c'était possible de réaliser ce que je voulais faire avec WMI, sans pour autant me pondre le code tout prêt...
    Question de gain de temps, vous connaissez un élèment de solution a mon problème, je ne demande à personne de "chercher" à ma place.
    Justement, je n'avais pas ces informations en tête. Pour répondre autre chose que oui, j'aurais du faire des recherches. Je l'aurais fait si j'avais du temps.
    Je savais juste que c'était possible, et pas forcément avec WMI, n'ont pas que je doute de la faisabilité avec WMI, mais ce n'était pas forcément la seule solution. Donc comme je n'avais rien de concret je n'ai fais que répondre à la question.
    Comme tu le dis, tu n'attends pas que l'on recherche à ta place, mais là justement je n'aurais pas eu plus d'info sans rechercher et j'avais pas le temps.
    Je ne suis pas une éponge, je comprends vite et sais où chercher, mais je ne rtiens pas tout ce que je vois, juste ce que j'ai déjà fait, et je n'ai pas encore énormément d'expérience en VBS, un peu plus d'un an de réelle expérience. Donc je ne savais, donc je n'ai rien mis d'autre.

    J'aurais peut être pris sur mon temps de travail (alors que je suis à la bourre) pour te guider si tu avais été incapable de trouver quoique ce soit.

    Tu as eu la bonne réaction. S'il n'y a eu que mon oui comme réponse, c'est que personne de connecté et ayant visité le fofo n'avait l'info (sans chercher) entre le moment où tu as posté, et le moment où tu as répondus.

    Maintenant, si tu as une question sur le WMI je suis capable de répondre à certaines d'entres elles sans rechercher, si j'ai le temps de me connecter au fofo, ce qui est rare en ce moment.

    Bonne journée.

  7. #7
    Membre éprouvé
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Par défaut
    moi je n'est rein compris pourai tu me donner un exemple ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Ok ced600, autant pour moi, j'ai mal interprété ton "Oui"...
    Qu'est ce que tu n'as pas compris koKoTis ?

  9. #9
    Membre éprouvé
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Par défaut
    ben en fait je sais pas comment faire moi pour utiliser ses classen je ne saurai écrir se script tous seul

    mais se script il me servirer

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Moi j'ai utilisé les classes citées dans 3 fonctions dépendantes chacunes l'une de l'autre :

    - AddUserAccessToFile, qui est la fonction principale :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    Function AddUserAccessToFile(ByVal accessMask, ByVal aceFlags, ByVal aceType, ByVal userName, ByVal conteiner, ByVal domainName, ByVal subDomainName, ByVal filePath)
     
      On Error Resume Next
      '
      ' ...Initialisation de valeur a retourner...
      '
      Dim objDacl      
      Dim objCurrentSD  
      Dim iArrAceMax  
      Dim objServer  
      Dim objSecParams   
      Dim objSec   
      Dim objSecDesc  
      Dim objAce   
      AddUserAccessToFile = false
     
      '
      ' ...Connexion au service local...
      '   
      Set objServer = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\\.\ROOT\CIMV2")
      '
      ' ...On récupère les paramètres de sécurité du fichier...
      '
      Set objSecParams = GetObject("winmgmts://.\root\cimv2:Win32_LogicalFileSecuritySetting.Path='" & filePath & "'")
      '
      ' ...On récupère l'objet décrivant la sécurité du service local...
      '
      Set objSec = objServer.Get("Win32_SecurityDescriptor")
      Set objSecDesc = objSec.SpawnInstance_()
      '
      ' ...On fixe la propriété ControlFlags de sorte à avoir un accès total...
      '
      objSecDesc.Properties_.Item("ControlFlags") = 4
      ' 
      ' ...On créé l'Access Control Entry...
      ' 
      Set objAce = CreateACE(accessMask, aceFlags, aceType, CreateTrustee(userName, conteiner, domainName, subDomainName))
      '
      ' ...On récupère le descripteur de sécurité courant du fichier à traiter...
      '
      objCurrentSD = objSecParams.GetSecurityDescriptor(wmiSecurityDescriptor)
      '
      ' ...On récupère l'Access Control List du fichier...
      '
      objDacl = wmiSecurityDescriptor.DACL
      '
      ' ...On récupère la taille de la liste et on l'augmente de 1...
      '
      iArrAceMax = UBound(objDacl) + 1 
      ReDim preserve objDacl(iArrAceMax) 
      '
      ' ...On ajoute l'Access Control Entry créé à la fin de la liste...
      '
      Set objDacl(iArrAceMax) = objAce
      '
      ' ...On ajoute l'Access Control List redéfinie dans le description de sécurité du service local...
      '
      objSecDesc.Properties_.Item("DACL") = objDacl
      '
      ' ...On récupère les paramètres de sécurité du fichier...
      '
      Set objSecParams = GetObject("winmgmts://.\root\cimv2:Win32_LogicalFileSecuritySetting.Path='" & filePath & "'")
      '
      ' ...On valide les modifications...
      '
      objSecParams.SetSecurityDescriptor(objSecDesc)
     
      If (Err.Number = 0) Then
     
        AddUserAccessToFile = true
     
      End If
      '
      ' ...On détruit les objets...
      '
      Set objDacl = Nothing
      Set objCurrentSD = Nothing
      Set objServer = Nothing
      Set objSecParams = Nothing
      Set objSec = Nothing
      Set objSecDesc = Nothing
      Set objAce = Nothing
     
    End Function
    - CreateTrustee, qui permet de récupérer l'objet Trustee d'un utilisateur :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Function CreateTrustee(ByVal userName, ByVal conteiner, ByVal domainName, ByVal subDomainName)
     
      On Error Resume Next
      '
      ' ...Initialisation de valeur a retourner...
      '
      Set CreateTrustee = Nothing
      Dim objTrustee
      Dim objUser
      Dim objSid
      Dim strDomain
      '
      ' ...Si l'utilisateur est tous le monde...
      '
      If UCase(userName) = "EVERYONE" Then
        objSid = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
      Else
        '
        ' ...On recupère l'objet SID de l'utilisateur...
        '
        Set objUser = GetObject("LDAP://CN=" & userName & ", CN=" & conteiner & ", DC=" & domainName & ", DC=" & subDomainName)   
        objSid = objUser.Get("ObjectSID")
      End If
      '
      ' ...On récupère l'objet trustee...
      '
      Set objTrustee = GetObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").SpawnInstance_
      strDomain = domainName & "." & subDomainName
      objTrustee.Domain = strDomain
      objTrustee.Name = userName
      objTrustee.Properties_.Item("SID") = objSid
      '
      ' ...On renvoie l'objet créé...
      '
      Set CreateTrustee = objTrustee
      '
      ' ...On détruit les objets...
      '
      Set objTrustee = Nothing
      Set objUser = Nothing
      Set objSid =Nothing
     
    End Function
    Et CreateACE, qui permet de construire un Access Control Entry, en gros la structure de données qui regroupe les informations liées aux droits d'accès d'un utilisateur :

    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    Function CreateACE(ByVal accessMask, ByVal aceFlags, ByVal aceType, ByRef trustee)
     
      On Error Resume Next
      '
      ' ...Initialisation de valeur a retourner...
      '
      Set CreateACE = Nothing
      Dim objACE
      '
      ' ...On recupère un objet ACE...
      '
      Set objACE = GetObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Ace").SpawnInstance_
      '
      ' ...Mise a jour des ses propriétés...
      '
      objACE.Properties_.Item("AccessMask") = accessMask
      objACE.Properties_.Item("AceFlags") = aceFlags
      objACE.Properties_.Item("AceType") = aceType
      objACE.Properties_.Item("Trustee") = trustee
      '
      ' ...On renvoie l'objet créé...
      '
      Set CreateACE = objACE
      '
      ' ...On détruit l'objet...
      '
      Set objACE = Nothing
     
    End Function
    Ca marche aussi bien pour les fichiers que pour les dossiers, normallement.

  11. #11
    Membre éprouvé
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Par défaut
    merci beaucoup

    tu mes ses trois script dans le même vbs ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Comme tu veux, ou tu peux les stocker dans un fichier INC genre "AllowAccess.inc". Comme ça il te suffira de faire un include dans tes vbs lorsque tu en aura besoin...

  13. #13
    Membre éprouvé
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Par défaut
    ah donc se que tu m'a donner ses sont les classe, aprés il faut les appeler a partir d'un script ?

    et je les mets dans le répertoire windows ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Non ce sont des fonctions ("Function"). Il n'y a que la première fonction que je t'ai passé qui doit explicitement être appelée, les deux autres sont ensuite appelées dans cette dernière.
    Moi j'ai mis ces fonctions dans un fichier include : tu créé un nouveau fichier texte et dedans tu ouvre la balise "<%", tu copie-colle les fonctions, et tu referme la balise "%>".

    Après pour utiliser ces fonctions dans un autre script, il suffira d'include le fichier inc que tu as créé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <!--#include file="tonFichier.inc"-->
    Puis dans le code il te suffira de faire l'appel à la fonction principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call AddUserAccessToFile(accessMask, aceFlags, aceType, userName, conteiner, domainName, subDomainName, objFile.Path)

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

Discussions similaires

  1. Peut-on modifier les droits d'accès des fichiers assets ?
    Par chinoismasque dans le forum Android
    Réponses: 13
    Dernier message: 27/05/2011, 10h59
  2. Verifier les droit d'accés à un fichier ou repertoire
    Par TheRealWill dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 30/03/2011, 15h13
  3. Réponses: 6
    Dernier message: 01/11/2010, 12h38
  4. Réponses: 6
    Dernier message: 10/05/2007, 16h24
  5. Réponses: 6
    Dernier message: 21/04/2007, 20h08

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