Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Permissions de dossier / Retirer une ACE [en VBS]

4 réponses
Avatar
magnum42
Bonjour,

J'ai le script suivant qui me remonte correctement les permissions d'un
dossier, et qui rajoute éventuellement des ACE's. Tout cela fonctionne à la
perfection.
Mais le souci : je n'arrive pas à effacer une ACE (entrée de permissions).
Effectivement, les lignes (actuellement en commentaires) avec les RemoveACE
ne fonctionnent pas. (ne gère pas cette propriété ou méthode).

Deuxième question : comment modifier une ACE (si je demande un droit de
lecture pour un groupe ayant déjà un droit de modification, les droits
restent en modification.
Mais si ce n'est pas possible je pourrais me débrouiller en effacant l'ACE,
quand j'aurais réussi ...

PS : Les fonctions ici me servent déjà pour d'autres scripts pour gérer des
partages avec permissions, donc j'aimerais les conserver tels quels.

Merci d'avance à tous.

--
Franck
http://faire-le-bon-choix.fr


Option Explicit

Const PERM_READ = 1179817
Const PERM_MODIFY = 1245631
Const PERM_FULL = 2032127
Const cPath = "D:\temp\rep de test"

Dim oWmiFileSecSetting,oNetwork,oWMIService_LOCAL
Dim oACE,oDACL,oSecDesc
Dim sServer,sDomain
Dim iRet

Set oWMIService_LOCAL =
GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & "." &
"\root\cimv2")
Set oNetwork = WScript.CreateObject("WScript.Network")
Set oWmiFileSecSetting =
GetObject("winmgmts:Win32_LogicalFileSecuritySetting.path='" & cPath & "'")

sServer = oNetwork.ComputerName
sDomain = oNetwork.UserDomain

Set oSecDesc = Nothing
'On récupère l'ACL actuel :
iRet = oWmiFileSecSetting.GetSecurityDescriptor(oSecDesc)
'Set oDACL = oSecDesc.DiscretionaryAcl

'On rajoute des ACE's :
Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
"FIJ_Cellule_Bureautique", PERM_READ, oSecDesc, "G")
'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
"FIJ_Cellule_Bureautique", PERM_MODIFY, oSecDesc, "G")
Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sServer,
"Administrateurs", PERM_FULL, oSecDesc, "G")
'For i = 1 To UBound(tList_RGID_Groups)
'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
tList_RGID_Groups(i), PERM_MODIFY, oSecDesc, "G")
'Next

'On supprime des ACE's :
For each oACE in oSecDesc.DACL
If(UCase(oACE.Trustee.Name) = "TOUT LE MONDE") Then
'oSecDesc.DACL.RemoveACE oACE
'oSecDesc.RemoveACE oACE
'oDACL.RemoveACE oACE
End If
Next


wscript.echo vbnewline & "Liste des ACE's :"
For each oACE in oSecDesc.DACL
wscript.echo vbtab & "ACE=" & oACE.Trustee.Name
Next

'On applique cette nouvelle ACL :
iRet = oWmiFileSecSetting.SetSecurityDescriptor(oSecDesc)
wscript.echo "Return SetSecurityDescriptor=" & iRet



Function
Create_Security_Descriptor(oWMI,dom,usr,Share_Perm,SecDesc,User_or_Group)
Dim SecDescClass, Trustee, ACE
Dim Temp_Array
Set SecDescClass = oWMI.Get("Win32_SecurityDescriptor")
Select Case UCase(User_or_Group)
Case "U"
Set Trustee = SetAccountTrustee(dom,usr) 'Use SetGroupTrustee for groups
and SetAccountTrustee for users
Case "G"
If(UCase(usr)="EVERYONE") Then
Set Trustee = SetEveryoneTrustee()
Else
Set Trustee = SetGroupTrustee(dom,usr) 'Use SetGroupTrustee for groups
and SetAccountTrustee for users
End If
End Select
If(Trustee Is Nothing) Then 'On n'a pas trouvé le compte/groupe
Select Case UCase(User_or_Group)
Case "U"
Log("ECHEC lors de la création d'un descripteur de sécurité : Le compte
" & dom & "\" & usr & " n'a pas été trouvé")
Case "G"
Log("ECHEC lors de la création d'un descripteur de sécurité : Le groupe
" & dom & "\" & usr & " n'a pas été trouvé")
End Select
Else 'On a bien récupéré le trustee.
Set ACE = oWMI.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = Share_Perm
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
If(SecDesc Is Nothing) Then
Set SecDesc = SecDescClass.SpawnInstance_()
SecDesc.Properties_.Item("DACL") = Array(ACE)
Else
Temp_Array = SecDesc.Properties_.Item("DACL")
ReDim Preserve Temp_Array(UBound(Temp_Array)+1)
Set Temp_Array(UBound(Temp_Array)) = ACE
SecDesc.Properties_.Item("DACL") = Temp_Array
End If
Select Case UCase(User_or_Group)
Case "U"
Log("Création d'un descripteur de sécurité pour le compte " & dom & "\"
& usr & " : OK")
Case "G"
Log("Création d'un descripteur de sécurité pour le groupe " & dom & "\"
& usr & " : OK")
End Select
End If
Set Create_Security_Descriptor = SecDesc
Set SecDescClass = Nothing
Set SecDesc = Nothing
End Function

Function SetGroupTrustee(strDomain, strName)
Dim oTrustee,oAccount
Dim AccountSID
On Error Resume Next
Set oTrustee =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
Set oAccount =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")
Set AccountSID =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & oAccount.SID &"'")
oTrustee.Domain = strDomain
oTrustee.Name = strName
oTrustee.Properties_.item("SID") = AccountSID.BinaryRepresentation
Set AccountSID = Nothing
Set oAccount = Nothing
If(err) Then
Set SetGroupTrustee = Nothing
Else
Set SetGroupTrustee = oTrustee
End If
On Error GoTo 0
End Function

Function SetEveryoneTrustee()
Dim oTrustee
Set oTrustee =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
oTrustee.Domain = Null
oTrustee.Name = "TOUT LE MONDE"
'oTrustee.Name = "Everybody on the dancefloor"
oTrustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
Set SetEveryoneTrustee = oTrustee
End Function

Sub Log(sText)
wscript.echo sText
End Sub

4 réponses

Avatar
magnum42
OK, voici les news :
Pour avoir accès à la fonction RemoveACE, je dois à priori installer
ADsSecurity.dll :
Wscript.CreateObject("ADsSecurity")
Très bien, mais je commence à me poser des questions.
Ce script va devoir être lancé sur plusieurs serveurs (à priori 2003, mais à
voir).
Et en cherchant un peu la dernière version de cette DLL, je vois que l'ADSI
se fait vieux, et que certains déconseillent vraiment son utilisation (sans
compter que si je dois enregistrer la DLL sur chaque serveur, ca risque de
poser des soucis.).
Donc, si qqun peux me conseiller :
- Utilisation de l'ADSI
- Un run tout bête d'un xcacls.exe
- Autre solution en XMI ou autre ?
Quelle serait la meilleure solution ?

Merci.

--
Franck
http://faire-le-bon-choix.fr


"magnum42" wrote:

Bonjour,

J'ai le script suivant qui me remonte correctement les permissions d'un
dossier, et qui rajoute éventuellement des ACE's. Tout cela fonctionne à la
perfection.
Mais le souci : je n'arrive pas à effacer une ACE (entrée de permissions).
Effectivement, les lignes (actuellement en commentaires) avec les RemoveACE
ne fonctionnent pas. (ne gère pas cette propriété ou méthode).

Deuxième question : comment modifier une ACE (si je demande un droit de
lecture pour un groupe ayant déjà un droit de modification, les droits
restent en modification.
Mais si ce n'est pas possible je pourrais me débrouiller en effacant l'ACE,
quand j'aurais réussi ...

PS : Les fonctions ici me servent déjà pour d'autres scripts pour gérer des
partages avec permissions, donc j'aimerais les conserver tels quels.

Merci d'avance à tous.

--
Franck
http://faire-le-bon-choix.fr


Option Explicit

Const PERM_READ = 1179817
Const PERM_MODIFY = 1245631
Const PERM_FULL = 2032127
Const cPath = "D:temprep de test"

Dim oWmiFileSecSetting,oNetwork,oWMIService_LOCAL
Dim oACE,oDACL,oSecDesc
Dim sServer,sDomain
Dim iRet

Set oWMIService_LOCAL =
GetObject("winmgmts:{impersonationLevel=impersonate}!" & "." &
"rootcimv2")
Set oNetwork = WScript.CreateObject("WScript.Network")
Set oWmiFileSecSetting =
GetObject("winmgmts:Win32_LogicalFileSecuritySetting.path='" & cPath & "'")

sServer = oNetwork.ComputerName
sDomain = oNetwork.UserDomain

Set oSecDesc = Nothing
'On récupère l'ACL actuel :
iRet = oWmiFileSecSetting.GetSecurityDescriptor(oSecDesc)
'Set oDACL = oSecDesc.DiscretionaryAcl

'On rajoute des ACE's :
Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
"FIJ_Cellule_Bureautique", PERM_READ, oSecDesc, "G")
'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
"FIJ_Cellule_Bureautique", PERM_MODIFY, oSecDesc, "G")
Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sServer,
"Administrateurs", PERM_FULL, oSecDesc, "G")
'For i = 1 To UBound(tList_RGID_Groups)
'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
tList_RGID_Groups(i), PERM_MODIFY, oSecDesc, "G")
'Next

'On supprime des ACE's :
For each oACE in oSecDesc.DACL
If(UCase(oACE.Trustee.Name) = "TOUT LE MONDE") Then
'oSecDesc.DACL.RemoveACE oACE
'oSecDesc.RemoveACE oACE
'oDACL.RemoveACE oACE
End If
Next


wscript.echo vbnewline & "Liste des ACE's :"
For each oACE in oSecDesc.DACL
wscript.echo vbtab & "ACE=" & oACE.Trustee.Name
Next

'On applique cette nouvelle ACL :
iRet = oWmiFileSecSetting.SetSecurityDescriptor(oSecDesc)
wscript.echo "Return SetSecurityDescriptor=" & iRet



Function
Create_Security_Descriptor(oWMI,dom,usr,Share_Perm,SecDesc,User_or_Group)
Dim SecDescClass, Trustee, ACE
Dim Temp_Array
Set SecDescClass = oWMI.Get("Win32_SecurityDescriptor")
Select Case UCase(User_or_Group)
Case "U"
Set Trustee = SetAccountTrustee(dom,usr) 'Use SetGroupTrustee for groups
and SetAccountTrustee for users
Case "G"
If(UCase(usr)="EVERYONE") Then
Set Trustee = SetEveryoneTrustee()
Else
Set Trustee = SetGroupTrustee(dom,usr) 'Use SetGroupTrustee for groups
and SetAccountTrustee for users
End If
End Select
If(Trustee Is Nothing) Then 'On n'a pas trouvé le compte/groupe
Select Case UCase(User_or_Group)
Case "U"
Log("ECHEC lors de la création d'un descripteur de sécurité : Le compte
" & dom & "" & usr & " n'a pas été trouvé")
Case "G"
Log("ECHEC lors de la création d'un descripteur de sécurité : Le groupe
" & dom & "" & usr & " n'a pas été trouvé")
End Select
Else 'On a bien récupéré le trustee.
Set ACE = oWMI.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = Share_Perm
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
If(SecDesc Is Nothing) Then
Set SecDesc = SecDescClass.SpawnInstance_()
SecDesc.Properties_.Item("DACL") = Array(ACE)
Else
Temp_Array = SecDesc.Properties_.Item("DACL")
ReDim Preserve Temp_Array(UBound(Temp_Array)+1)
Set Temp_Array(UBound(Temp_Array)) = ACE
SecDesc.Properties_.Item("DACL") = Temp_Array
End If
Select Case UCase(User_or_Group)
Case "U"
Log("Création d'un descripteur de sécurité pour le compte " & dom & ""
& usr & " : OK")
Case "G"
Log("Création d'un descripteur de sécurité pour le groupe " & dom & ""
& usr & " : OK")
End Select
End If
Set Create_Security_Descriptor = SecDesc
Set SecDescClass = Nothing
Set SecDesc = Nothing
End Function

Function SetGroupTrustee(strDomain, strName)
Dim oTrustee,oAccount
Dim AccountSID
On Error Resume Next
Set oTrustee =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
Set oAccount =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")
Set AccountSID =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & oAccount.SID &"'")
oTrustee.Domain = strDomain
oTrustee.Name = strName
oTrustee.Properties_.item("SID") = AccountSID.BinaryRepresentation
Set AccountSID = Nothing
Set oAccount = Nothing
If(err) Then
Set SetGroupTrustee = Nothing
Else
Set SetGroupTrustee = oTrustee
End If
On Error GoTo 0
End Function

Function SetEveryoneTrustee()
Dim oTrustee
Set oTrustee =
getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
oTrustee.Domain = Null
oTrustee.Name = "TOUT LE MONDE"
'oTrustee.Name = "Everybody on the dancefloor"
oTrustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
Set SetEveryoneTrustee = oTrustee
End Function

Sub Log(sText)
wscript.echo sText
End Sub

Avatar
Marc Lognoul [MVP]
Bonsoir,

Si vous ne disposez pas de PowerShell, choisissez la combinaison suivantes:
- placer la logique dans un VBS
- lancez icacls pour paraméter les permissions
... il n'est pas interdit de lancer plusieurs icacls en parallèle (pas de
"wait on return") mais veillez à bien tester.


--
Marc Lognoul [MCSE, MCTS, MVP]
Heureux celui qui a pu pénétrer les causes secrètes des choses
Happy is the one who could enter the secret causes of things
Blog EN: http://www.marc-antho-etc.net/blog/
Blog FR: http://www.marc-antho-etc.net/blogfr/



"magnum42" wrote in message
news:
OK, voici les news :
Pour avoir accès à la fonction RemoveACE, je dois à priori installer
ADsSecurity.dll :
Wscript.CreateObject("ADsSecurity")
Très bien, mais je commence à me poser des questions.
Ce script va devoir être lancé sur plusieurs serveurs (à priori 2003, mais
à
voir).
Et en cherchant un peu la dernière version de cette DLL, je vois que
l'ADSI
se fait vieux, et que certains déconseillent vraiment son utilisation
(sans
compter que si je dois enregistrer la DLL sur chaque serveur, ca risque de
poser des soucis.).
Donc, si qqun peux me conseiller :
- Utilisation de l'ADSI
- Un run tout bête d'un xcacls.exe
- Autre solution en XMI ou autre ?
Quelle serait la meilleure solution ?

Merci.

--
Franck
http://faire-le-bon-choix.fr


"magnum42" wrote:

Bonjour,

J'ai le script suivant qui me remonte correctement les permissions d'un
dossier, et qui rajoute éventuellement des ACE's. Tout cela fonctionne à
la
perfection.
Mais le souci : je n'arrive pas à effacer une ACE (entrée de
permissions).
Effectivement, les lignes (actuellement en commentaires) avec les
RemoveACE
ne fonctionnent pas. (ne gère pas cette propriété ou méthode).

Deuxième question : comment modifier une ACE (si je demande un droit de
lecture pour un groupe ayant déjà un droit de modification, les droits
restent en modification.
Mais si ce n'est pas possible je pourrais me débrouiller en effacant
l'ACE,
quand j'aurais réussi ...

PS : Les fonctions ici me servent déjà pour d'autres scripts pour gérer
des
partages avec permissions, donc j'aimerais les conserver tels quels.

Merci d'avance à tous.

--
Franck
http://faire-le-bon-choix.fr


Option Explicit

Const PERM_READ = 1179817
Const PERM_MODIFY = 1245631
Const PERM_FULL = 2032127
Const cPath = "D:temprep de test"

Dim oWmiFileSecSetting,oNetwork,oWMIService_LOCAL
Dim oACE,oDACL,oSecDesc
Dim sServer,sDomain
Dim iRet

Set oWMIService_LOCAL >> GetObject("winmgmts:{impersonationLevel=impersonate}!" & "." &
"rootcimv2")
Set oNetwork = WScript.CreateObject("WScript.Network")
Set oWmiFileSecSetting >> GetObject("winmgmts:Win32_LogicalFileSecuritySetting.path='" & cPath &
"'")

sServer = oNetwork.ComputerName
sDomain = oNetwork.UserDomain

Set oSecDesc = Nothing
'On récupère l'ACL actuel :
iRet = oWmiFileSecSetting.GetSecurityDescriptor(oSecDesc)
'Set oDACL = oSecDesc.DiscretionaryAcl

'On rajoute des ACE's :
Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
"FIJ_Cellule_Bureautique", PERM_READ, oSecDesc, "G")
'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
"FIJ_Cellule_Bureautique", PERM_MODIFY, oSecDesc, "G")
Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sServer,
"Administrateurs", PERM_FULL, oSecDesc, "G")
'For i = 1 To UBound(tList_RGID_Groups)
'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
tList_RGID_Groups(i), PERM_MODIFY, oSecDesc, "G")
'Next

'On supprime des ACE's :
For each oACE in oSecDesc.DACL
If(UCase(oACE.Trustee.Name) = "TOUT LE MONDE") Then
'oSecDesc.DACL.RemoveACE oACE
'oSecDesc.RemoveACE oACE
'oDACL.RemoveACE oACE
End If
Next


wscript.echo vbnewline & "Liste des ACE's :"
For each oACE in oSecDesc.DACL
wscript.echo vbtab & "ACE=" & oACE.Trustee.Name
Next

'On applique cette nouvelle ACL :
iRet = oWmiFileSecSetting.SetSecurityDescriptor(oSecDesc)
wscript.echo "Return SetSecurityDescriptor=" & iRet



Function
Create_Security_Descriptor(oWMI,dom,usr,Share_Perm,SecDesc,User_or_Group)
Dim SecDescClass, Trustee, ACE
Dim Temp_Array
Set SecDescClass = oWMI.Get("Win32_SecurityDescriptor")
Select Case UCase(User_or_Group)
Case "U"
Set Trustee = SetAccountTrustee(dom,usr) 'Use SetGroupTrustee for groups
and SetAccountTrustee for users
Case "G"
If(UCase(usr)="EVERYONE") Then
Set Trustee = SetEveryoneTrustee()
Else
Set Trustee = SetGroupTrustee(dom,usr) 'Use SetGroupTrustee for groups
and SetAccountTrustee for users
End If
End Select
If(Trustee Is Nothing) Then 'On n'a pas trouvé le compte/groupe
Select Case UCase(User_or_Group)
Case "U"
Log("ECHEC lors de la création d'un descripteur de sécurité : Le compte
" & dom & "" & usr & " n'a pas été trouvé")
Case "G"
Log("ECHEC lors de la création d'un descripteur de sécurité : Le groupe
" & dom & "" & usr & " n'a pas été trouvé")
End Select
Else 'On a bien récupéré le trustee.
Set ACE = oWMI.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = Share_Perm
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
If(SecDesc Is Nothing) Then
Set SecDesc = SecDescClass.SpawnInstance_()
SecDesc.Properties_.Item("DACL") = Array(ACE)
Else
Temp_Array = SecDesc.Properties_.Item("DACL")
ReDim Preserve Temp_Array(UBound(Temp_Array)+1)
Set Temp_Array(UBound(Temp_Array)) = ACE
SecDesc.Properties_.Item("DACL") = Temp_Array
End If
Select Case UCase(User_or_Group)
Case "U"
Log("Création d'un descripteur de sécurité pour le compte " & dom & ""
& usr & " : OK")
Case "G"
Log("Création d'un descripteur de sécurité pour le groupe " & dom & ""
& usr & " : OK")
End Select
End If
Set Create_Security_Descriptor = SecDesc
Set SecDescClass = Nothing
Set SecDesc = Nothing
End Function

Function SetGroupTrustee(strDomain, strName)
Dim oTrustee,oAccount
Dim AccountSID
On Error Resume Next
Set oTrustee >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
Set oAccount >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='"
& strName & "',Domain='" & strDomain &"'")
Set AccountSID >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='"
& oAccount.SID &"'")
oTrustee.Domain = strDomain
oTrustee.Name = strName
oTrustee.Properties_.item("SID") = AccountSID.BinaryRepresentation
Set AccountSID = Nothing
Set oAccount = Nothing
If(err) Then
Set SetGroupTrustee = Nothing
Else
Set SetGroupTrustee = oTrustee
End If
On Error GoTo 0
End Function

Function SetEveryoneTrustee()
Dim oTrustee
Set oTrustee >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
oTrustee.Domain = Null
oTrustee.Name = "TOUT LE MONDE"
'oTrustee.Name = "Everybody on the dancefloor"
oTrustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0)
Set SetEveryoneTrustee = oTrustee
End Function

Sub Log(sText)
wscript.echo sText
End Sub

Avatar
Philemil
Le 04/03/2010 15:13, magnum42 a écrit :
Bonjour,

J'ai le script suivant qui me remonte correctement les permissions d'un
dossier, et qui rajoute éventuellement des ACE's. Tout cela fonctionne à la
perfection.
Mais le souci : je n'arrive pas à effacer une ACE (entrée de permissions).
Effectivement, les lignes (actuellement en commentaires) avec les RemoveACE
ne fonctionnent pas. (ne gère pas cette propriété ou méthode).

Deuxième question : comment modifier une ACE (si je demande un droit de
lecture pour un groupe ayant déjà un droit de modification, les droits
restent en modification.
Mais si ce n'est pas possible je pourrais me débrouiller en effacant l'ACE,
quand j'aurais réussi ...

PS : Les fonctions ici me servent déjà pour d'autres scripts pour gérer des
partages avec permissions, donc j'aimerais les conserver tels quels.

Merci d'avance à tous.



Bonjour

subinacl du Kit de ressources W2003 apporte facilement la réponse, que
ce soit pour les dossiers, les partages , etc

je n'ai pas de NTFS sous la main pour tester, mais quelque chose comme
ceci pour effacer :

SubInacl /subdirectories "D:temprep de test" /revoke="Tout le monde"

pour des exemples, faire un
subinacl /help /full

bon courage pour la suite ...
Avatar
magnum42
Bonjour,

Merci pour vos réponses.
Apparemment le plus sage est effectivement de rester sur des "oWshShell.Run"
de commandes xcacls.
Je continue donc là-dessus.

Merci.
--
Franck
http://faire-le-bon-choix.fr


"Marc Lognoul [MVP]" wrote:

Bonsoir,

Si vous ne disposez pas de PowerShell, choisissez la combinaison suivantes:
- placer la logique dans un VBS
- lancez icacls pour paraméter les permissions
... il n'est pas interdit de lancer plusieurs icacls en parallèle (pas de
"wait on return") mais veillez à bien tester.


--
Marc Lognoul [MCSE, MCTS, MVP]
Heureux celui qui a pu pénétrer les causes secrètes des choses
Happy is the one who could enter the secret causes of things
Blog EN: http://www.marc-antho-etc.net/blog/
Blog FR: http://www.marc-antho-etc.net/blogfr/



"magnum42" wrote in message
news:
> OK, voici les news :
> Pour avoir accès à la fonction RemoveACE, je dois à priori installer
> ADsSecurity.dll :
> Wscript.CreateObject("ADsSecurity")
> Très bien, mais je commence à me poser des questions.
> Ce script va devoir être lancé sur plusieurs serveurs (à priori 2003, mais
> à
> voir).
> Et en cherchant un peu la dernière version de cette DLL, je vois que
> l'ADSI
> se fait vieux, et que certains déconseillent vraiment son utilisation
> (sans
> compter que si je dois enregistrer la DLL sur chaque serveur, ca risque de
> poser des soucis.).
> Donc, si qqun peux me conseiller :
> - Utilisation de l'ADSI
> - Un run tout bête d'un xcacls.exe
> - Autre solution en XMI ou autre ?
> Quelle serait la meilleure solution ?
>
> Merci.
>
> --
> Franck
> http://faire-le-bon-choix.fr
>
>
> "magnum42" wrote:
>
>> Bonjour,
>>
>> J'ai le script suivant qui me remonte correctement les permissions d'un
>> dossier, et qui rajoute éventuellement des ACE's. Tout cela fonctionne à
>> la
>> perfection.
>> Mais le souci : je n'arrive pas à effacer une ACE (entrée de
>> permissions).
>> Effectivement, les lignes (actuellement en commentaires) avec les
>> RemoveACE
>> ne fonctionnent pas. (ne gère pas cette propriété ou méthode).
>>
>> Deuxième question : comment modifier une ACE (si je demande un droit de
>> lecture pour un groupe ayant déjà un droit de modification, les droits
>> restent en modification.
>> Mais si ce n'est pas possible je pourrais me débrouiller en effacant
>> l'ACE,
>> quand j'aurais réussi ...
>>
>> PS : Les fonctions ici me servent déjà pour d'autres scripts pour gérer
>> des
>> partages avec permissions, donc j'aimerais les conserver tels quels.
>>
>> Merci d'avance à tous.
>>
>> --
>> Franck
>> http://faire-le-bon-choix.fr
>>
>>
>> Option Explicit
>>
>> Const PERM_READ = 1179817
>> Const PERM_MODIFY = 1245631
>> Const PERM_FULL = 2032127
>> Const cPath = "D:temprep de test"
>>
>> Dim oWmiFileSecSetting,oNetwork,oWMIService_LOCAL
>> Dim oACE,oDACL,oSecDesc
>> Dim sServer,sDomain
>> Dim iRet
>>
>> Set oWMIService_LOCAL > >> GetObject("winmgmts:{impersonationLevel=impersonate}!" & "." &
>> "rootcimv2")
>> Set oNetwork = WScript.CreateObject("WScript.Network")
>> Set oWmiFileSecSetting > >> GetObject("winmgmts:Win32_LogicalFileSecuritySetting.path='" & cPath &
>> "'")
>>
>> sServer = oNetwork.ComputerName
>> sDomain = oNetwork.UserDomain
>>
>> Set oSecDesc = Nothing
>> 'On récupère l'ACL actuel :
>> iRet = oWmiFileSecSetting.GetSecurityDescriptor(oSecDesc)
>> 'Set oDACL = oSecDesc.DiscretionaryAcl
>>
>> 'On rajoute des ACE's :
>> Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
>> "FIJ_Cellule_Bureautique", PERM_READ, oSecDesc, "G")
>> 'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
>> "FIJ_Cellule_Bureautique", PERM_MODIFY, oSecDesc, "G")
>> Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sServer,
>> "Administrateurs", PERM_FULL, oSecDesc, "G")
>> 'For i = 1 To UBound(tList_RGID_Groups)
>> 'Set oSecDesc = Create_Security_Descriptor(oWMIService_LOCAL,sDomain,
>> tList_RGID_Groups(i), PERM_MODIFY, oSecDesc, "G")
>> 'Next
>>
>> 'On supprime des ACE's :
>> For each oACE in oSecDesc.DACL
>> If(UCase(oACE.Trustee.Name) = "TOUT LE MONDE") Then
>> 'oSecDesc.DACL.RemoveACE oACE
>> 'oSecDesc.RemoveACE oACE
>> 'oDACL.RemoveACE oACE
>> End If
>> Next
>>
>>
>> wscript.echo vbnewline & "Liste des ACE's :"
>> For each oACE in oSecDesc.DACL
>> wscript.echo vbtab & "ACE=" & oACE.Trustee.Name
>> Next
>>
>> 'On applique cette nouvelle ACL :
>> iRet = oWmiFileSecSetting.SetSecurityDescriptor(oSecDesc)
>> wscript.echo "Return SetSecurityDescriptor=" & iRet
>>
>>
>>
>> Function
>> Create_Security_Descriptor(oWMI,dom,usr,Share_Perm,SecDesc,User_or_Group)
>> Dim SecDescClass, Trustee, ACE
>> Dim Temp_Array
>> Set SecDescClass = oWMI.Get("Win32_SecurityDescriptor")
>> Select Case UCase(User_or_Group)
>> Case "U"
>> Set Trustee = SetAccountTrustee(dom,usr) 'Use SetGroupTrustee for groups
>> and SetAccountTrustee for users
>> Case "G"
>> If(UCase(usr)="EVERYONE") Then
>> Set Trustee = SetEveryoneTrustee()
>> Else
>> Set Trustee = SetGroupTrustee(dom,usr) 'Use SetGroupTrustee for groups
>> and SetAccountTrustee for users
>> End If
>> End Select
>> If(Trustee Is Nothing) Then 'On n'a pas trouvé le compte/groupe
>> Select Case UCase(User_or_Group)
>> Case "U"
>> Log("ECHEC lors de la création d'un descripteur de sécurité : Le compte
>> " & dom & "" & usr & " n'a pas été trouvé")
>> Case "G"
>> Log("ECHEC lors de la création d'un descripteur de sécurité : Le groupe
>> " & dom & "" & usr & " n'a pas été trouvé")
>> End Select
>> Else 'On a bien récupéré le trustee.
>> Set ACE = oWMI.Get("Win32_Ace").SpawnInstance_
>> ACE.Properties_.Item("AccessMask") = Share_Perm
>> ACE.Properties_.Item("AceFlags") = 3
>> ACE.Properties_.Item("AceType") = 0
>> ACE.Properties_.Item("Trustee") = Trustee
>> If(SecDesc Is Nothing) Then
>> Set SecDesc = SecDescClass.SpawnInstance_()
>> SecDesc.Properties_.Item("DACL") = Array(ACE)
>> Else
>> Temp_Array = SecDesc.Properties_.Item("DACL")
>> ReDim Preserve Temp_Array(UBound(Temp_Array)+1)
>> Set Temp_Array(UBound(Temp_Array)) = ACE
>> SecDesc.Properties_.Item("DACL") = Temp_Array
>> End If
>> Select Case UCase(User_or_Group)
>> Case "U"
>> Log("Création d'un descripteur de sécurité pour le compte " & dom & ""
>> & usr & " : OK")
>> Case "G"
>> Log("Création d'un descripteur de sécurité pour le groupe " & dom & ""
>> & usr & " : OK")
>> End Select
>> End If
>> Set Create_Security_Descriptor = SecDesc
>> Set SecDescClass = Nothing
>> Set SecDesc = Nothing
>> End Function
>>
>> Function SetGroupTrustee(strDomain, strName)
>> Dim oTrustee,oAccount
>> Dim AccountSID
>> On Error Resume Next
>> Set oTrustee > >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
>> Set oAccount > >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='"
>> & strName & "',Domain='" & strDomain &"'")
>> Set AccountSID > >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='"
>> & oAccount.SID &"'")
>> oTrustee.Domain = strDomain
>> oTrustee.Name = strName
>> oTrustee.Properties_.item("SID") = AccountSID.BinaryRepresentation
>> Set AccountSID = Nothing
>> Set oAccount = Nothing
>> If(err) Then
>> Set SetGroupTrustee = Nothing
>> Else
>> Set SetGroupTrustee = oTrustee
>> End If
>> On Error GoTo 0
>> End Function
>>
>> Function SetEveryoneTrustee()
>> Dim oTrustee
>> Set oTrustee > >> getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
>> oTrustee.Domain = Null
>> oTrustee.Name = "TOUT LE MONDE"
>> 'oTrustee.Name = "Everybody on the dancefloor"
>> oTrustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
>> 0)
>> Set SetEveryoneTrustee = oTrustee
>> End Function
>>
>> Sub Log(sText)
>> wscript.echo sText
>> End Sub
>>