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

Partage en VBS

4 réponses
Avatar
moi
Bonjour,

Je souhaite en VBS
- créer un partage ( sur serveur 2k3)
- ne pas limiter le nombre des connexions.
- mettre contrôle total à "Tout le monde" ( propriété du Partage)
- donner à "Ordinateurs du Domaine"
le droit de lire et parcourir
(Onglet sécurité)

J'ai donc parcouru le vaste Web et j'ai commencé à écrire mais
certains points essentiels ne trouvent pas de réponse ...

Voici ci dessous le début de mon "travail"
avec quelques commentaires incorporés

Merci d'avance pour vos idées

amicalement,

HB

=================================================
Const Type = 0
Const MaxConnect = 0
' est ce ainsi que l'on force AllowMaximum à true ???
' voir autre tentative plus bas ...

Const Chemin = "D:\OrdisDom"

' Bien sûr ce répertoire aura été créé
' par un p'tit coup de FSO.CreateFolder

Const NomPartage = "OrdisDom"
Const Description = "Pour Ordis du Dom."

Const DescripteurAcces = ??????
' Deuxième grosse question ...
' Mettre Ctrl Total à Tout le monde


Set ObjWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")

Set ObjShares = ObjWMI.Get("Win32_Share")

Retour = ObjShares.Create (Chemin, NomPartage, Type, _
MaxConnect, Description, ,_
DescripteurAcces)

' L'argument non utilisé est "password" car cela ne sert pas (?)


If Retour <> 0 then
' y'a eu un PB
End if

' Pour ne pas limiter le nombre des connexions
' mais il me semble que AllowMaximum
' est en lecteure seule ...

Requete = "SELECT * FROM Win32_Share _
WHERE Name = '" & NomPartage & "'"

Set LesPartages = objWMIService.ExecQuery(Requete)

' Collection avec un unique élément



For Each ObjPartage in LesPartages

' ObjPartage devrait donc être le partage créé au dessus.

ObjPartage.AllowMaximum = True
Next

' pb des ACL ...
' Je suis rarement sûr de moi
' avec les histoires de guillemets ...

' Cela pourrait être qqchose comme

Commande = "CACLS " & Chemin _
& " /E " _
& "/G ""Ordinateurs du domaine"":R"

Retour = objShell.Run( _
"%COMSPEC% /c Echo Y| " & Commande, 2, True)

If Retour <> 0 then
' y'a eu un PB
End if

==================================================

4 réponses

Avatar
Méta-MCI \(MVP\)
Bonsoir !

En invite de commande :
NET SHARE pour les partages.
CACLS pour les droits. Et, dans le kit de ressource SUBINACL est plus
complet (bien prendre la dernière version, les premières étant boguées).

@-salutations

Michel Claveau
Avatar
moi
Méta-MCI (MVP) wrote:
Bonsoir !

En invite de commande :
NET SHARE pour les partages.
CACLS pour les droits. Et, dans le kit de ressource SUBINACL est
plus complet (bien prendre la dernière version, les premières étant
boguées).
trop tard ;o)


J'ai trouvé les infos qui me manquaient...
Les tests semblent concluants.

Cela donne en gros le script ci-dessous

Bien cordialement,

HB

================================================= ================================================= Dim Set Services,DescDeSec, ClasSec, PourQui
Dim ACE, InParam, Cher
Dim FSO, ObjShell
Dim CheminPartage, NomPartage, Description

CheminPartage = "D:OrdisDom"
NomPartage = "OrdisDom"
Description = "Pour Ordis du Dom."

' ================================== ' Nouveau répertoire
' ==================================
Set FSO = CreateObject("Scripting.FileSystemObject")
If not FSO.FolderExists(CheminPartage) then
FSO.CreateFolfer(CheminPartage)
End If
Set FSO = Nothing

' ================================== ' Grosse cavalerie : WMI ...
' ==================================
Set Services = GetObject( _
"WINMGMTS:" _
& "{impersonationLevel=impersonate,(Security)}!" _
& ".ROOTCIMV2")

' ================================== ' Prépare un Descripteur De Securité
' ==================================
Set ClasSec = Services.Get("Win32_SecurityDescriptor")
Set DescDeSec = ClasSec.SpawnInstance_()

' Qui est concerné
Set PourQui = _
Services.Get("Win32_Trustee").SpawnInstance_

PourQui.Domain = Null
PourQui.Name = "TOUT LE MONDE"
PourQui.Properties_.Item("SID") = _
Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)

Set ACE = Services.Get("Win32_Ace").SpawnInstance_

' Contrôle Total
ACE.Properties_.Item("AccessMask") = 2032127

' héritage aux objets et conteneurs
ACE.Properties_.Item("AceFlags") = 3

ACE.Properties_.Item("AceType") = 0

' Qui est concerné : Défini plus haut
ACE.Properties_.Item("Trustee") = PourQui

' puisque DACL est défini ...
DescDeSec.Properties_.Item("ControlFlags") = 4

' fin de la préparation du descripteur de sécurité
DescDeSec.Properties_.Item("DACL") = Array(ACE)

' ================================== ' Création du Partage (enfin)
' ================================== Set Cher = Services.Get("Win32_Share")

Set InParam = _
Cher.Methods_("Create").InParameters.SpawnInstance_()

InParam.Properties_.Item("Access") = DescDeSec
InParam.Properties_.Item("Description") = Description
InParam.Properties_.Item("Name") = NomPartage
InParam.Properties_.Item("Path") = CheminPartage

' Type de partage : Répertoire ou fichier
InParam.Properties_.Item("Type") = 0

On error Resume next
Cher.ExecMethod_ "Create", InParam

If err<>0 then
Msgbox "Echec de la création du partage"
End if
On error Goto 0

Set Services = Nothing
Set DescDeSec = Nothing
Set ClasSec = Nothing
Set PourQui = Nothing
Set ACE = Nothing
Set InParam = = Nothing
set Cher = Nothing

' ================================== ' infos dans onglet Sécurité ...
' ================================== Set ObjShell = WScript.CreateObject ("WSCript.shell")

Commande = "CACLS " & CheminPartage _
& " /E " _
& "/G ""Ordinateurs du domaine"":R"

Retour = objShell.Run( _
"%COMSPEC% /c Echo Y| " & Commande, 2, True)

If Retour <> 0 then
Msgbox "Problème pour CACLS"
End if

Set ObjShell = Nothing
================================================= ==================================================

Avatar
MCI \(ex do ré Mi chel la si do\) [MVP]
Re !

Ça a l'air d'une bonne grosse soupe, avec plein de bons morceaux (VBS,
FSO, WMI, WShell, CACLS, ...)
Mais, perso, j'aime bien les bonnes soupes. Et puis, c'est typique de
Windows, ce genre de possibilités de mixage.

@+

Michel Claveau
Avatar
moi
Gilles LAURENT [MVP] wrote:
Depuis Windows XP SP1,
(...)


bonsoir et merci pour tant de détails.

Si j'ai finalement opté pour une soupe
de légumes bien nourrisante ( comme le dit méta-MCI)
c'est effectivement que les comportements
pas défaut ne m'ont pas semblés assez sûrs
en ce qui concerne les autorisations sur le partage.
J'ai donc pris le taureau WMI par les cornes
pour "construire" un descripteur de sécurité.

J'avais vu que la création d'un partage "à la main"
ou avec net share mettait "Tout le monde" en lecture
et j'en ai déduis que ce que j'avais lu par ailleurs
sur le site "msdn2 etc" était vrai ;o)

En revanche, pour le nombre max de connexions,
le comportement pas défaut est clair.
( Heureusement puisque la variable booleenne
est en lecture seule ;o)

Ce fut pour moi un "bon petit exo"
pour boire une goute d'eau de l'océan WMI...

En revanche, pour poser les ACL,
comme je n'avais pas besoin de valeurs sophistiquées
CACLS m'a semblé plus "simple" ... que WMI ...

voili voulou,

merci à vous de vous être penchés sur cette affaire,

A+

HB