Comment changer la sécurité sur une imprimante local/distante ?

Flow8002 Messages postés 21 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2012 - 21 nov. 2012 à 12:11
Flow8002 Messages postés 21 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2012 - 21 nov. 2012 à 14:56
Bonjour ,

je galere depuis un petit moment sur un bout de code qui est fonctionnel en Vbscript mais que je n'arrive pas a transcrire en vb .
il a pour fonction de donner les droits full a "Tout le monde" sur une imprimante .
ci dessous le code :

Const FullControl = 2032127


computer = "PC-28"
Imp = "Lexmark E360dn"

Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & computer & "/root/cimv2")
Set objWMIService = GetObject("winmgmts:\" & computer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer") 

For Each objItem in colItems 
   
   if objItem.Name =Imp then 
 
 Set shareSec =objItem
 end if
Next



' copy existing ACEs
rc = shareSec.GetSecurityDescriptor(sd)
flags = sd.ControlFlags
ReDim acl(UBound(sd.DACL)+1)  '+1 for the new ACL we're going to add

For i = 0 To UBound(sd.DACL)
  Set acl(i) = sd.DACL(i)
Next

Set sd = Nothing

' add new ACE
Set acl(UBound(acl)) = NewACE(NewTrustee(computer), FullControl)

' prepare new security descriptor
Set sd = wmi.Get("Win32_SecurityDescriptor").SpawnInstance_
sd.ControlFlags = flags
sd.DACL = acl

' assign new security descriptor
rc = shareSec.SetSecurityDescriptor(sd)



Function NewTrustee(computer)

  Dim trustee, account
  Set trustee = wmi.Get("Win32_Trustee").SpawnInstance_
  trustee.Name   = "Tout le monde"
  trustee.Domain = computer
  trustee.Properties_.Item("SID") = wmi.Get("Win32_SID.SID='S-1-1-0'").BinaryRepresentation
  Set NewTrustee = trustee
  
End Function

Function NewACE(trustee, permissions)

  Dim ace : Set ace = wmi.Get("Win32_Ace").SpawnInstance_
  ace.Properties_.Item("AccessMask") = permissions
  ace.Properties_.Item("AceFlags") = 3
  ace.Properties_.Item("AceType") = 0
  ace.Properties_.Item("Trustee") = trustee
  Set NewACE = ace
  
End Function



J'ai commencé a retranscrire cette meme fonction en vb mais en vain .....


ci dessous le debut du code :

 Public Function Conf_secu(ByVal computer As String, ByVal printer As String) As Boolean

        printer = "lexmark e360dn"
        Calif = "PC-E28"

        computer= "\" & computer & ""

        Dim searcher As New ManagementObjectSearcher(Calif & "root\CIMV2", "SELECT * FROM Win32_Printer")
        Dim colItems = searcher.Get()

               For Each objItem As ManagementObject In colItems

            If objItem("name") = printer Then


                Dim sid As Security.Principal.SecurityIdentifier
                Dim sd As System.Security.AccessControl.DiscretionaryAcl
                Dim rc As ManagementBaseObject

                sid = New Security.Principal.SecurityIdentifier("S-1-1-0")
                nt = CType(sid.Translate(Type.GetType("System.Security.Principal.NTAccount")), System.Security.Principal.NTAccount)

              'je tente de reinvoquer la sd de l'imprimante mais ca na pas l'air de marché ....
                rc = objItem.InvokeMethod("GetSecurityDescriptor", Nothing, Nothing)

                rc = objItem.InvokeMethod("SetSecurityDescriptor", Nothing, Nothing)


            End If
        Next

     


        Return True


    End Function







Apres je seche pour assigner le nouveau SID à l'objet printer .

Si quelqu'un pouvait me donner une eventuelle piste ca serait cool !


Merci .

@+

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 nov. 2012 à 13:28
Bonjour,
on ne voit pas les déclarations utilisées et il n'est pas impossible (probable, même) que là soit le problème !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Flow8002 Messages postés 21 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2012
21 nov. 2012 à 13:31
je me suis inspiré d'un code vbscript d'internet ou les variables ne sont pas déclarées .
j'arrive pas a voir à quoi les variables correspondent exactement .
donc a retranscrire s'est la misere ...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 nov. 2012 à 13:35
Ah ? Et quid (par exemple) de la déclaration de la fonction GetObject de l'Api de Windows ? VBScript sait "tout seul comme un grand" de quoi il s'agit, peut-être ????


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Flow8002 Messages postés 21 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2012
21 nov. 2012 à 13:39
j'ai mis le code entier de mon fichier vbs ,le vbs fonctionne parfaitement .

ci-joint le site ou je me suis inspiré .

ici
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Flow8002 Messages postés 21 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2012
21 nov. 2012 à 14:56
j'ai retranscris le code en vb mais il reste toujours non fonctionnel .


Quelqu'un voit l'erreur ?



 Public Function Conf_secu(ByVal computer As String, ByVal printer As String) As Boolean


        computer = "\" & computer & ""

        Dim searcher As New ManagementObjectSearcher(computer & "root\CIMV2", "SELECT * FROM Win32_Printer")
        Dim colItems = searcher.Get()

        For Each objItem As ManagementObject In colItems

            If objItem("name") = printer Then

                Dim sid As Security.Principal.SecurityIdentifier = New Security.Principal.SecurityIdentifier("S-1-1-0")
                Dim sidArray(sid.BinaryLength) As Byte
                sid.GetBinaryForm(sidArray, 0)

                Dim Trustee As ManagementObject = New ManagementClass(New ManagementPath("Win32_Trustee"), Nothing)
                Trustee("Name") = "Tout le monde"
                Trustee("domain") = computer 
                Trustee("SID") = sidArray

                Dim AdminACE As ManagementObject = New ManagementClass(New ManagementPath("Win32_Ace"), Nothing)
                AdminACE("AccessMask") = 2032127
                AdminACE("AceFlags") = 3
                AdminACE("AceType") = 0
                AdminACE("Trustee") = Trustee


                Dim secDescriptor As ManagementObject = New ManagementClass(New ManagementPath("Win32_SecurityDescriptor"), Nothing)

                secDescriptor("ControlFlags") = 4
                secDescriptor("DACL") = New Object() {AdminACE}


                'Injecte le nouveau security descriptor à l'objet 
                objItem.InvokeMethod("SetSecurityDescriptor", secDescriptor, Nothing)

            End If
        Next

     


        Return True


    End Function



le code retourne aucune erreur mais n'est pas fonctionnel ...

Si quelqu'un a une idée je suis preneur .
0
Rejoignez-nous