xrorox
Messages postés15Date d'inscriptionmardi 19 août 2008StatutMembreDernière intervention29 juin 2013
-
28 août 2009 à 09:38
xrorox
Messages postés15Date d'inscriptionmardi 19 août 2008StatutMembreDernière intervention29 juin 2013
-
31 août 2009 à 08:07
Bonjour,
Pour donner la couleur tout de suite, je travaille sous windows server 2003 que j'ai fraichement formaté, puis mis à jour pour essayez en vain de résoudre un problème, avec ce morceau de code.
Mon problème cette ligne est syntaxiquement correcte. J'ai une erreur indiquant que mon objet n'a pas été trouvé. Le but de la partie du code dans laquelle elle est insérée est de gérer les droits NTFS sans utiliser xcacls ou cacls ou leurs équivalents. Et c'est cette partie, le dernier appel de fonction pour obtenir la dernière information manquante qui foire.
J'avais déjà posté sur le forum VB, il y a quelques temps. On m'a dit que cette partie du code marchait, et que le problème ne venait pas de là ...
Diagnostiquant des erreurs WMI et n'arrivant pas à les réparer j'ai fini par formater le pc pour essayez d'avoir une version neuve efficace. Et j'ai installé tous les modules complémentaires qui affirmaient expressement avoir un lien avec WMI.
Cependant, ca ne marche toujours pas. Donc ma question, c'est est-ce que ce code marche chez vous ? Et pour ceux qui sauront répondre, comment je dois configurer mon système pour qu'il accepte.
Les utilisateurs sont créés via active directory. Et je n'avais pas de soucis pour gérer les droits avec xcacls. (Mais on m'a demandé de faire autrement ...).
A la suite vous trouverez la totalité du code gérant les droits NTFS, avec un appel type. Il suffit d'appeller la fonction ModifyFilePerm avec les arguments suivants un "." qui semble signifier localhost, bref désigner que c sur le pc qui execute le script qu'il faut chercher (j'execute mon script sur le controleur de domaine)
Ensuite le chemin d'accès au fichier.
Le nom de l'utilisateur
Le domaine de l'utilisateur
Définir si c'est un utilisateur "u" ou un groupe "g".
Et le paramètre d'execution "a" pour ajouter les droits. "d" pour les retirer.
chemin = "C:\$RepertoirePrincipalTSE" & Classe & "" & Nom & Prenom
ModifyFilePerm "." , chemin, Login, "lycee.fr", "u", "a"
Function ModifyFilePerm(strComputer, strFilePath, strUsername, strDomain, strUtype, strMode)
Dim dacl, Services, SecDescClass, SecDesc, intRetVal
Dim wmiFileSecSetting, wmiFileSetting, wmiSecurityDescriptor
Set Services = GetObject("winmgmts:{impersonationLevel=impersonate,(Security)}!\" & strComputer & "\root\cimv2")
Set SecDescClass = Services.Get("Win32_SecurityDescriptor")
Set SecDesc = SecDescClass.SpawnInstance_
strFilePath = replace(strFilePath,"","\")
Set wmiFileSetting = GetObject("Winmgmts:{impersonationlevel=impersonate}!//" & strComputer & "/root/cimv2:Win32_Directory='" & strFilePath & "'")
Set wmiFileSecSetting = GetObject("winmgmts:{impersonationLevel=impersonate,(Security)}!\" & strComputer & _
"\root\cimv2:Win32_LogicalFileSecuritySetting.path='" & strFilePath & "'")
intRetVal = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
' obtient le descripteur de sécurité existant
'retrouve le contenu de Win32_SecurityDescriptor DACL property.
DACL = wmiSecurityDescriptor.dacl
If strMode = "a" Then 'ajoute l'utilisateur
AddUserAce dacl, strUsername, strDomain, strUtype, strComputer, Services
SecDesc.Properties_.Item("DACL") = dacl
wscript.echo "adding " & strusername & " to the dacl for " & replace(strFilePath,"\","") & "." & vbcrlf & _
"Result of change: " & wmiFileSetting.changesecuritypermissions(SecDesc, 4)
ElseIf strMode = "d" Then 'le supprime
SecDesc.Properties_.Item("DACL") = DeleteUserAce (dacl, strUsername, strDomain, strUtype, strComputer, Services)
wscript.echo "deleting " & strusername & " to the dacl for " & replace(strFilePath,"\","") & "." & vbcrlf & _
"Result of change: " & wmiFileSetting.changesecuritypermissions(SecDesc, 4)
Else
wscript.echo ModifyUserAce (wmiSecurityDescriptor.dacl, strUsername, strAccessLvl)
intRetVal = wmiFileSecSetting.SetSecurityDescriptor(wmiSecurityDescriptor)
Wscript.Echo GetResultMessageFile(intretval, replace(strFilePath,"\",""), strUsername)
End If
Set Services = nothing
Set SecDescClass = nothing
Set SecDesc = Nothing
Set wmiFileSecSetting = nothing
Set wmiFileSetting = nothing
End Function
Function GetObjTrustee(strUsername, strDomain, strUtype, strComputer)
Dim objTrustee, account, accountSID
Set objTrustee = getObject("Winmgmts:{impersonationlevel=impersonate}!//" & strComputer & "/root/cimv2:Win32_Trustee").Spawninstance_
If strUtype = "g" Then
Set account = getObject("Winmgmts:{impersonationlevel=impersonate}!//./root/cimv2:Win32_Group.Name='" & strUsername & "',Domain='" & strDomain &"'")
Else
Set account = getObject("Winmgmts:{impersonationlevel=impersonate}!//./root/cimv2:Win32_Account.Name='" & strUsername & "',Domain='" & strDomain &"'")
End If
Set accountSID = getObject("Winmgmts:{impersonationlevel=impersonate}!//" & strComputer & "/root/cimv2:Win32_SID.SID='" & account.SID &"'")
objTrustee.Domain = strDomain
objTrustee.Name = strUsername
objTrustee.Properties_.item("SID") = accountSID.BinaryRepresentation
Set GetObjTrustee = objTrustee
Set accountSID = nothing
Set account = Nothing
Set objTrustee = nothing
End Function
Function AddUserAce( byref dacl, strUsername, strDomain, strUtype, strComputer, byref Services )
Dim intArrAceMax, arrACE, objACE
intArrAceMax = UBound(dacl) + 1
ReDim preserve dacl(intArrAceMax)
Set dacl(intArrAceMax) = Services.Get("Win32_Ace").SpawnInstance_
dacl(intArrAceMax).Properties_.Item("AccessMask") = 2032127
dacl(intArrAceMax).Properties_.Item("AceFlags") = 3
dacl(intArrAceMax).Properties_.Item("AceType") = 0
dacl(intArrAceMax).Properties_.Item("Trustee") = GetObjTrustee(strUsername, strDomain, strUtype, strComputer)
Set objACE = Nothing
End Function
Function DeleteUserAce( byref dacl, strUsername, strDomain, strUtype, strComputer, byref Services )
Dim intArrAceMax, arrACE, i, objACE
intArrAceMax = UBound(dacl)
ReDim arrACE(intArrAceMax)
i = 0
For Each objACE in dacl
If UCase(objace.trustee.name) <> UCase(strUsername) Then
Set arrACE(i) = services.get("Win32_Ace").SpawnInstance_
arrACE(i).Properties_.Item("AccessMask") = objace.accessmask
arrACE(i).Properties_.Item("AceFlags") = objace.aceflags
arrACE(i).Properties_.Item("AceType") = objace.acetype
arrACE(i).Properties_.Item("Trustee") = objace.trustee
i = i + 1
End if
Next
If intArrAceMax > i - 1 Then
wscript.echo "User/Group " & strUsername & " removed."
ReDim preserve arrACE(intArrAceMax-1)
Else
wscript.echo "User/Group " & strUsername & " not found."
End If
DeleteUserAce = arrACE
For i = 0 to intArrAceMax - 1
Set arrACE(i) = nothing
Next
Set objACE = nothing
End Function
Function ModifyUserAce(byref dacl, strUsername)
Dim strMsg, objACE
strMsg = "User/Group: " & strUsername & " not found in dacl"
For Each objACE in dacl
If UCase(objace.trustee.name) = UCase(strUsername) Then
objace.Properties_.Item("AccessMask") = 2032127
strMsg = "User: " & strUsername & " found and modified to have "
Exit For
End If
Next
Set objACE = nothing
ModifyUserAce = strMsg
End Function
Function GetResultMessageFile(errReturn, strSharename, strUsername)
If errReturn = 0 Then
GetResultMessageFile = "File permissions for " & strSharename & " successfully updated!"
Else
Select Case errReturn
case 2
errDesc = "Access denied."
Case 8
errDesc = "Unknown failure."
case 9
errDesc = "Privledge Missing."
Case 10
errDesc = "Invalid level."
Case 21
errDesc = "Invalid parameter."
Case 23
errDesc = "Redirected path."
Case 24
errDesc = "Directory does not exist."
Case 25
errDesc = "Net name not found."
End Select
GetResultMessageFile = "Failed to update File permissions for " & strSharename & ". Error number: " & errReturn & ". " & errDesc
End If
End Function
xrorox
Messages postés15Date d'inscriptionmardi 19 août 2008StatutMembreDernière intervention29 juin 2013 31 août 2009 à 08:07
Merci de ta réponse.
Certaines de mes requêtes WMI fonctionnent, mais certains exemples tout droit tirés de microsoft ne font rien, ou renvoient une erreur. Peut être qu'il me manque quelques classes. Si c'est le cas, je ne sais pas comment les remettre j'ai mis tout les composants additionnels affichant un lien avec WMI. Et je n'ai pas eu de plantage ou de coupure sauvage depuis que j'ai formaté cet ordi.
J'ai essayé sans le impersonationlevel, mais pas de différence. Il renvoie qu'il ne trouve pas l'objet.
Les comptes sont activés, mais n'ont jamais été ouvert, et j'essaie de mettre les droits sur leurs dossiers persos, et les profils. Si vous avez des idées je suis ouvert à toute proposition. On m'a demandé de faire sans xcacls ou ses équivalents, pour des raisons de performances.