Création d'un partage avec des autorisations avec Windows Powershell

9

À l'aide de Powershell, comment puis-je créer un partage et définir des autorisations d'accès.

Par exemple, comme suit

  • Créez un partage appelé "public" qui correspond au "chemin c: \ share \ foo"
  • Autoriser DOMAIN1 \ Users à avoir un accès en lecture seule au partage (cela ne signifie pas définir acls sur les fichiers, mais plutôt sur le partage)
user2666
la source

Réponses:

7

Cela devrait faire l'affaire:

net share "Public=c:\shares\foo" "/GRANT:Users,READ"

Bien sûr, vous devrez lancer PowerShell avec des droits administratifs, selon où / comment vous faites cela.

Matt Hanson
la source
7

Utilisez la méthode Win32_Share Create. Exemple:

(Get-WmiObject -List -ComputerName . | Where-Object -FilterScript 
{$_.Name -eq "Win32_Share"}).InvokeMethod("Create",
   ("C:\FolderToShare","ShareName",0,100,"Share description"))

Vous pouvez trouver la documentation de cette méthode ici sur MSDN .

uint32 Create(
  [in]  string Path,
  [in]  string Name,
  [in]  uint32 Type,
  [in]  uint32 MaximumAllowed,
  [in]  string Description,
  [in]  string Password,
  [in]  Win32_SecurityDescriptor Access
);

Paramètres:

  • Chemin - Chemin local du partage Windows. Par exemple, "C: \ FolderToShare".
  • Nom - Transmet l'alias à un chemin d'accès configuré en tant que partage sur un système Windows. Exemple, "ShareName".
  • Type - Transmet le type de ressource partagée. Les types incluent les unités de disque, les files d'attente d'impression, les communications interprocessus (IPC) et les périphériques généraux. Peut être l'une des valeurs suivantes.
    • 0 - Lecteur de disque
    • 1 - File d'attente d'impression
    • 2 - Appareil
    • 3 - IPC
    • 2147483648 - Administrateur de lecteur de disque
    • 2147483649 - Administrateur de file d'attente d'impression
    • 2147483650 - Administrateur de périphériques
    • 2147483651 - Administrateur IPC
  • MaximumAllowed - Limite le nombre maximal d'utilisateurs autorisés à utiliser simultanément cette ressource. Exemple: 100. Ce paramètre est facultatif.
  • Description - Commentaire facultatif pour décrire la ressource partagée. Ce paramètre est facultatif. Exemple: "Partager la description".
  • Mot de passe - Mot de passe (lorsque le serveur fonctionne avec une sécurité au niveau du partage) pour la ressource partagée. Si le serveur s'exécute avec une sécurité de niveau utilisateur, ce paramètre est ignoré. Ce paramètre est facultatif.
  • Accès - Descripteur de sécurité pour les autorisations de niveau utilisateur. Un descripteur de sécurité contient des informations sur les autorisations, le propriétaire et les capacités d'accès de la ressource.

Consultez cette page sur MSDN pour plus de détails sur la définition des autorisations d'accès: Classe Win32_SecurityDescriptor . Cet article est également un bon point de départ: Tâches WMI: fichiers et dossiers .

splattne
la source
2

La fonction ci-dessous est un exemple et peut être adaptée à tout ce dont vous avez besoin. La principale restriction est qu'il doit être exécuté sur la machine sur laquelle le partage doit être hébergé (ou peut-être utiliser PS Remoting pour atteindre cette machine en premier). Le compte exécutant le script doit également disposer des autorisations suffisantes pour créer des partages.

Tel qu'il est écrit, il attend un DirectoryInfoobjet comme argument, mais il ne serait pas difficile de l'adapter aux chaînes. L'exemple inclut des autorisations sur le dossier pour deux objets différents (un utilisateur et un groupe), chacun avec différents types d'accès, afin que vous puissiez voir comment mélanger et assortir pour des exigences d'autorisation complexes:

# $folder is a DirectoryInfo object
Function Create-FileShare($folder)
{
    $name = $folder.Name
    $path = $folder.FullName
    $description = "$name"
    $domain = "example.com" #AD Domain name here (Optional/Not really used/Here for completeness)

    $Method = "Create"
    $sd = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()

    #AccessMasks:
    #2032127 = Full Control
    #1245631 = Change
    #1179817 = Read

    #Share with the user
    $ACE = ([WMIClass] "Win32_ACE").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $Trustee.Name = $name
    $Trustee.Domain = $Null
    #original example assigned this, but I found it worked better if I left it empty
    #$Trustee.SID = ([wmi]"win32_userAccount.Domain='$domain',Name='$name'").sid    
    $ace.AccessMask = 1245631 
    $ace.AceFlags = 3 #Should almost always be three. Really. don't change it.
    $ace.AceType = 0 # 0 = allow, 1 = deny
    $ACE.Trustee = $Trustee 
    $sd.DACL += $ACE.psObject.baseobject 

    #Share with Domain Admins
    $ACE = ([WMIClass] "Win32_ACE").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $Trustee.Name = "Domain Admins"
    $Trustee.Domain = $Null
    #$Trustee.SID = ([wmi]"win32_userAccount.Domain='$domain',Name='$name'").sid    
    $ace.AccessMask = 2032127
    $ace.AceFlags = 3
    $ace.AceType = 0
    $ACE.Trustee = $Trustee 
    $sd.DACL += $ACE.psObject.baseobject        

    $mc = [WmiClass]"Win32_Share"
    $InParams = $mc.psbase.GetMethodParameters($Method)
    $InParams.Access = $sd
    $InParams.Description = $description
    $InParams.MaximumAllowed = $Null
    $InParams.Name = $name
    $InParams.Password = $Null
    $InParams.Path = $path
    $InParams.Type = [uint32]0

    $R = $mc.PSBase.InvokeMethod($Method, $InParams, $Null)
    switch ($($R.ReturnValue))
     {
          0 {Write-Host "Share:$name Path:$path Result:Success"; break}
          2 {Write-Host "Share:$name Path:$path Result:Access Denied" -foregroundcolor red -backgroundcolor yellow;break}
          8 {Write-Host "Share:$name Path:$path Result:Unknown Failure" -foregroundcolor red -backgroundcolor yellow;break}
          9 {Write-Host "Share:$name Path:$path Result:Invalid Name" -foregroundcolor red -backgroundcolor yellow;break}
          10 {Write-Host "Share:$name Path:$path Result:Invalid Level" -foregroundcolor red -backgroundcolor yellow;break}
          21 {Write-Host "Share:$name Path:$path Result:Invalid Parameter" -foregroundcolor red -backgroundcolor yellow;break}
          22 {Write-Host "Share:$name Path:$path Result:Duplicate Share" -foregroundcolor red -backgroundcolor yellow;break}
          23 {Write-Host "Share:$name Path:$path Result:Reedirected Path" -foregroundcolor red -backgroundcolor yellow;break}
          24 {Write-Host "Share:$name Path:$path Result:Unknown Device or Directory" -foregroundcolor red -backgroundcolor yellow;break}
          25 {Write-Host "Share:$name Path:$path Result:Network Name Not Found" -foregroundcolor red -backgroundcolor yellow;break}
          default {Write-Host "Share:$name Path:$path Result:*** Unknown Error ***" -foregroundcolor red -backgroundcolor yellow;break}
     }
}
Joel Coel
la source
Divulgation complète: j'ai adapté le code suivant à partir d'un article trouvé ailleurs (malheureusement, mon PC s'est écrasé et j'ai perdu le lien, donc je ne peux pas l'attribuer correctement). Je me souviens que cette question de défaut de serveur était mieux classée dans ma recherche, et je voulais donc inclure mon résultat ici.
Joel Coel
Merci pour votre script, mais j'essaie de le faire fonctionner sur un dossier distant à partager. Le dossier se trouve sur un NAS, sans interface utilisateur pour exécuter un script PowerShell. Avez-vous eu un indice pour le faire fonctionner sur un dossier distant?
@Badpandy où nous utilisons cela, je dois rdp sur la machine hôte pour utiliser le script, car il y a deux niveaux d'autorisations: les autorisations sur le partage et les autorisations sur le système de fichiers local sont séparées, et je sais seulement comment définir les autorisations sur le système de fichiers local lors de l'exécution sur la machine locale.
Joel Coel
0

Pour Windows 7, essayez ceci:

net SHARE share=d:\share /GRANT:EVERYONE`,FULL /REMARK:"

Ci-dessus fonctionne également à partir de PowerShell. Remarque `avant, COMPLET

Frank Prepsel
la source