fredag 25 november 2011

Egna menyval i ADUC (Active Dirtectory Users and Computers)

Ett sätt att förenkla exekveringen av ps-skript i ett ou(organizationalunit) exempelvis är att använda "DisplaySpecifiers". Jag har jobbat med ett uppdrag där vi byggde en rollbaserad rättighets-struktur. Den rollbaserade strukturen krävde många ou, grupper, och gpo(Group Policy Objects). Vi valde då att skapa menyval när administratörer högerklickar på ett ou i ADUC. ADUC skickar med sökvägen till de aktuell ou:t och jag använder de i skripten nedan.



I exemplet nedan startar jag en powershell promt i aktuellt ou. Detta exempel kräver Powershell 2.0 och möjligheten att använda moduler.


Använd ADSIedit.msc och och öppna

CN=organizationalUnit-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=Lab,DC=local
Nyckel : adminContextMenu
 * 409 engelska
 * 41d svenska


Lägg till en ny rad med ditt skript.
4,PS i detta OU,PS-Here.cmd

Strängen är uppdelad i tre delar.
  1. Nummer för sorteringen på menyn.
  2. Namnet som kommer synas på menyn.
  3. Namnet på de som kommer exekveras.
CMD-filen ska ligga system32 katalogen. Jag valde att starta en cmd-fil och bifoga den variabeln till ps-skriptet. Cmd filen innehåller endast en rad som som startar powershell och bifogar path-variabeln.


Exempel på cmd-filen: C:\Windows\System32\PS-Here.cmd


@echo off
PowerShell.exe -NoExit -File "C:\Skript\ps-here.ps1" %1


Exempel på ps-filen: C:\Skript\ps-here.ps1

Import-Module ActiveDirectory
$sPath = $args[0]
$sPath = $sPath.Substring($sPath.LastIndexOf("/")+1)
$sPath = "AD:\\" + $sPath
cd $sPath


Domänpartitionen måste synkroniseras och ADUC måste startas om innan menyerna syns.
Detta är endast ett exempel på vad som skulle kunna exekveras. I mitt fall har jag skapat flera olika funktioner kopplade till ou-strukturen. Lycka till.

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