Question partager un dossier avec les droits qui vont bien

Plus d'informations
il y a 16 ans 1 mois #1733 par Laurent Dardenne
Julien écrit:

Mais voila j'ai toujours du mal pour donner le contrôle total(par défaut à tout le monde) au dossier partager.

Oui car le paramètre le plus important dans ton cas n'est pas renseigné dans ces exemple.

J'essaie de te proposer qq chose d'exploitable.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 mois #1734 par Laurent Dardenne
Pour le moment c'est en deux parties, la création :
[code:1]
# Win32_Share. Create-Method Template Script\"
# Created by PowerShell WmiExplorer
# /\/\o\/\/ 2006
# www.ThePowerShellGuy.com
#
# Fill InParams values before Executing
# InParams that are Remarked (#) are Optional

$Computer = \".\"
$Class = \"Win32_Share\"
$Method = \"Create\"

$MC = [WmiClass]\"\\$Computer\ROOT\CIMV2:$Class\"

$InParams = $mc.psbase.GetMethodParameters($Method)

$InParams.Access = $null
$InParams.Description = 'PowerShell'
$InParams.MaximumAllowed = $null
$InParams.Name = [string]'Test'
$InParams.Password = $null
$InParams.Path = 'C:\Temp'
$InParams.Type = [uint32]0

\"Calling Win32_Share. : Create with Parameters :\"
$inparams.PSBase.properties | select name,Value | format-Table

$R = $mc.PSBase.InvokeMethod($Method, $inParams, $Null)
\"Result :\"
$R | Format-list
[/code:1]
la seconde la modification :
[code:1]
# Set-ShareInfo.ps1
# Sets the security of a Share
# /\/\o\/\/ 2005
# mow001.blogspot.com/2005/11/replace-secu...-existing-share.html

# get the needed WMI Classes

$sd = new-object system.management.managementclass Win32_SecurityDescriptor
$ace = new-object system.management.managementclass Win32_ace
$Trustee = new-object system.management.managementclass win32_trustee

# Make AccessMask

# this are the values, With Change and Read (you need to add Synchronize Also if using the FileSystemRights)
# (so maybe better to just use the list of Integers,I leave the FileSystemRights in for reference).

# 2032127 \"Full\"
# 1245631 \"Change\"
# 1179817 \"Read\"

$mode = \"Change\"
switch ($mode) {
\"Full\" {$AM = ([System.Security.AccessControl.FileSystemRights]\"FullControl\"«»).Value__}
\"Read\" {$AM = ([System.Security.AccessControl.FileSystemRights]\"ReadAndExecute\"«»).Value__ + ([System.Security.AccessControl.FileSystemRights]\"Synchronize\"«»).Value__}
\"Change\" {$AM = ([System.Security.AccessControl.FileSystemRights]\"Modify\"«»).Value__ + ([System.Security.AccessControl.FileSystemRights]\"Synchronize\"«»).Value__}
}

# Make the Trustee

#$Trustee.Domain = $Null ** Par Défaut à null
#$Trustee.Name = \"Everyone\" ** Windows US
#$Trustee.Name = \"Tout le monde\" ** Windows Français
$Trustee.PSbase.get_Properties().set_Value(\"Tout le monde\"«»)

#Still looking for A way to get this from text SID (setting SIDstring will not work)
# the SID has a function but I don't know how to do a ByRef in PS
# $sid.GetBinaryForm($global:ba,0), for now do it by hand.
#$Trustee.SID = @(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
$Trustee.PSbase.get_Properties().set_Value(@(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0))


#$ace.AccessMask = $AM
$ace.PSbase.get_Properties().set_Value($AM)

# AceType Value Meaning
# 0 Access Allowed
# 1 Access Denied
# 2 Audit

#$ace.AceType = 0
#$ace.AceFlags = 3
#$ace.trustee = $trustee.PSobject.baseobject
$ace.PSbase.get_Properties().set_Value(0)
$ace.PSbase.get_Properties().set_Value(3)
$ace.PSbase.get_Properties().set_Value($trustee.CreateInstance())

# add the ACE(s) to the DACL

#$SD.DACL = @($ACE.PSobject.baseobject)
$SD.PSbase.get_Properties().set_Value( [System.Management.ManagementObject[]] $ace.CreateInstance())

#get the Share

$share = get-wmiObject win32_share -filter \"name='Test'\"
$inparams = $share.PSbase.GetMethodParameters(\"SetShareInfo\"«»)

#set parameters

#$inParams[\"Description\"] = \"TestMAJ\"
$inParams[\"Access\"] = $SD.PSobject.baseobject

#Write back

$share.Psbase.invokemethod(\"SetShareInfo\",$inparams,$null)
[/code:1]
Par contre cette approche écrase les droits existants.

Il reste encore à faire mais pour le moment ça tourne.
Les scripts d'origines ont été conçus sous Monad il fallait donc les adapter légérement (le second surtout).

Il reste une approche + simple pour manipuler une classe WMI mais le script en question pose qq problèmes :
www.dotnetframework.de/lserver/CodeSampleDetails.aspx?c=4983

A suivre...
:P

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 mois #1736 par Arnaud Petitjean
Bonjour à tous,

Quand ça devient trop compliqué de faire des choses simples, il ne faut surtout pas hésiter à s'appuyer sur des outils externes.
Le scripting est avant tout un moyen de gagner du temps, donc certaines fois il ne faut pas avoir peur d'aller à l'essentiel parfois au détriment du code. Tout le monde ne partage peut être pas cette approche, mais c'est mon opinion ainsi que celle de certains membres de l'équipe de dev de PowerShell.

Pour revenir à ton script, comme le faisait remarquer Batchman, je te conseille pour positionner tes ACLs d'utiliser l'utilitaire SubinACL.exe .

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 mois #1743 par Laurent Dardenne
Salut,
Arnaud écrit:

Quand ça devient trop compliqué de faire des choses simples,

Le besoin est simple, ensuite c'est la mise en oeuvre qui s'avére légérement complexe (et nécessite pas mal de code) car dans ce cas on aborde un domaine que les concepteurs de PS n'ont pas facilité.

Le scripting est avant tout un moyen de gagner du temps,

Je suis d'accord avec toi mais étant curieux et tenace ce type de problème me permet d'approfondir PS. Rien n'empêche une fois compris le principe de le coder dans un cmdlet, du coup la complexité est masquée.
Le problème se transformant en : \"Peut on faire confiance à ce cmdlet?\"
Et puis parfois il faut savoir perdre un peu de temps pour en gagner ;-)

je te conseille pour positionner tes ACLs d'utiliser l'utilitaire SubinACL.exe

Pas mieux, ne serait-ce que pour rassurer et faciliter le travail de la maintenance.

Je proposerais une nouvelle version dés que j'ai un peu de temps...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 mois #1749 par Arnaud Petitjean

Et puis parfois il faut savoir perdre un peu de temps pour en gagner


Tout à fait d'accord ;) Mais ce n'est pas toujours possible...

je te conseille pour positionner tes ACLs d'utiliser l'utilitaire SubinACL.exe

Pas mieux, ne serait-ce que pour rassurer et faciliter le travail de la maintenance.


Subinacl est très bien pour les problèmes complexes. Mais Xcacls.exe est bien plus simple à manier.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 mois #1775 par Lemoine
Bonsoir à tous.

Désolé de remettre le couvert si tardivement mais entre temps j'ai du régler des problème plus important...

Alors Xcacls.exe à l'air de très bien fonctionner mais j'ai un peut de mal avec la syntaxe.

Le but étant (après avoir partagé le dossier toto qui est chose faite) d'attribuer le contrôle total à \"tout le monde.
Pour se faire j'execute la ligne suivante
[code:1]
PS C:\> xcacls C:\toto /g users:F
ERROR: Le mappage entre les noms de compte et les ID de sécurité n'a pas été effectué.
[/code:1]

Je ne comprends pas alors si quelqu'un à une idée...;)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.075 secondes
Propulsé par Kunena