Sie sind hier: Startseite
 Liste aller Codebeispiele

Dateisystemfreigabe anlegen (mit Berechtigungen)

Ein Beispiel zum Einsatz der Klasse System.Management.ManagementObject aus der .NET-Klassenbibliothek.

Autor: Dr. Holger Schwichtenberg

Beschreibung

Um beim Anlegen einer Dateisystemfreigabe die Zugriffsrechte zu setzen, sind folgende Schritte zusätzlich notwendig:
  • Ermitteln des Security Identifiers für jeden Benutzer/jede Gruppe, die Rechte erhalten soll
  • Erstellen einer Instanz von Win32Trustee für jeden Benutzer/jede Gruppe, die Rechte erhalten soll
  • Instanziieren der Klasse Win32_ACE für jeden Rechteeintrag
  • Befüllen von Win32_ACE mit dem Win32_Trustee-Objekt, den Rechten und den Rechteeigenschaften
  • Erstellen einer Instanz von Win32_SecurityDescriptor
  • Befüllen des Win32_SecurityDescriptor-Objekts mit einer Discretionary Access Control List (DACL)
  • Zusammenbauen der DACL aus einzelnen Rechteeinträgen (Access Control Entries – ACE), also Instanzen von Win32ACE

Programmcodebeispiele PowerShell-Skript

##########################################

New-Share (with Permissions)

(C) Dr. Holger Schwichtenberg

##########################################

Parameters

$Computer = "."
$ShareName = "Kunden"
$Pfad = "g:\Daten\Kunden"
$Comment = "Alle unsere Kundenkorrespondenz"

Constants

$SHARE_READ = 1179817
$SHARE_CHANGE = 1245462
$SHARE_FULL = 2032127
$SHARE_NONE = 1

$ACETYPEACCESSALLOWED = 0
$ACETYPEACCESSDENIED = 1
$ACETYPESYSTEMAUDIT = 2

$ACEFLAGINHERITACE = 2
$ACEFLAGNO_PROPAGATE_INHERITACE = 4
$ACEFLAGINHERIT_ONLYACE = 8
$ACEFLAGINHERITEDACE = 16
$ACEFLAGVALID_INHERITFLAGS = 31
$ACEFLAGSUCCESSFULACCESS = 64
$ACEFLAGFAILEDACCESS = 128

Get Trustee

function New-Trustee($Domain, $User)
{
$Account = new-object system.security.principal.ntaccount("itv\hs")
$SID = $Account.Translate([system.security.principal.securityidentifier])
$useraccount = [ADSI] ("WinNT://" + $Domain + "/" + $User)
$mc = [WMIClass] "Win32_Trustee"
$t = $MC.CreateInstance()
$t.Domain = $Domain
$t.Name = $User
$t.SID = $useraccount.Get("ObjectSID")
return $t
}

Create ACE

function New-ACE($Domain, $User, $Access, $Type, $Flags)
{
$mc = [WMIClass] "Win32_Ace"
$a = $MC.CreateInstance()
$a.AccessMask = $Access
$a.AceFlags = $Flags
$a.AceType = $Type
$a.Trustee = New-Trustee $Domain $User
return $a
}

Create SD

function Get-SD
{

$mc = [WMIClass] "Win32_SecurityDescriptor"
$sd = $MC.CreateInstance()
$ACE1 = New-ACE "ITV" "HP" $SHAREREAD $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERITACE
$ACE2 = New-ACE "ITV" "HS" $SHAREFULL $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERITACE
$ACE3 = New-ACE "ITV" "Produktmanagement" $SHAREFULL $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERITACE
[System.Management.ManagementObject[]] $DACL = $ACE1 , $ACE2, $ACE3

$sd.DACL = $DACL
return $sd
}

before

"Vorher:"
Get-WmiObject Win32_Share -Filter "Name='$ShareName'"

get-WmiObject Win32Share -Filter "Name='$ShareName'" | foreach-object { $.Delete() }

Win32_Share anlegen

$MC = [WMIClass] "ROOT\CIMV2:Win32_Share"
$Access = Get-SD
$R = $mc.Create($pfad, $Sharename, 0, 10, $Comment, "", $Access)

if ( $R.ReturnValue -ne 0) { Write-Error "Fehler beim Anlegen: "+ $R.ReturnValue; Exit}
"Freigabe wurde angelegt!"

after

"Nachher:"

get-WmiObject Win32Share -Filter "Name='$ShareName'" | foreach { $.GetAccessMask() } | gm

 

Querverweise

 Definition '.NET Framework Class Library'  Verfügbarkeit der Klasse 'System.Management.ManagementObject'  Übersicht über den FCL-Namensraum 'System.Management'  PowerShell Community Portal

Buchtipp

Buchcover Windows PowerShell 5.1 und PowerShell Core 6.1 - Das Praxishandbuch (3. Auflage 12/2018) Kindle Windows PowerShell 5.1 und PowerShell Core 6.1 - Das Praxishandbuch (3. Auflage 12/2018) Kindle
Autoren: Dr. Holger Schwichtenberg
erschienen 2018, 1000 Seiten, 42,99 €
ISBN: 978-3-446-45923-6
Bestellung: Amazon.de oder im Buchhandel über ISBN 978-3-446-45923-6

Beratung & Support:

Schulungen zu diesem Thema:

 Anfrage für eine individuelle Schulung zum Thema PowerShell  Gesamter Schulungsthemenkatalog