Comment changer la sécurité sur une imprimante local/distante ?
Flow8002
Messages postés21Date d'inscriptionmardi 6 novembre 2007StatutMembreDernière intervention21 novembre 2012
-
21 nov. 2012 à 12:11
Flow8002
Messages postés21Date d'inscriptionmardi 6 novembre 2007StatutMembreDernière intervention21 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 .
@+
A voir également:
Comment changer la sécurité sur une imprimante local/distante ?
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 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
Flow8002
Messages postés21Date d'inscriptionmardi 6 novembre 2007StatutMembreDernière intervention21 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 ...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 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
Flow8002
Messages postés21Date d'inscriptionmardi 6 novembre 2007StatutMembreDernière intervention21 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 ...