none
Folder Berechtigung setzen \ Share erstelle Berechtigen RRS feed

  • Frage

  • Hallo Zusammen

    Ich sollte auf div. Systeme neue Folder Berechtigungen setzen und diesen Folder sharen und Berechtigen. Und irgend wie kappt das nicht so.

    Das erste Problem ist die $AdminGroup. Da es mehere Systeme sind, kann die Berechtigung so gesetzt werden?

    Auch mit dem erstellen des share klappt es nicht. Desweiteren sollte ich nachdem der share erstellt worden ist diese share Berechtigen mit div. Groupen.

    Wie kann ich das machne.

    Hier mein Code:

    cls
    Function errMsg($intErr)
    {
       Switch($intErr)
         {
          0 { "Success - Share deleted" }
          2 { "Access denied - Permission?" }
          8 { "Unknown failure" }
          9 { "Invalid name" }
        10 { "Invalid level" }
        21 { "Invalid parameter" }
        22 { "Duplicate share - Already created" }
        23 { "Redirected path" }
        24 { "Unknown device or directory" }
        25 { "Net name not found" }
         DEFAULT { "$intErr has an Unknown value" }
         }
    }
    $Date = get-date
    $computers =  Get-Content c:\Systems\Server.txt
    $ComputerDate = $Computer + "_" + $Date
    # Read the Scriptname
    $myfile = Split-Path -leaf -resolve $MyInvocation.MyCommand.Path;   
    # Transfer 1 Arguments
    if($args.length -ne 1)
    { 
    Write-Warning "Aufruf mit .\$myfile add"
    exit 
    }
    foreach ($Computer in $computers)
    {
    $Path = "\\$Computer\c$\Windows\System32\spool\driver"
    $AddRemove = $args
    # If Variable ADD permission
    If($AddRemove -eq "Add")
        { 
    		
    		$Groups = "Test1\DOMAIN USERS" , "Test2\DOMAIN USERS" , "Test3\DOMAIN USERS" , "Test3\DOMAIN USERS" , "Test4\DOMAIN USERS" , "Test5\DOMAIN USERS"
    		
    		foreach($Group in $Groups)
    		{
            $DirectoryPath = $Path
            $IdentityRef = $Group
    		
    		
            $FileSystemRights = [System.Security.AccessControl.FileSystemRights]::Read
            $InheritanceFlag1 = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
            $InheritanceFlag2 = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
            $InheritanceFlag = $InheritanceFlag1 -bor $InheritanceFlag2
            $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
            $AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
            $User = New-Object System.Security.Principal.NTAccount($Group)	
            $ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($User, $FileSystemRights,$InheritanceFlag, $PropagationFlag, $AccessControlType)
            $ACL = Get-ACL $Path
            $ACL.AddAccessRule($ACE)
            Set-ACL $Path $ACL
    		
    		Write-Host "Folder Berechtigung gesetzt $Computer $Group"
    				
    		}
    		$AdminGroup = "$Computer\ADMINISTRATORS"
    		
            $DirectoryPath = $Path
            $IdentityRef = $AdminGroup
    		
    		$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"Write,Read,Modify"
            $InheritanceFlag1 = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
            $InheritanceFlag2 = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
            $InheritanceFlag = $InheritanceFlag1 -bor $InheritanceFlag2
            $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
            $AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
            $User = New-Object System.Security.Principal.NTAccount($AdminGroup)	
            $ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($User, $FileSystemRights,$InheritanceFlag, $PropagationFlag, $AccessControlType)
            $ACL = Get-ACL $Path
            $ACL.AddAccessRule($ACE)
            Set-ACL $Path $ACL
    		
    		Write-Host "Folder Berechtigung gesetzt $Computer $AdminGroup"
    		   
    # Check Printer Share
    	$share = Get-WMIObject -Class Win32_Share -Computer $Computer -Filter "Name='print$'"
    		if($share) 
    		{
    			write-host -ForegroundColor Green "$Computer Share exists "
    			Write-Host -ForegroundColor White "Delete Temp Share $server"
    			
    			$share = get-wmiobject -computer $Computer -class win32_share | where-object { $_.name -eq "print$" } | foreach-object  { $_.delete() }
    			errMsg($share.returnValue)
    			
    			write-host -ForegroundColor Green "Create print$ share folder $Computer"
    			
    			$share.create("\\$Computer\c$\Windows\System32\spool\driver", "print$", 0)
    							
    		}
    		else 
    		{
    			write-host -ForegroundColor Red "$Computer Share not found"
    			
    			write-host -ForegroundColor Green "Create print share folder $Computer"
    					
    			$share.create("\\$Computer\c$\Windows\System32\spool\driver", "print$", 0)
    			
    		}
        
    	}
    }

    Vielen dank für eure Hilfe

    Grüsse

    Mittwoch, 24. April 2013 13:42

Antworten

  • Computer ACE und ACL benutzen zum Identifizieren von Accounts: Security Identifier Nummern (SID)! siehe: http://de.wikipedia.org/wiki/Security_Identifier
    Diese werden nur für den Menschen in lesbare Namen umgewandelt, Computer nutzen Immer die SID!
    Deshalb kann man einen User oder eine Gruppe auch umbenennen, ohne dass die Berechtigungen verloren gehen (solange die SID gleich bleibt!).

    Beim Installieren von Windows werden sogenannte well-known SID vergeben, die auf jedem System gleich sind.
    Zum Beispiel für die Gruppe der lokalen Computer Administratoren ist die SID IMMER: S-1-5-32-544.
    Dies behebt das Problem, das die Gruppe der Administratoren International andere Namen hat.
    Auf einem Englischen Windows heißt die Gruppe "Administrators" auf einem deutschen System heißt die Gruppe "Administratoren" und auf einem Spanischen System heisst die Gruppe Administratores.
    Deshalb geht der Zugriff über den Namen auf diese Gruppe, in Internationalen Umgebungen schief!
    Besser ist es die SID zu benutzen, die IMMER gleich ist!
    Möchte man den Namen der Gruppe herausfinden ist dies ebenfalls über die SID möglich.

    # Security Principal für die Gruppe der Lokalen Administratoren erstellen
    $LocalAdminGroup = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
    # Anzeigen lassen
    $LocalAdminGroup  | select *
    
    
    # SID in den lesbaren NT Accountnamen umwandeln
    $NTLocalAdminGroup = $LocalAdminGroup.Translate([System.Security.Principal.NTAccount])
    # Anzeigen lassen
    $NTLocalAdminGroup | select *


    Bekannte Sicherheits-IDs in Windows-Betriebssystemen (Well-known SIDs)
    http://support.microsoft.com/kb/243330/de

    Deshalb empfehle ich dir für die Gruppe der Lokalen Administratoren folgenden Code zu benutzen:

    	$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"Write,Read,Modify"
            $InheritanceFlag1 = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
            $InheritanceFlag2 = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
            $InheritanceFlag = $InheritanceFlag1 -bor $InheritanceFlag2
            $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
            $AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
    	$LocalAdminGroup = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
    	$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($LocalAdminGroup, $FileSystemRights,$InheritanceFlag, $PropagationFlag, $AccessControlType)
            $ACL = Get-ACL $Path
            $ACL.AddAccessRule($ACE)
            Set-ACL $Path $ACL


    Um Shares anzulegen gibt es in der PowerShell 3.0 Server 2012 die SMB Cmdlets.
    Mit PowerShell 2.0 würde ich WMI benutzen.
    Hier sind sehr gute einfache Funktionen die du zum Anlegen und zum Berechtigen eines Shares benutzen kannst:
    http://www.designedsystemsonline.com/upload/Create-WMIShare.txt


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Donnerstag, 25. April 2013 06:04
  • Das geht nicht so einfach ;-))

    ##################################
    # Remote ein File Share (SMB) mit WMI erstellen und 
    # Rechte auf diese Share mit WMI vergeben
    # Verschiedene Autoren
    # Remote Erstellung zugefügt von Peter Kriegel
    # 25.April.2013 V1.0
    
    
    ###################################
    # Funktionen Deklarieren
    ##################################
    
    Function New-WMIFileShare {
    # Share Remote erstellen
    # Diese Funktion gibt $True zurück wenn das Share erstellt werden konnte
    # Autor Jeffrey Hicks
    # http://poshcode.org/935
    
        Param([string]$ComputerName=$env:computername,
              [string]$Path=$(Throw "Kompletten relativen Pfad  auf dem ZielRechner Angeben! (z.B. C:\temp)"),
              [string]$ShareName=$(Throw "Der Name des neuen Shares muss angegeben werden!"),
              [string]$Description,
              [Uint32]$MaxConnections = [Uint32]::MaxValue
              )
              
        $FILE_SHARE = 0
    
        #undescription this next line for debugging
    #     Write-Host ("Creating share {0} for {1} on {2} ({3})" -f $ShareName,$Path,$ComputerName,$Description) -fore Green
        
        # wir holen uns die Klasse vom Ziel-Server !
        [wmiclass]$WmiShare="\\$ComputerName\root\cimv2:win32_share"
        
        # Share anlegen
        $ShareResult = $WmiShare.Create($Path,$ShareName,$FILE_SHARE,$MaxConnections,$Description)
        
        Switch ($ShareResult.returnvalue) {
            0 {$rvalue = "Success"}
            2 {$rvalue = "Access Denied"}     
            8 {$rvalue = "Unknown Failure"}     
            9 {$rvalue = "Invalid Name"}     
            10 {$rvalue = "Invalid Level"}     
            21 {$rvalue = "Invalid Parameter"}     
            22 {$rvalue = "Duplicate Share"}     
            23 {$rvalue = "Redirected Path"}     
            24 {$rvalue = "Unknown Device or Directory"}
            25 {$rvalue = "Net Name Not Found"}
        }
        
        if ($ShareResult.returnvalue -ne 0) {
            Write-Warning ("Failed to create share {0} for {1} on {2}. Error: {3}" -f $ShareName,$Path,$ComputerName,$rvalue) 
            return $False
        }
        else {
            return $True
        }
    }
    
    
    function New-WMITrustee{
    # AUTHOR: James Vierra , Designed Systems & Services
    # DATE  : 3/13/2009
    # http://www.designedsystemsonline.com/upload/Create-WMIShare.txt
    
        param (
            [string]$ComputerName=$env:computername,
            [string]$NTAccount
        )
    
        $user = New-Object System.Security.Principal.NTAccount($NTAccount)
        $strSID = $user.Translate([System.Security.Principal.SecurityIdentifier])
        $sid = New-Object security.principal.securityidentifier($strSID) 
        [byte[]]$ba = ,0 * $sid.BinaryLength     
        [void]$sid.GetBinaryForm($ba,0) 
        
        $Trustee = ([WMIClass]"\\$ComputerName\root\cimv2:Win32_Trustee").CreateInstance() 
        $Trustee.SID = $ba
        $Trustee
        
    }
    
    
    Function New-WMIAce {
    # AUTHOR: James Vierra , Designed Systems & Services
    # DATE  : 3/13/2009
    # http://www.designedsystemsonline.com/upload/Create-WMIShare.txt
    
        param (
            [string]$ComputerName=$env:computername,
            [string]$NTAccount,
            [string]$Rights="Read"
        )
    
        $trustee = New-WMITrustee -Computername $ComputerName -NTAccount $NTAccount
        $ace = ([WMIClass]"\\$ComputerName\root\cimv2:Win32_ace").CreateInstance() 
        $ace.AccessMask = [System.Security.AccessControl.FileSystemRights]$rights 
        Write-Host $ace.AccessMask
        $ace.AceFlags = 0 # set inheritances and propagation flags
        $ace.AceType = 0 # set SystemAudit 
        $ace.Trustee = $trustee 
        $ace
    }
    
    
    Function Set-WMIShareACL
     {
    
    # AUTHOR: James Vierra , Designed Systems & Services
    # DATE  : 3/13/2009
    # http://www.designedsystemsonline.com/upload/Create-WMIShare.txt
    
        param (
        [string]$ComputerName=$env:computername,
        [string]$ShareName,
        $ace    
        )
    
        $wPrivilege = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -ComputerName $ComputerName -Filter "name='$ShareName'" 
        $wPrivilege.psbase.Scope.Options.EnablePrivileges = $true 
        $oldDACL = ($wPrivilege.GetSecurityDescriptor()).Descriptor.DACL 
        $sd = ([WMIClass]"\\$ComputerName\root\cimv2:Win32_SecurityDescriptor").CreateInstance() 
        $sd.DACL = $oldDACL #copy
        $sd.DACL += @($ace.psobject.baseobject) # append
        $sd.ControlFlags="0x4" # set SE_DACL_PRESENT flag 
        $wPrivilege.SetSecurityDescriptor($sd)
        
    }
    
    
    Function Get-WMISharePermissions
    {
    # Author Hugo Peeters
    # http://www.peetersonline.nl/wp-content/get-mysharepermissions.txt
    	
        param(
            [string]$ComputerName=$env:computername,
            [string]$ShareName
        )
    
    	$ShareSec = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -ComputerName $computername -Filter "name='$ShareName'"
    	ForEach ($Share in $ShareSec)
    	{
    		$SecurityDescriptor = $Share.GetSecurityDescriptor()
    		$myCol = @()
    		ForEach ($DACL in $SecurityDescriptor.Descriptor.DACL)
    		{
    			$myObj = "" | Select Domain, ID, AccessMask, AceType
    			$myObj.Domain = $DACL.Trustee.Domain
    			$myObj.ID = $DACL.Trustee.Name
    			Switch ($DACL.AccessMask)
    			{
    				2032127 {$AccessMask = "FullControl"}
    				1179785 {$AccessMask = "Read"}
    				1180063 {$AccessMask = "Read, Write"}
    				1179817 {$AccessMask = "ReadAndExecute"}
    				-1610612736 {$AccessMask = "ReadAndExecuteExtended"}
    				1245631 {$AccessMask = "ReadAndExecute, Modify, Write"}
    				1180095 {$AccessMask = "ReadAndExecute, Write"}
    				268435456 {$AccessMask = "FullControl (Sub Only)"}
    				default {$AccessMask = $DACL.AccessMask}
    			}
    			$myObj.AccessMask = $AccessMask
    			Switch ($DACL.AceType)
    			{
    				0 {$AceType = "Allow"}
    				1 {$AceType = "Deny"}
    				2 {$AceType = "Audit"}
    			}
    			$myObj.AceType = $AceType
    			Clear-Variable AccessMask -ErrorAction SilentlyContinue
    			Clear-Variable AceType -ErrorAction SilentlyContinue
    			$myCol += $myObj
    		}
    	}
    	Return $myCol
    }
    
    ##################################
    # Script Startet hier
    ##################################
    
    $Servers =  Get-Content c:\Users\B358634\Systems\Server.txt
    
    ForEach ($Server in $Servers) {
    
    
    ##################################
    # Schritt 1 Share Remote erstellen
    ##################################
    
        New-WMIFileShare -ComputerName $Server -ShareName 'Print$' -Path 'C:\Windows\System32\spool\driver' -Description 'Drucker Freigabe Print$'
    
    
    ####################################
    # Schritt 2 Berechtigungen auf Share
    ####################################
        
        # Ace für den User erstellen
        # Rechte siehe Enum: [System.Security.AccessControl.FileSystemRights] =  http://msdn.microsoft.com/de-de/library/system.security.accesscontrol.filesystemrights.aspx
        $Ace = New-WMIAce -ComputerName $Server -NTAccount 'Domäne\Username' -Rights "Read,ExecuteFile,Synchronize"
        # Share berechtigung mit Hilfe von Ace setzen
        Set-WMIShareACL -Computername $Server -ShareName 'Print$' -Ace $Ace
    
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 25. April 2013 15:20

Alle Antworten

  • Computer ACE und ACL benutzen zum Identifizieren von Accounts: Security Identifier Nummern (SID)! siehe: http://de.wikipedia.org/wiki/Security_Identifier
    Diese werden nur für den Menschen in lesbare Namen umgewandelt, Computer nutzen Immer die SID!
    Deshalb kann man einen User oder eine Gruppe auch umbenennen, ohne dass die Berechtigungen verloren gehen (solange die SID gleich bleibt!).

    Beim Installieren von Windows werden sogenannte well-known SID vergeben, die auf jedem System gleich sind.
    Zum Beispiel für die Gruppe der lokalen Computer Administratoren ist die SID IMMER: S-1-5-32-544.
    Dies behebt das Problem, das die Gruppe der Administratoren International andere Namen hat.
    Auf einem Englischen Windows heißt die Gruppe "Administrators" auf einem deutschen System heißt die Gruppe "Administratoren" und auf einem Spanischen System heisst die Gruppe Administratores.
    Deshalb geht der Zugriff über den Namen auf diese Gruppe, in Internationalen Umgebungen schief!
    Besser ist es die SID zu benutzen, die IMMER gleich ist!
    Möchte man den Namen der Gruppe herausfinden ist dies ebenfalls über die SID möglich.

    # Security Principal für die Gruppe der Lokalen Administratoren erstellen
    $LocalAdminGroup = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
    # Anzeigen lassen
    $LocalAdminGroup  | select *
    
    
    # SID in den lesbaren NT Accountnamen umwandeln
    $NTLocalAdminGroup = $LocalAdminGroup.Translate([System.Security.Principal.NTAccount])
    # Anzeigen lassen
    $NTLocalAdminGroup | select *


    Bekannte Sicherheits-IDs in Windows-Betriebssystemen (Well-known SIDs)
    http://support.microsoft.com/kb/243330/de

    Deshalb empfehle ich dir für die Gruppe der Lokalen Administratoren folgenden Code zu benutzen:

    	$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"Write,Read,Modify"
            $InheritanceFlag1 = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
            $InheritanceFlag2 = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
            $InheritanceFlag = $InheritanceFlag1 -bor $InheritanceFlag2
            $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
            $AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
    	$LocalAdminGroup = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
    	$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($LocalAdminGroup, $FileSystemRights,$InheritanceFlag, $PropagationFlag, $AccessControlType)
            $ACL = Get-ACL $Path
            $ACL.AddAccessRule($ACE)
            Set-ACL $Path $ACL


    Um Shares anzulegen gibt es in der PowerShell 3.0 Server 2012 die SMB Cmdlets.
    Mit PowerShell 2.0 würde ich WMI benutzen.
    Hier sind sehr gute einfache Funktionen die du zum Anlegen und zum Berechtigen eines Shares benutzen kannst:
    http://www.designedsystemsonline.com/upload/Create-WMIShare.txt


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Donnerstag, 25. April 2013 06:04
  • Hallo Peter

    Vielen dank für deine Antwort. Mit den Admin Rechte hat es geklappt.

    Aber mit den Share erstellen klappt es leider immer noch nicht. Ich erhalte immer die Meldung: ReturnCode 9 Invalide Name

    Stimmt etwas mit dem path nicht?

    $server =  Get-Content c:\Users\B358634\Systems\Server.txt
        [string]$name = "print$"
        [string]$path = "\\$server\c$\Windows\System32\spool\driver"
        [string]$description = ""
        [string]$account
        [string]$rights
        [string]$maxallowed = $null
        $share = [wmiclass]"Win32_Share"
        $share.Create( $path, $name, 0, $maxallowed,$description)

    Vielen dank

    Grüsse

    Donnerstag, 25. April 2013 11:45
  • Das geht nicht so einfach ;-))

    ##################################
    # Remote ein File Share (SMB) mit WMI erstellen und 
    # Rechte auf diese Share mit WMI vergeben
    # Verschiedene Autoren
    # Remote Erstellung zugefügt von Peter Kriegel
    # 25.April.2013 V1.0
    
    
    ###################################
    # Funktionen Deklarieren
    ##################################
    
    Function New-WMIFileShare {
    # Share Remote erstellen
    # Diese Funktion gibt $True zurück wenn das Share erstellt werden konnte
    # Autor Jeffrey Hicks
    # http://poshcode.org/935
    
        Param([string]$ComputerName=$env:computername,
              [string]$Path=$(Throw "Kompletten relativen Pfad  auf dem ZielRechner Angeben! (z.B. C:\temp)"),
              [string]$ShareName=$(Throw "Der Name des neuen Shares muss angegeben werden!"),
              [string]$Description,
              [Uint32]$MaxConnections = [Uint32]::MaxValue
              )
              
        $FILE_SHARE = 0
    
        #undescription this next line for debugging
    #     Write-Host ("Creating share {0} for {1} on {2} ({3})" -f $ShareName,$Path,$ComputerName,$Description) -fore Green
        
        # wir holen uns die Klasse vom Ziel-Server !
        [wmiclass]$WmiShare="\\$ComputerName\root\cimv2:win32_share"
        
        # Share anlegen
        $ShareResult = $WmiShare.Create($Path,$ShareName,$FILE_SHARE,$MaxConnections,$Description)
        
        Switch ($ShareResult.returnvalue) {
            0 {$rvalue = "Success"}
            2 {$rvalue = "Access Denied"}     
            8 {$rvalue = "Unknown Failure"}     
            9 {$rvalue = "Invalid Name"}     
            10 {$rvalue = "Invalid Level"}     
            21 {$rvalue = "Invalid Parameter"}     
            22 {$rvalue = "Duplicate Share"}     
            23 {$rvalue = "Redirected Path"}     
            24 {$rvalue = "Unknown Device or Directory"}
            25 {$rvalue = "Net Name Not Found"}
        }
        
        if ($ShareResult.returnvalue -ne 0) {
            Write-Warning ("Failed to create share {0} for {1} on {2}. Error: {3}" -f $ShareName,$Path,$ComputerName,$rvalue) 
            return $False
        }
        else {
            return $True
        }
    }
    
    
    function New-WMITrustee{
    # AUTHOR: James Vierra , Designed Systems & Services
    # DATE  : 3/13/2009
    # http://www.designedsystemsonline.com/upload/Create-WMIShare.txt
    
        param (
            [string]$ComputerName=$env:computername,
            [string]$NTAccount
        )
    
        $user = New-Object System.Security.Principal.NTAccount($NTAccount)
        $strSID = $user.Translate([System.Security.Principal.SecurityIdentifier])
        $sid = New-Object security.principal.securityidentifier($strSID) 
        [byte[]]$ba = ,0 * $sid.BinaryLength     
        [void]$sid.GetBinaryForm($ba,0) 
        
        $Trustee = ([WMIClass]"\\$ComputerName\root\cimv2:Win32_Trustee").CreateInstance() 
        $Trustee.SID = $ba
        $Trustee
        
    }
    
    
    Function New-WMIAce {
    # AUTHOR: James Vierra , Designed Systems & Services
    # DATE  : 3/13/2009
    # http://www.designedsystemsonline.com/upload/Create-WMIShare.txt
    
        param (
            [string]$ComputerName=$env:computername,
            [string]$NTAccount,
            [string]$Rights="Read"
        )
    
        $trustee = New-WMITrustee -Computername $ComputerName -NTAccount $NTAccount
        $ace = ([WMIClass]"\\$ComputerName\root\cimv2:Win32_ace").CreateInstance() 
        $ace.AccessMask = [System.Security.AccessControl.FileSystemRights]$rights 
        Write-Host $ace.AccessMask
        $ace.AceFlags = 0 # set inheritances and propagation flags
        $ace.AceType = 0 # set SystemAudit 
        $ace.Trustee = $trustee 
        $ace
    }
    
    
    Function Set-WMIShareACL
     {
    
    # AUTHOR: James Vierra , Designed Systems & Services
    # DATE  : 3/13/2009
    # http://www.designedsystemsonline.com/upload/Create-WMIShare.txt
    
        param (
        [string]$ComputerName=$env:computername,
        [string]$ShareName,
        $ace    
        )
    
        $wPrivilege = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -ComputerName $ComputerName -Filter "name='$ShareName'" 
        $wPrivilege.psbase.Scope.Options.EnablePrivileges = $true 
        $oldDACL = ($wPrivilege.GetSecurityDescriptor()).Descriptor.DACL 
        $sd = ([WMIClass]"\\$ComputerName\root\cimv2:Win32_SecurityDescriptor").CreateInstance() 
        $sd.DACL = $oldDACL #copy
        $sd.DACL += @($ace.psobject.baseobject) # append
        $sd.ControlFlags="0x4" # set SE_DACL_PRESENT flag 
        $wPrivilege.SetSecurityDescriptor($sd)
        
    }
    
    
    Function Get-WMISharePermissions
    {
    # Author Hugo Peeters
    # http://www.peetersonline.nl/wp-content/get-mysharepermissions.txt
    	
        param(
            [string]$ComputerName=$env:computername,
            [string]$ShareName
        )
    
    	$ShareSec = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -ComputerName $computername -Filter "name='$ShareName'"
    	ForEach ($Share in $ShareSec)
    	{
    		$SecurityDescriptor = $Share.GetSecurityDescriptor()
    		$myCol = @()
    		ForEach ($DACL in $SecurityDescriptor.Descriptor.DACL)
    		{
    			$myObj = "" | Select Domain, ID, AccessMask, AceType
    			$myObj.Domain = $DACL.Trustee.Domain
    			$myObj.ID = $DACL.Trustee.Name
    			Switch ($DACL.AccessMask)
    			{
    				2032127 {$AccessMask = "FullControl"}
    				1179785 {$AccessMask = "Read"}
    				1180063 {$AccessMask = "Read, Write"}
    				1179817 {$AccessMask = "ReadAndExecute"}
    				-1610612736 {$AccessMask = "ReadAndExecuteExtended"}
    				1245631 {$AccessMask = "ReadAndExecute, Modify, Write"}
    				1180095 {$AccessMask = "ReadAndExecute, Write"}
    				268435456 {$AccessMask = "FullControl (Sub Only)"}
    				default {$AccessMask = $DACL.AccessMask}
    			}
    			$myObj.AccessMask = $AccessMask
    			Switch ($DACL.AceType)
    			{
    				0 {$AceType = "Allow"}
    				1 {$AceType = "Deny"}
    				2 {$AceType = "Audit"}
    			}
    			$myObj.AceType = $AceType
    			Clear-Variable AccessMask -ErrorAction SilentlyContinue
    			Clear-Variable AceType -ErrorAction SilentlyContinue
    			$myCol += $myObj
    		}
    	}
    	Return $myCol
    }
    
    ##################################
    # Script Startet hier
    ##################################
    
    $Servers =  Get-Content c:\Users\B358634\Systems\Server.txt
    
    ForEach ($Server in $Servers) {
    
    
    ##################################
    # Schritt 1 Share Remote erstellen
    ##################################
    
        New-WMIFileShare -ComputerName $Server -ShareName 'Print$' -Path 'C:\Windows\System32\spool\driver' -Description 'Drucker Freigabe Print$'
    
    
    ####################################
    # Schritt 2 Berechtigungen auf Share
    ####################################
        
        # Ace für den User erstellen
        # Rechte siehe Enum: [System.Security.AccessControl.FileSystemRights] =  http://msdn.microsoft.com/de-de/library/system.security.accesscontrol.filesystemrights.aspx
        $Ace = New-WMIAce -ComputerName $Server -NTAccount 'Domäne\Username' -Rights "Read,ExecuteFile,Synchronize"
        # Share berechtigung mit Hilfe von Ace setzen
        Set-WMIShareACL -Computername $Server -ShareName 'Print$' -Ace $Ace
    
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 25. April 2013 15:20
  • Ein riesen Script um "nur" ein Share zu erstellen :-)

    Vielen Danke Peter ich werde es nocht Testen.

    Nur noch ein kurze Frage. New-WMIFileShare und New-WMIAce fehlen bei mir. Wie kann ich diese Installieren?

    Vielen dank

    Grüsse

    Freitag, 26. April 2013 07:39
  • Nur noch ein kurze Frage. New-WMIFileShare und New-WMIAce fehlen bei mir. Wie kann ich diese Installieren?

    Schau dir mein Script an!
    Das sind Funktionen die in meinem Script drin sind!
    Funktionen müssen immer zuerst in einem Script ganz oben stehen. Damit sie PowerShell bekannt sind BEVOR PowerShell diese verwenden kann!

    >> Ein riesen Script um "nur" ein Share zu erstellen :-)

    PowerShell hat nur wenige Schwachstellen eine davon sind Shares ;-)
    Aber man kann sich mit PowerShell immer selbst helfen!
    Ich habe noch nichts gesehen was mit PowerShell nicht gehen würde auch wenn es umständlich wird ;-))


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Freitag, 26. April 2013 08:28