###########################################
# Tworzenie grupy udziałów z określonymi uprawnieniami
# (C) dr Holger Schwichtenberg, www.IT-Visions.de
###########################################

# Parametry
$Komputer = "."

# Podprocedury

# Stałe
$SHARE_READ = 1179817
$SHARE_CHANGE = 1245462
$SHARE_FULL = 2032127
$SHARE_NONE = 1

$ACETYPE_ACCESS_ALLOWED = 0
$ACETYPE_ACCESS_DENIED = 1
$ACETYPE_SYSTEM_AUDIT = 2

$ACEFLAG_INHERIT_ACE = 2
$ACEFLAG_NO_PROPAGATE_INHERIT_ACE = 4
$ACEFLAG_INHERIT_ONLY_ACE = 8
$ACEFLAG_INHERITED_ACE = 16
$ACEFLAG_VALID_INHERIT_FLAGS = 31
$ACEFLAG_SUCCESSFUL_ACCESS = 64
$ACEFLAG_FAILED_ACCESS = 128

# Pobieranie użytkownika
function New-Trustee($Domena, $Użytkownik)
{
$Konto = new-object system.security.principal.ntaccount("pawelkor")
$SID = $Konto.Translate([system.security.principal.securityidentifier])
$konto_użytkownika = [ADSI] ("WinNT://" + $Domena + "/" + $Użytkownik)
$mc = [WMIClass] "Win32_Trustee"
$t = $MC.CreateInstance()
$t.Domain = $Domena
$t.Name = $Użytkownik
$t.SID = $konto_użytkownika.Get("ObjectSID")
return $t
}

# Tworzenie ACE
function New-ACE($Domena, $Użytkownik, $Dostęp, $Typ, $Znaczniki)
{
$mc = [WMIClass] "Win32_Ace"
$a = $MC.CreateInstance()
$a.AccessMask = $Dostęp
$a.AceFlags = $Znaczniki
$a.AceType = $Typ
$a.Trustee = New-Trustee $Domena $Użytkownik
return $a
}

# Tworzenie deskryptora zabezpieczeń
function Get-SD
{

$mc = [WMIClass] "Win32_SecurityDescriptor"
$sd = $MC.CreateInstance()
$ACE1 = New-ACE "E01" "Kierownictwo" $SHARE_READ `
  $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERIT_ACE
$ACE2 = New-ACE "E01" "Sprzedaż" $SHARE_FULL $ACETYPE_ACCESS_ALLOWED `
  $ACEFLAG_INHERIT_ACE
$ACE3 = New-ACE "E01" "KierownicyProduktów" $SHARE_FULL `
  $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERIT_ACE
[System.Management.ManagementObject[]] $DACL = $ACE1 , $ACE2, $ACE3

$sd.DACL = $DACL
return $sd
}

Function New-Share($Komputer, $NazwaUdziału, $Ścieżka, $Komentarz, $Dostęp)
{
# Info
"Tworzenie udziału $NazwaUdziału dla ścieżki $Ścieżka..."

# Usuń, jeżeli istnieje
Get-WmiObject Win32_Share -ComputerName $Komputer –Filter `
  "Name='$NazwaUdziału'" | foreach {
  Write-Warning "Usuwanie istniejącego udziału $($_.Name)..."
  $_.Delete()
}

# Tworzenie obiektu Win32_Share
$MC = [WMIClass] "ROOT\CIMV2:Win32_Share"
$Dostęp = Get-SD
$R = $mc.Create($Ścieżka, $NazwaUdziału, 0, 10, $Komentarz, "", $Dostęp)

# Wynik
if ( $R.ReturnValue -ne 0) { Write-Error ("Błąd przy tworzeniu udziału: " +
$R.ReturnValue); Exit}
"Udział został utworzony!"
}

# Pobieranie pliku XML
$doc = [xml] (Get-Content -Path udziały.xml)
$udziały = $doc.SelectNodes("//Udział")

# Pętla
foreach ($udział in $udziały)
{
New-Share $Komputer $udział.Nazwa $udział.Ścieżka $udział.Opis
}
