Tags

Howto (51) Free Software (35) Powershell (33) Windows Server (23) AD (16) Hyper-V (16) Exchange (13) Office (13) Group Policy (10) Windows Server 2012 (9) Scripts (7) Symantec BE (5) Windows 8 (5) Cisco (4) TMG (4) Terminal Server (4) Cluster (3) HP (3) RDS (3) UAG (3) Citrix (2) DC (2) DNS (2) IE10 (2) OpenID (2) PKI (2) SCVMM (2) Windows Live (2) iLO (2) Backup (1) DPM (1) Fileserver (1) IE (1) SQL; DPM (1) Security (1) Sharepoint (1) Switch (1) VMWare (1) Veeam (1)

woensdag 25 januari 2012

Manage shadow groups met Powershell

Soms wil je rechten geven op resources aan gebruikers in een bepaalde OU of je wilt gebruikers in een bepaalde OU een fine grained password policy meegeven.
In Microsoft Active Directory kun je aan OUs geen access permissions verlenen. Je zult dan een zogenoemde Shadow Group moeten aanmaken.
Een Shadow Group is een AD Security Group die je plaatst in de betreffende OU waar je access permissions op wilt verlenen.
De naam van de Security Group komt overeen met de naam van de OU. Verder worden alle objecten die in de OU staan toegevoegd aan deze Security Group.

Het beheren van deze Shadow Group is natuurlijk een kriem omdat je objecten die naar een andere OU worden verplaatst handmatig uit deze Security Group moet halen en nieuwe objecten handmatig moeten worden toegevoegd.

Het beste alternatief daarop is om een gebruik te maken van een Powershell script en deze te schedulen zodat elke dag om de zoveel uur wordt uitgevoerd.

Stap 1:

Maak op bijvoorbeeld een DC een tekst bestand aan. Zeg “C:\PSScripts\update-shadowgroup.ps1”. Kopieer vervolgens onderstaande Powershell functie naar dat ps1 bestand.

function Update-ShadowGroup {
<#
.SYNOPSIS
   Updates a shadow group membership based on the user or computer objects within an ou
.DESCRIPTION
   Better description
.NOTES
   Function Name : Update-ShadowGroup
   Author : Adam Stone
   Requires : PowerShell V2 with AD management pack
.LINK
  
http://adadmin.blogspot.com/
.EXAMPLE
   Simple usage
   PS C:\> Update-ShadowGroup -ou "OU=ShadowOU,OU=Test,DC=domain,DC=com" -group shadowgroup
.EXAMPLE
   Simple usage
   PS C:\> Update-ShadowGroup "OU=ShadowOU,OU=Test,DC=domain,DC=com" shadowgroup
.EXAMPLE
   Specify SearchScope
   PS C:\> Update-ShadowGroup "OU=ShadowOU,OU=Test,DC=domain,DC=com" shadowgroup -searchscope Subtree
.EXAMPLE
   Specify name filter
   PS C:\> Update-ShadowGroup "OU=ShadowOU,OU=Test,DC=domain,DC=com" shadowgroup -name srv*
.PARAMETER OU
   DN of the OU - required
.PARAMETER Group
   Name of the Group - required
.PARAMETER Name
   Search pattern to match for the object name
.PARAMETER SearchScope
   Can be either "Base" "OneLevel" or "Subtree" - default OneLevel
#>
param (
   [Parameter(Position=0, Mandatory=$true,HelpMessage="Enter the DN of the OU (eg ou=test,dc=domain,dc=com)")]
   [string] $ou = ""
   ,
   [Parameter(Position=1, Mandatory=$true,HelpMessage="Enter the name of the group (eg group1)")]
   [string] $Group = ""
   ,
   [Parameter(Mandatory=$false)]
   #valadate the input against defined set of attributes
   [string] $name = "*"
   ,
   [Parameter(Mandatory=$false)]
   #valadate the input against defined set of attributes
   [validateset("Base","OneLevel","Subtree")]
   [string] $searchscope = "OneLevel"
)
#the processes the function will complete
process {
   try{
      $getOU = Get-ADOrganizationalUnit $ou
   }
   catch {
      write-error -message "OU $ou does not exist" -RecommendedAction "Make sure the OU is spelt correctly and try again" ;break
   }
   try{
      $getgroup = get-adgroup $group
   }
   catch {
      write-error -message "Group $group does not exist" -RecommendedAction "Make sure the Group name is spelt correctly and try again" ;break
   }
   $objects = $(get-adobject -SearchBase $OU -SearchScope $searchscope -filter {((ObjectCategory -eq "user") -or (ObjectCategory -eq "computer")) -and (name -like $name)})
   $groupmembers = Get-ADGroupMember -Identity $Group
   If ($objects -eq $null -and $groupmembers -eq $null){break}
   If ($objects -eq $null){remove-adgroupmember -identity $group -member $groupmembers -confirm:$false;write-host "$OU was empty, all objects removed"}
   If ($groupmembers -eq $null){
add-adgroupmember -identity $group -member $objects;write-host "$group was empty, all objects added"
   }Else{
      switch (Compare-Object -ReferenceObject $groupmembers -DifferenceObject $objects -property name){
         {$_.SideIndicator -eq "=>"} {add-adgroupmember -identity $group -member $(get-adobject -LDAPFilter "(name=$($_.name)*)"); write-host "$($_.name) added to $group"}
         {$_.SideIndicator -eq "<="} {remove-adgroupmember -identity $group -member $(get-adobject -LDAPFilter "(name=$($_.name)*)") -confirm:$false; write-host "$($_.name) removed from $group"}
      }
   }
}
}#end function

Stap 2:

Maak vervolgens een extra ps1 (update-shadowgroups.ps1) bestand aan en plak daar onderstaande code in:

Import-Module ActiveDirectory
. C:\PSScripts\update-shadowgroup.ps1
update-shadowgroup "OU=Sales,DC=domein,DC=local" Sales
update-shadowgroup "OU=Finance,DC=domein,DC=local" Finance

Deze code zorgt ervoor dat de shadow group Sales en Finance worden bijgewerkt.
Let op het script heeft wel de Powershell module ActiveDirectory nodig om deze acties uit te voeren.

Test:

Maak twee OUs aan: Sales en Finance en plaats daar een aantal gebruikers aan.
Voer vervolgens het script (update-shadowgroups.ps1) uit.

Hieronder een screenshot nadat ik de gebruiker “Verkoper 3” had verplaatst van de OU Sales naar de OU Finance.
Zoals je ziet wordt deze gebruiker automatisch uit de Security Group Sales verwijderd en toegevoegd aan de Security Group “Finance”


Stap 3:

Maak een nieuwe taak aan in Task Scheduler.
Op het "Actions" tabblad "Start a program" en geef daar bij Settings op dat het volgende Program/script moet worden uitgevoerd:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Bij "Add arguments (optional)" voer je in wat powershell moet uitvoeren:

c:\PSScripts\update-shadowgroups.ps1 -noprofile -Noninteractive

Hieronder een link naar het blog van de maker van de manage-shadowgroup funtie:

Krijg niet de volledige of juiste resulaten bij een LDAP query

Dit kan komen doordat de LDAP query niet juist is.
Echter kwam ik erachter dat er bij een bepaalde applicatie niet de juiste / volledige resultaten werden getoont bij het uitvoeren van de LDAP query.
Als je vervolgens ook niet echt inzicht hebt in wat die applicatie precies uitvoert dan is troubleshooten lastig.
De oorzaak van het probleem was dat in een OU van de AD meer dan 1000 gebruikers stonden.

Doordat de MaxPageSize op 1000 staat krijg je dus niet alle resultaten.

Je kunt kijken wat de waarde is van MaxPageSize door mbv ntdsutil connectie te maken met een dc en daar de waarde op te vragen van de LDAP policies.

Zie onderstaande afbeelding:




Om het probleem op te lossen kun je:

Ø  Je kunt de MaxPageSize aanpassen.

Ø  De LDAP query aanpassen zodat deze minder dan 1000 resultaten hoeft te geven.

Houd er rekening mee dat de LDAP query die je uitvoert  ook geldt voor de onderliggende OU’s.
Je kunt dus de query opbreken door de searchbase aan te passen en echt specifieke OU’s te selecteren die minder dan 1000 gebruikers hebben.
Je kunt ook LDAP attributen gebruiken en alleen de gebruikers selecteren die beginnen met een bepaalde achternaam.



donderdag 12 januari 2012

Failed to open disk scsi0:0; Unsupported and/or invalid disk type 7

Deze foutmelding van VMWare kreeg toen ik de VM wilde opstarten die ik net had aangemaakt.
Deze nieuwe virtuele machine had ik aangemaakt waarbij gebruik had gemaakt van een bestaande VMDK.

Deze VMDK behoorde tot een VM type 7 die mbv Symantec Backup Exec 2010 R3 (Windows Server 2003 VM) naar disk was gebackuped.

Na de VMDK mbv vmkfstools te hebben gekloond met de optie zeroedthick kon ik deze VM wel gewoon opstarten.





maandag 9 januari 2012

Cluster Validation Fails on SCSI-3 Persistent Reservation


Bij het opzetten van een OTA omgeving op basis van Hyper-V kregen we een foutmelding tijdens de Cluster Validation.

De oplossing was om in de EVA Command View het besturingsysteem te wijzigen van de hosts die de vDisk gepresenteerd hebben.
Het besturingssysteem dient gewijzigd te worden in “custom” met waarde hex “00000004198009A8”

Met dank aan:





woensdag 4 januari 2012

Office365 MoveRequests opschonen

Om een mailbox na een (mislukte) move actie opnieuw te moven, moet je eerst de Move Request eerst verwijderen.
Je kunt dit doen via de GUI of via Powershell:



Het Powershell commando om alle mislukte moveacties te verwijderen is:

Get-MoveRequest -MoveStatus Failed | Remove-MoveRequest

maandag 2 januari 2012

Outlook performance

Indien je gebruik maakt van een Outlook/Exchange omgeving, dien je om de performance te waarborgen rekening te houden met het aantal items in een folder.

Veel hangt af van je Exchange omgeving, echter kun je de volgende vuistregels aanhouden:
  • Zorg dat er niet meer dan 3 a 5 duizend items in één folder staan.
    • De kalender en deleted items zijn ook gewoon een folder.
  • Je kunt meerdere subfolders aanmaken als je meer items wilt opslaan, echter zorg dat je niet meer dan 3 folders diep gaat.
Zie ook: http://support.microsoft.com/kb/905803