vendredi 6 décembre 2013

Les partages Windows.

Nous allons voir dans cet article comment créer, modifier, et supprimer un partage. Pour réaliser cela je vais utiliser les classes Win32_Share. Pour commencer je vais faire l'inventaire des partages. 


# Lister les partages.
$computer = "."
$shares = Get-WmiObject Win32_Share -Computer $computer
foreach($share in $shares)
  {
    Write-Host $share.name
  }

#Fin.


Maintenant que nous avons l'inventaire, nous allons voir commet créer un partage. Il existe différents types de partages :
- 0 = Dossier,
- 1 = Imprimante,
- 3 = IPC,
- 2147483648 = Administratif.
Tout d'abord je vais créer un partage "administratif". Ce type de partage est simple a créé. Je l'utilise souvent dans mes scripts comme partage temporaire.


#Créer un partage administratif.
$partage = "test"
$dossier = "c:\temp"
$wmiShares = [WMICLASS] "WIN32_Share"
$wmiShares.Create($dossier,$partage,2147483648)

#Fin.


[Edit : Modification à partir de Windows 2008]
Si l'exemple ci dessus permet un accès "Contrôle totale" aux membres du groupe "Administrateurs" sous Windows 2003. Malheureusement ceci n'est plus vrai à partir de Windows 2008 ou seul le droit "Lecture" est accordé par défaut. Pour contourner cette limitation voici la solution :


#Je déclare une règle de sécurité contenant le droit "Administrateurs -> Contrôle totale". $trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
$trustee.Domain = $Null
$trustee.Name = "Administrateurs"
$trustee.SID = @(1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0,32,2,0,0)
$ace = ([WMIClass] "Win32_ACE").CreateInstance()
$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"FullControl, Synchronize"
$ace.AceFlags = 3 #Laisser à 3 pour les partages.
$ace.AceType = 0 #0=accès autoriser, 1=accès interdit.
$ace.Trustee = $trustee
$sd = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
$sd.ControlFlags = 4
$sd.DACL = $ace

#Créer un partage administratif.
$partage = "test"
$dossier = "c:\temp"
$wmiShares = [WMICLASS] "WIN32_Share"
$wmiShares.Create($dossier,$partage,2147483648,$Null,"Administration à distance",$Null,$sd)

#Fin.


Jusqu'ici je n'ai pas trop à m'occuper des droits sur le partage. Du coup quatre lignes suffissent. Mais si nous voulons créer des partages accessibles aux utilisateurs, nous allons devoir procéder autrement. L'exemple suivant montre la création d'un partage utilisateur. Le compte "Tout le monde" est ajouté à la sécurité du partage pour que les utilisateurs puissent y accéder.


#Ajouter un partage utilisateur.
$partage = "test"
$dossier = "c:\temp"
$desc = "Description"

#Droit d'accès aux utilisateurs.
$trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
$trustee.Domain = $Null
$trustee.Name = "Tout le monde"
$Trustee.SID = @(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)   #ID du compte "Tout le monde".
$ace = ([WMIClass] "Win32_ACE").CreateInstance()
$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"FullControl, Synchronize"

#$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"Modify, Synchronize"
#$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"ReadAndExecute, Synchronize"
$ace.AceFlags = 3    #Laisser à 3 pour les partages.
$ace.AceType = 0     #0=accès autoriser, 1=accès interdit.
$ace.Trustee = $trustee
$sd  = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
$sd.ControlFlags = 4
$sd.DACL = $ace

#Partage.
$wmiShares = [WMICLASS] "WIN32_Share"
$wmiShares.Create($dossier,$partage,0,$Null,$desc,$Null,$sd)

#Fin.


J'utilise volontairement le compte "Tout le monde" en full contrôle pour la bonne et simple raison que gérer l'accès aux fichiers via la sécurité du partage est une hérésie. La sécurité des partages étant limitée et peu sécurisée, les droits doivent toujours être positionnés sur le dossier lui même.

Mais comme je sens l'hérétique qui est en toi, je vais te montrer comment modifier un partage utilisateur pour que MrX puissent y accéder en modification.


#Modifier un partage utilisateur.
$partage = "test"
$desc = "Nouvelle description"
$user = "MrX"
$domain = "MonDomaine"

#Droit d'accès des utilisateurs.
$adsi = [ADSI] ("WinNT://" + $domain + "/" + $user)
$trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
$trustee.Domain = $domain
$trustee.Name = $user
$trustee.SID = $adsi.Get("ObjectSID")
$ace = ([WMIClass] "Win32_ACE").CreateInstance()

#$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"FullControl, Synchronize"
$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"Modify, Synchronize"

#$ace.AccessMask = [int][System.Security.AccessControl.FileSystemRights]"ReadAndExecute, Synchronize"
$ace.AceFlags = 3    #Laisser à 3 pour les partages.
$ace.AceType = 0     #0=accès autoriser, 1=accès interdit.
$ace.Trustee = $trustee
$sd  = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
$sd.ControlFlags = 4
$sd.DACL = $ace

#Modifier le partage.
$wmiShares = Get-WmiObject Win32_Share -ComputerName . -Filter "Name='$partage'"
$wmiShares.SetShareInfo($Null,$desc,$sd)

#Fin.


Notez que "MrX" a écrasé "Tout le monde". Pour ajouter plusieurs utilisateurs, créez une "ace" par utilisateur ($ace1,$ace2,$ace3) puis ajoutez les de la façon suivante :
$sd.DACL = $ace1
$sd.DACL += $ace2
$sd.DACL += $ace3

Maintenant que nous avons créé des partages un peu partout, il est temps de faire le ménage. Nous allons supprimer notre partage de test.


#Supprimer un partage.
$partage = "test"
Get-WmiObject -Class Win32_Share -Filter ("Name='" + $partage + "'") | Remove-WmiObject

#Fin.


C'est tout pour aujourd'hui.