C'est mon script ou mon pc qui veut pas ?

xrorox Messages postés 15 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 29 juin 2013 - 28 août 2009 à 09:38
xrorox Messages postés 15 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 29 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.

Set account = getObject("Winmgmts:{impersonationlevel=impersonate}!//./root/cimv2:Win32_Account.Name='" & strUsername & "',Domain='" & strDomain &"'")


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 

2 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
28 août 2009 à 13:41
Salut,

As-tu testé avec des scripts WMI plus simples?
C'est peut etre l'impersonationlevel ??

Exemple http://www.vbfrance.com/codes/CONNAITRE-TOUT-VOS-LECTEURS-LEURS-CARACTERISTIQUES_30468.aspx

Bon dev.
0
xrorox Messages postés 15 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 29 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.
0
Rejoignez-nous