Leistungen
Leistungen
Überblick
Leistungsangebot
Kernkompetenzen
Schulungsthemen
In-House-Schulungen
Offene .NET-Seminare
Offene WPS-Seminare
Beratung
Coaching
Support
Softwareentwicklung
Entwickler-Vermittlung
.NET/Visual Studio
TFS/ALM/Scrum
Webprogrammierung
PowerShell
Konditionen
Anfrage/Kontakt
Beratung/Coaching
Beratung/Coaching
Beratungsthemen
Coaching
Unsere Berater
Referenzkunden
Konditionen
Angebotsanfrage
In-House-Schulungen
In-House-Schulungen
Überblick
Themen/Fachgebiete
Schulungskonfigurator
Konzepte
.NET/Visual Studio
C#
VB.NET
ASP.NET
Moderne Webanwendungen
TFS/ALM/Scrum
PowerShell
Konferenzvortraege
Referenzkunden
Unsere Trainer
Konditionen
Angebotsanfrage
Offene Schulungen
Offene Schulungen
Überblick .NET-Seminare
.NET/C#-Basisseminar
WPF (Desktop)
ASP.NET/AJAX (Web)
WCF/WF (SOA)
ADO.NET/EF (Data)
Windows PowerShell
.NET, C#, VB, Visual Studio
.NET, C#, VB, Visual Studio
Startseite
Beratung/Training
Offene .NET-Seminare
Einführung
Lexikon
Artikel
Bücher
Klassenreferenz
Programmiersprachen
Entwicklerwerkzeuge
Softwarekomponenten
World Wide Wings Demo
Codebeispiele
Scripting
ASP.NET
.NET 2.0
.NET 3.0/3.5
.NET 4.0/4.5
Community
Forum
Kommerzielle Leistungen
ASP.NET
ASP.NET
Startseite
Lexikon
Sicherheit
Konfiguration
Global.asax
Tracing
Technische Beiträge
Klassenreferenz
Programmiersprachen
Entwicklerwerkzeuge
Softwarekomponenten
PowerShell
PowerShell
Überblick
Beratung
In-House-Schulungen
Öffentliche Schulungen
Codebeispiele
Commandlet Extensions
Offene PowerShell-Seminare
Inhouse-Seminare
Windows
Windows
Startseite
Windows Runtime (WinRT)
Windows PowerShell
Windows Scripting
Windows-Schulungen
Windows-Lexikon
Windows-Forum
Windows Scripting
Windows Scripting
Startseite
Lexikon
FAQ
Buecher
Architektur
Skriptsprachen
Scripting-Hosts
Scripting-Komponenten
COM/DCOM/COM+
ADSI
WMI
Scripting-Tools
WSH-Editoren
Codebeispiele
ASP.NET
.NET-Scripting
Forum
Links
Kommerzielle Leistungen
Service
Service
Website-FAQ
Anmeldung/Login
Leser-Registrierung
Gast-Registrierung
Nachrichten/RSS
Newsletter
Foren
Weblog
Lexikon
Downloads
Support
Kontakt
Literaturtipps
Publikationen
Publikationen
Redaktionsbüro
Bücher
Fachartikel
Leser-Portal
Autoren gesucht!
Rezensionen
Über uns
Über uns
Holger Schwichtenberg
Team
Referenzkunden
Kundenaussagen
Referenzprojekte
Partner
Site Map
Weitere Websites
Tag Cloud
Impressum
Rechtliches

Dateisystemfreigabe anlegen anhand einer XML-Eingabedatei (mit Berechtigungen)
Codebeispiel für Windows PowerShell-Pipeline und Sonstige Sprache

Liste aller Codebeispiele

Dateisystemfreigabe anlegen anhand einer XML-Eingabedatei (mit Berechtigungen)

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

Autor: Dr. Holger Schwichtenberg 

Beschreibung

Häufig möchte man zahlreiche Freigaben "in einem Rutsch" anlegen. Das PowerShell-Skript dient dazu, eine XML-Datei auszulesen und die Freigaben anzulegen. Dabei wird zunächst die XML-Datei mit Get-Content eingelesen. Der Dateiinhalt wird dann in den eingebauten PowerShell-Datentyp [XML] konvertiert, wodurch eine Instanz der .NET-Klasse System.Xml.XmlDocument ensteht. Mit der Methode SelectNodes() erfolgt dann der Zugriff auf die in dem Dokument enthaltenen <Share>-Knoten. Die PowerShell kapselt durch den eingebauten XML-Adapter die einzelnen Knoten so, dass die Unterknoten als Attribute der PowerShell-Varianlen (hier: $Share) erscheinen. Mit diesen Daten wird dann die Methode Create() der WMI-Klasse Win32_Share gefüttert, wobei diese Aufgaben inklusive des vorherigen Löschens einer eventuell vorhandenen gleichnamigen Freigabe hier in einer Unterroutine (New-Share) gekapselt sind.

Programmcodebeispiele Windows PowerShell-Pipeline

###########################################
# Create a bunch of shares with permissions
# (C) Dr. Holger Schwichtenberg, www.IT-Visions.de
###########################################

# Parameters
$Computer = "."

# Subs

# Constants
$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

# 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" "Geschäftsführung" $SHARE_READ $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERIT_ACE
$ACE2 = New-ACE "ITV" "Vertrieb" $SHARE_FULL $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERIT_ACE
$ACE3 = New-ACE "ITV" "Produktmanagement" $SHARE_FULL $ACETYPE_ACCESS_ALLOWED $ACEFLAG_INHERIT_ACE
[System.Management.ManagementObject[]] $DACL = $ACE1 , $ACE2, $ACE3

$sd.DACL = $DACL
return $sd
}

Function New-Share($Computer,$ShareName, $Path, $Comment, $Access)
{
# Info
"Creating Share $ShareName for $Path..."

# Delete if exists
get-WmiObject Win32_Share -ComputerName $Computer -Filter "Name='$ShareName'" | foreach {
Write-Warning "Deleting existing share $($_.Name)..."
$_.Delete()
}

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

# Result
if ( $R.ReturnValue -ne 0) { Write-Error ("Error creating share: " + $R.ReturnValue); Exit}
"Share was created!"

}

# Get XML file
$doc = [xml] (Get-Content -Path h:\demo\powershell\dateisystem\shares.xml)
$shares = $doc.SelectNodes("//Share")

# Loop
foreach ($share in $shares)
{
New-Share $Computer $share.Name $share.Path $share.description
}

Programmcodebeispiele Sonstige Sprache

<?xml version="1.0" encoding="utf-8"?>
<Shares>
<Share>
  <Path>c:\Daten\Kunden</Path>
  <Name>Kunden</Name>
  <Description>Kundendokumente</Description>
</Share>

<Share>
  <Path>c:\Daten\Projekte</Path>
  <Name>Projekte</Name>
  <Description>Projektdateien</Description>
</Share>

<Share>
  <Path>c:\Daten\Lieferanten</Path>
  <Name>Lieferanten</Name>
  <Description>Lieferanteninformationen</Description>
</Share>

<Share>
  <Path>i:\</Path>
  <Name>Software</Name>
  <Description>Setup-Dateien</Description>
</Share>
</Shares>

Querverweise

Definition '.NET Framework Class Library'
Verfügbarkeit der Klasse 'System'
Übersicht über den FCL-Namensraum 'System'
Portal dotnetframework.de