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


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

Par exemple comme suit

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

8
2018-05-16 23:54


origine




Réponses:


Cela devrait faire l'affaire:

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

Bien entendu, vous devrez lancer PowerShell avec des droits d’administrateur, en fonction de votre lieu de réalisation.


7
2018-05-17 07:06





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:

  • Path - Chemin local du partage Windows. Par exemple, "C: \ FolderToShare".
  • Nom - Transmet l'alias à un chemin d'accès défini comme partage sur un système Windows. Exemple, "ShareName".
  • Type - Transmet le type de ressource partagée. Les types incluent les lecteurs 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 disque
    • 2147483649 - Administrateur de la file d'impression
    • 2147483650 - Administrateur de périphérique
    • 2147483651 - Admin IPC
  • MaximumAllowed - Limite du nombre maximum d'utilisateurs autorisés à utiliser simultanément cette ressource. Exemple: 100. Ce paramètre est facultatif.
  • Description - Commentaire facultatif décrivant la ressource partagée. Ce paramètre est optionnel. Exemple: "Description du partage".
  • Mot de passe - Mot de passe (lorsque le serveur s'exécute avec une sécurité au niveau du partage) pour la ressource partagée. Si le serveur s'exécute avec une sécurité au niveau utilisateur, ce paramètre est ignoré. Ce paramètre est optionnel.
  • 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.

Voir cette page sur MSDN pour plus d'informations 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.


7
2018-05-17 09:45





La fonction ci-dessous est un exemple et peut être adaptée à vos besoins. Tel qu'écrit, il attend un objet DirectoryInfo en tant qu'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 combiner et faire correspondre 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}
     }
}

Le script doit être exécuté en tant qu'administrateur sur la machine sur laquelle les partages sont hébergés.


1
2018-06-19 18:54



Divulgation complète: j'ai adapté le code suivant à partir d'un article trouvé ailleurs (malheureusement, mon PC est tombé en panne et j'ai perdu le lien, je ne peux donc pas l'attribuer correctement). Je me souviens que cette question de serverfault é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 est sur un NAS, sans aucune interface utilisateur pour exécuter un script PowerShell. Aviez-vous un indice pour le faire fonctionner sur un dossier distant?
@Badpandy où nous l'utilisons, je dois utiliser le script sur la machine hôte pour utiliser le script, car il existe 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 des autorisations. sur le système de fichiers local lors de l'exécution sur la machine locale. - Joel Coel


Ce fil, en commençant par la deuxième réponse, a quelques exemples de script pour accomplir cela.


0
2018-05-17 01:03



Cela couvre les autorisations ntfs. Les autorisations de partage sont séparées. - Joel Coel