fredag 18 november 2011

Uppdatera rättigheter på underkataloger.

Orsak: De finns ingen ändra rättighet på en katalog som ger möjligheten att byta namn. För ett namnbyte krävs två rättigheter.

1. "Delete" på katalogen som ska byta namn
2. "Create" på  överordnad katalog.

Att kunna uppdatera ACL:er på en katalog eller som i detta fallet alla underkataloger på ett share, är en enkel uppgift med detta Powershellskriptet. I detta fallet som jag arbetade med gällde de hemkataloger och därför kunde jag inte använda arv av säkerhetsskäl.

Uppgift: Ett konto ska ha en rättighet på alla underkataloger utan att slå på arv.

När jag första gången körde skriptet märkte jag att de kontot som användes inte hade rättigheter till alla underkataloger. Jag använde "Try & Catch" för att fånga felen och i mitt fall kommer jag hantera dom katalogerna som inte lyckats senare.

Referens:
http://technet.microsoft.com/en-us/library/ff730951.aspx

 

Skript:


$ScriptPath = $MyInvocation.MyCommand.Path
$ScriptDir = split-path -parent $ScriptPath
$ScriptName = [system.io.path]::GetFilenameWithoutExtension($ScriptPath)
$sShare = file://filesrv01/homefolder$/usr

# Skapar ACE-objekt
$colRights = [System.Security.AccessControl.FileSystemRights]"Delete"
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
$objType =[System.Security.AccessControl.AccessControlType]::Allow
$objUser = New-Object System.Security.Principal.NTAccount("domain\user")
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule _
($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType)

# Skapar Arrayer för loggning av resultat.
$FolErr = @()
$FolOK = @()

# Lista endast underkataloger och uppdaterar rättigheterna på dom.
Get-ChildItem $share | Where {$_.psIsContainer -eq $true} | foreach {
try {
  $FolderName = $_.name
  $objACL = $_ | Get-ACL
  $objACL.AddAccessRule($objACE)
  $_ | Set-Acl -AclObject $objACL
  $FolOK += $_.name
  }

# Fångar dom katalogerna som jag inte får läsa rättigheterna på.
catch [UnauthorizedAccessException]
  {
  "De gick inte att läsa rättigheterna på $FolderName"
  $FolErr += $FolderName
  }
}

# Bygger namn och sökväg till logfilerna.
$sshareName = $sShare.Split("\")[3]
$errfileName = "$ScriptDir\$sshareName" + "_Err.txt"
$okFileName = "$ScriptDir\$sshareName" + "_OK.txt"

# Summerar kataloger som är rättade och vilka som inte lyckats.
$FolErr | out-file -FilePath $errfileName
$FolOK | out-file -FilePath $okFileName

Inga kommentarer:

Skicka en kommentar