Erstellen einer Freigabe mit Berechtigungen mit Windows Powershell

9

Wie kann ich mit Powershell eine Freigabe erstellen und Zugriffsberechtigungen festlegen?

Zum Beispiel wie folgt

  • Erstellen Sie eine Freigabe mit dem Namen "public", die dem "Pfad c: \ shared \ foo" zugeordnet ist.
  • Ermöglichen Sie DOMAIN1 \ Users den schreibgeschützten Zugriff auf die Freigabe (dies bedeutet nicht, dass acls für die Dateien, sondern für die Freigabe festgelegt wird).
user2666
quelle

Antworten:

7

Dies sollte den Trick tun:

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

Natürlich müssen Sie PowerShell mit Administratorrechten starten, je nachdem, wo / wie Sie dies tun.

Matt Hanson
quelle
7

Verwenden Sie die Win32_Share Create-Methode. Beispiel:

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

Die Dokumentation dieser Methode finden Sie hier auf 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
);

Parameter:

  • Pfad - Lokaler Pfad der Windows-Freigabe. Zum Beispiel "C: \ FolderToShare".
  • Name - Übergibt den Alias ​​an einen Pfad, der als Freigabe auf einem Windows-System eingerichtet ist. Beispiel "ShareName".
  • Typ - Übergibt den Typ der gemeinsam genutzten Ressource. Zu den Typen gehören Festplatten, Druckwarteschlangen, Interprozesskommunikation (IPC) und allgemeine Geräte. Kann einer der folgenden Werte sein.
    • 0 - Festplattenlaufwerk
    • 1 - Druckwarteschlange
    • 2 - Gerät
    • 3 - IPC
    • 2147483648 - Festplattenadministrator
    • 2147483649 - Print Queue Admin
    • 2147483650 - Geräteadministrator
    • 2147483651 - IPC-Administrator
  • MaximumAllowed - Begrenzt die maximale Anzahl von Benutzern, die diese Ressource gleichzeitig verwenden dürfen. Beispiel: 100. Dieser Parameter ist optional.
  • Beschreibung - Optionaler Kommentar zur Beschreibung der gemeinsam genutzten Ressource. Dieser Parameter ist optional. Beispiel: "Freigabebeschreibung".
  • Kennwort - Kennwort (wenn der Server mit Sicherheit auf Freigabeebene ausgeführt wird) für die freigegebene Ressource. Wenn der Server mit Sicherheit auf Benutzerebene ausgeführt wird, wird dieser Parameter ignoriert. Dieser Parameter ist optional.
  • Zugriff - Sicherheitsbeschreibung für Berechtigungen auf Benutzerebene. Eine Sicherheitsbeschreibung enthält Informationen zu den Berechtigungen, dem Eigentümer und den Zugriffsfunktionen der Ressource.

Auf dieser Seite in MSDN finden Sie Einzelheiten zum Festlegen von Zugriffsberechtigungen: Win32_SecurityDescriptor-Klasse . Dieser Artikel ist auch ein guter Ausgangspunkt: WMI-Aufgaben: Dateien und Ordner .

splattne
quelle
2

Die folgende Funktion ist ein Beispiel und kann an alle Anforderungen angepasst werden. Die Haupteinschränkung besteht darin, dass es auf dem Computer ausgeführt werden muss, auf dem die Freigabe gehostet werden soll (oder möglicherweise PS Remoting verwendet, um diesen Computer zuerst zu erreichen). Das Konto, auf dem das Skript ausgeführt wird, muss außerdem über ausreichende Berechtigungen zum Erstellen von Freigaben verfügen.

Wie geschrieben erwartet es ein DirectoryInfoObjekt als Argument, aber es wäre nicht schwer, es für Zeichenfolgen anzupassen. Das Beispiel enthält Berechtigungen für den Ordner für zwei verschiedene Objekte (einen Benutzer und eine Gruppe) mit jeweils unterschiedlichen Zugriffsarten, sodass Sie sehen können, wie komplexe Berechtigungsanforderungen gemischt und abgeglichen werden:

# $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
quelle
Vollständige Offenlegung: Ich habe den folgenden Code aus einem an anderer Stelle gefundenen Beitrag angepasst (leider ist mein PC abgestürzt und ich habe den Link verloren, sodass ich ihn nicht richtig zuordnen kann). Ich erinnere mich, dass diese Serverfehlerfrage bei meiner Suche höher eingestuft wurde, und deshalb wollte ich mein Ergebnis hier einfügen.
Joel Coel
Vielen Dank für Ihr Skript, aber ich versuche, es in einem entfernten Ordner zum Freigeben zum Laufen zu bringen. Der Ordner befindet sich auf einem NAS ohne Benutzeroberfläche zum Ausführen eines Powershell-Skripts. Hattest du eine Ahnung, wie es in einem entfernten Ordner funktioniert?
@Badpandy, wo wir dies verwenden, muss ich zum Host-Computer rdp, um das Skript zu verwenden, da es zwei Berechtigungsstufen gibt: Berechtigungen für die Freigabe und Berechtigungen für das lokale Dateisystem sind getrennt, und ich weiß nur, wie Berechtigungen festgelegt werden auf dem lokalen Dateisystem, wenn es auf dem lokalen Computer ausgeführt wird.
Joel Coel
0

Versuchen Sie für Windows 7 Folgendes:

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

Oben funktioniert auch von PowerShell. Beachten Sie `vor, VOLL

Frank Prepsel
quelle